Computer in Hindi | Business in Hindi: Data structure
Showing posts with label Data structure. Show all posts
Showing posts with label Data structure. Show all posts

Wednesday, June 9, 2021

adaptive & non-adaptive routing algorithms in Hindi

June 09, 2021 0
adaptive & non-adaptive routing algorithms in Hindi

 routing algorithm एक ऐसी प्रक्रिया है जो डेटा पैकेट को स्रोत से गंतव्य तक स्थानांतरित करने के लिए मार्ग या पथ निर्धारित करती है। वे इंटरनेट यातायात को कुशलतापूर्वक निर्देशित करने में मदद करते हैं। डेटा पैकेट अपने स्रोत को छोड़ने के बाद, यह अपने गंतव्य तक पहुंचने के लिए कई अलग-अलग रास्तों में से चुन सकता है।  routing algorithm गणितीय रूप से सर्वोत्तम पथ की गणना करता है, अर्थात "न्यूनतम - लागत पथ" जिसके माध्यम से पैकेट को रूट किया जा सकता है।

 Routing algorithm in Hindi & it's type

Routing algorithm in Hindi
Routing algorithm in Hindi

 

routing algorithm को मोटे तौर पर दो प्रकारों में वर्गीकृत किया जा सकता है, adaptive और nonadaptive routing algorithms उन्हें आगे और वर्गीकृत किया जा सकता है जैसा कि निम्नलिखित आरेख में दिखाया गया है -

Adaptive Routing Algorithms in Hindi

 

Adaptive Routing Algorithms, जिसे डायनेमिक रूटिंग एल्गोरिदम के रूप में भी जाना जाता है, नेटवर्क स्थितियों के आधार पर गतिशील रूप से रूटिंग निर्णय लेता है। यह नेटवर्क ट्रैफिक और टोपोलॉजी के आधार पर रूटिंग टेबल का निर्माण करता है। वे हॉप गिनती, पारगमन समय और दूरी के आधार पर अनुकूलित मार्ग की गणना करने का प्रयास करते हैं।

Adaptive Routing Algorithms के तीन लोकप्रिय प्रकार हैं -

  • Centralized algorithm − यह नेटवर्क के बारे में वैश्विक ज्ञान का उपयोग करके स्रोत और गंतव्य नोड्स के बीच कम से कम लागत वाला रास्ता खोजता है। इसलिए, इसे ग्लोबल रूटिंग एल्गोरिथम के रूप में भी जाना जाता है।


  • Isolated algorithm − यह एल्गोरिथम अन्य नोड्स से जानकारी एकत्र करने के बजाय स्थानीय जानकारी का उपयोग करके रूटिंग जानकारी प्राप्त करता है।


  • Distributed algorithm − यह एक विकेन्द्रीकृत एल्गोरिथम है जो वितरित तरीके से स्रोत और गंतव्य के बीच कम से कम लागत वाले पथ की गणना करता है।


Non – Adaptive Routing Algorithms in Hindi

 

Non – Adaptive Routing Algorithms, जिसे स्टेटिक रूटिंग एल्गोरिदम (static routing algorithms)के रूप में भी जाना जाता है, एक स्थिर रूटिंग टेबल का निर्माण करता है ताकि यह निर्धारित किया जा सके कि पैकेट को किस रास्ते से भेजा जाना है। नेटवर्क बूट होने पर राउटर में संग्रहीत रूटिंग जानकारी के आधार पर स्थिर रूटिंग टेबल का निर्माण किया जाता है।

दो प्रकार के Non – Adaptive Routing Algorithms हैं -

  • Flooding − बाढ़ में, जब एक डेटा पैकेट राउटर पर आता है, तो इसे सभी आउटगोइंग लिंक पर भेजा जाता है, सिवाय इसके कि जिस पर वह आया है। बाढ़ अनियंत्रित, नियंत्रित या चयनात्मक बाढ़ हो सकती है।


  • Random walks − यह एक संभाव्य एल्गोरिथम है जहां राउटर द्वारा अपने किसी एक पड़ोसी को डेटा पैकेट बेतरतीब ढंग से भेजा जाता है।

Saturday, March 20, 2021

Trie data structure in Hindi - Data Structure in Hindi

March 20, 2021 0
Trie data structure in Hindi - Data Structure in Hindi

 विभिन्न प्रोग्रामिंग समस्याओं के लिए स्ट्रिंग्स को अनिवार्य रूप से सबसे महत्वपूर्ण और सामान्य विषयों के रूप में देखा जा सकता है। स्ट्रिंग प्रसंस्करण में कई वास्तविक दुनिया अनुप्रयोग होते हैं, जैसे:


  • Search Engines
  • Genome Analysis
  • Data Analytics

पाठ्य सामग्री के रूप में हमारे सामने प्रस्तुत सभी सामग्री को केवल  strings के अलावा और कुछ भी नहीं देखा जा सकता है।


trie data structure In Hindi

Tries एक अत्यंत विशेष और उपयोगी डेटा-संरचना है जो एक स्ट्रिंग के उपसर्ग पर आधारित हैं। उनका उपयोग डेटा के “Retrieval” का प्रतिनिधित्व करने के लिए किया जाता है और इस प्रकार Trie नाम।


prefix trie : What is prefix:

एक स्ट्रिंग का उपसर्ग कुछ भी नहीं है लेकिन (n, n<=mod(S)) किसी भी अक्षर को एक स्ट्रिंग की शुरुआत से सख्ती से शुरुआत माना जा सकता है। उदाहरण के लिए, शब्द “abacaba” में निम्नलिखित उपसर्ग हैं:


a
ab
aba
abac
abaca
abacab


Trie एक विशेष Data structure है जिसका उपयोग स्ट्रिंग्स को स्टोर करने के लिए किया जाता है जिसे ग्राफ की तरह देखा जा सकता है। यह नोड्स और किनारों के होते हैं। प्रत्येक नोड में अधिकतम 26 बच्चे होते हैं और प्रत्येक माता-पिता नोड को अपने बच्चों से जोड़ते हैं। ये 26 पॉइंटर्स अंग्रेजी वर्णमाला के 26 अक्षरों में से प्रत्येक के लिए पॉइंटर्स के अलावा और कुछ नहीं हैं। हर किनारे के लिए एक अलग एज बनाए रखा गया है।


एक trie data structure में उनके prefix के आधार पर स्ट्रिंग्स को ऊपर से नीचे तरीके से संग्रहीत किया जाता है। लंबाई 1 के सभी उपसर्गों को स्तर 1 तक संग्रहीत किया जाता है, लंबाई 2 के सभी prefixes को स्तर 2 और इसी तरह तक हल किया जाता है।


For example For trie data structure, consider the following diagram :- :

trie data structure
trie data structure



अब, कोई सोच रहा होगा कि एकल स्ट्रिंग को संसाधित करने के लिए डेटा संरचना जैसे ट्राई का उपयोग क्यों किया जाए? दरअसल, ट्राई का इस्तेमाल आम तौर पर स्ट्रिंग्स के समूहों पर किया जाता है, न कि एक स्ट्रिंग के बजाय। जब कई तार दिए जाते हैं, तो हम उनके आधार पर कई तरह की समस्याओं को हल कर सकते हैं। 

उदाहरण के लिए, एक अंग्रेजी शब्दकोश और एक स्ट्रिंग पर विचार करें, स्ट्रिंग से मेल खाते शब्दकोश स्ट्रिंग (s)से अधिकतम लंबाई का उपसर्ग खोजें। एक Naive approach का उपयोग करके इस समस्या को हल करने के लिए हमें दिए गए स्ट्रिंग के उपसर्ग को शब्दकोश में हर दूसरे शब्द के उपसर्ग के साथ मेल करना होगा और अधिकतम नोट करना होगा। यह एक  expensive प्रक्रिया है जिस पर समय लगेगा। trie in data structure इस समस्या को अधिक कुशल तरीके से हल कर सकती है।

प्रत्येक प्रकार की क्वेरी को संसाधित करने से पहले, जहां हमें सबसे लंबे उपसर्ग की लंबाई की खोज करने की आवश्यकता है, हमें पहले सभी मौजूदा शब्दों को शब्दकोश में जोड़ना होगा। एक trie में एक विशेष नोड होता है जिसे रूट नोड कहा जाता है। इस नोड में कोई आवक नहीं है। इसमें वर्णमाला के प्रत्येक अक्षर के लिए केवल 26 आउटगोइंग ईडीएफ शामिल हैं और यह ट्राइ का मूल है।


तो,  Trie में किसी भी स्ट्रिंग का insertion रूट नोड से शुरू होता है। लंबाई एक के सभी उपसर्ग रूट नोड के प्रत्यक्ष बच्चे हैं। इसके अलावा, लंबाई 2 के सभी उपसर्ग लेवल एक पर मौजूद नोड्स के बच्चे बन जाते हैं।


टायर में स्ट्रिंग डालने के लिए  pseudo code निम्नानुसार दिखेगा:

trie data structure
trie data structure

pseudo code की जाँच करने के लिए एक एकल शब्द शब्दों के शब्दकोश में मौजूद है या नहीं इस प्रकार है:







Monday, January 11, 2021

b tree in data structure in Hindi - Data structure In Hindi

January 11, 2021 0
b tree in data structure in Hindi - Data structure In Hindi

 इस ट्यूटोरियल में, आप सीखेंगे कि b tree in data structure क्या है। साथ ही, आपको C, C ++, Java और पायथन में B - Tree पर सर्च ऑपरेशन के काम के उदाहरण मिलेंगे।

b tree in data structure एक विशेष प्रकार का स्व-संतुलन खोज Tree है जिसमें प्रत्येक नोड में एक से अधिक कुंजी हो सकती हैं और दो से अधिक Child हो सकते हैं। यह b search tree का एक सामान्यीकृत रूप है।

इसे ऊंचाई वाले संतुलित m-way tree के रूप में भी जाना जाता है।



B tree in hindi
B tree in hindi

Why b tree in data structure?


हार्ड-डिस्क की तरह भौतिक भंडारण मीडिया तक पहुँचने में कम समय की आवश्यकता के बढ़ने के साथ
b tree की आवश्यकता उत्पन्न हुई। 

द्वितीयक भंडारण उपकरण एक बड़ी क्षमता के साथ धीमे हैं। इस तरह की डेटा संरचनाओं की आवश्यकता थी जो डिस्क एक्सेस को कम करती हैं।

अन्य डेटा संरचनाएं जैसे कि एक
b search tree, एवल ट्री, रेड-ब्लैक ट्री, आदि एक नोड में केवल एक कुंजी स्टोर कर सकते हैं। 

यदि आपको बड़ी संख्या में चाबियाँ जमा करनी हैं, तो ऐसे पेड़ों की ऊंचाई बहुत बड़ी हो जाती है और पहुंच का समय बढ़ जाता है।

हालांकि,
b tree एक ही नोड में कई चाबियाँ संग्रहीत कर सकते हैं और कई बच्चे नोड्स हो सकते हैं। यह तेजी से डिस्क एक्सेस की अनुमति देते हुए ऊंचाई को कम करता है।


B-tree in Hindi and it's Properties

  •     प्रत्येक नोड x के लिए, कुंजियाँ बढ़ते क्रम में संग्रहीत की जाती हैं।
  •     प्रत्येक नोड में, बूलियन मान x.leaf होता है जो x पत्ती होने पर सत्य होता है।
  •     यदि n पेड़ का क्रम है, तो प्रत्येक आंतरिक नोड में प्रत्येक बच्चे के लिए एक सूचक के साथ अधिकांश n - 1 कुंजी हो सकती हैं।
  •     रूट को छोड़कर प्रत्येक नोड में अधिकांश n बच्चे और कम से कम n / 2 बच्चे हो सकते हैं।
  •     सभी पत्तियों में एक ही गहराई (यानी पेड़ की ऊंचाई-एच) होती है।
  •     मूल में कम से कम 2 बच्चे हैं और इसमें न्यूनतम 1 कुंजी है।
  •     यदि n-1 है, तो ऊँचाई h और न्यूनतम डिग्री t, 2, h + logt (n + 1) / 2 के किसी भी n-key B- वृक्ष के लिए।

Operations b tree in data structure in Hindi

Learn Searching in B tree in Hindi

बी-ट्री में एक तत्व की खोज करना Binary Search Tree में एक तत्व की खोज का सामान्यीकृत रूप है। निम्न चरणों का पालन किया जाता है।

  •     रूट नोड से शुरू, नोड की पहली कुंजी के साथ तुलना करें।
  •     यदि k = the first key of the node, तो नोड और इंडेक्स वापस करें।
  •     यदि k.leaf = true है, तो NULL (यानी नहीं मिला) लौटें।
  •     यदि k < the first key of the root node, तो इस कुंजी के बाएं बच्चे को पुनरावर्ती खोजें।
  •     यदि वर्तमान नोड और k > the first key में एक से अधिक कुंजी है, तो नोड में अगली कुंजी के साथ तुलना करें।
  •     यदि k < next key तो इस कुंजी के बाएं बच्चे को खोजें (यानी। k पहली और दूसरी कुंजियों के बीच स्थित है)।
  •     और, कुंजी के सही बच्चे को खोजें।
  •     पत्ती तक पहुंचने तक चरण 1 से 4 दोहराएं।


Searching b tree example


  •     हमें डिग्री 3 के नीचे के Tree में k= 17 की खोज करनी चाहिए।
B-tree in hindi
B-tree in hindi

  • k रूट में नहीं मिला है, इसलिए इसे रूट की के साथ तुलना करें।

b tree insertion
b tree insertion
  • K> 11 के बाद से, रूट नोड के सही बच्चे पर जाएं।


b tree example
b tree example

 

  • K की तुलना 16 से करें। k> 16 के बाद से k की तुलना अगली कुंजी 18 से करें।

B tree in hindi
B tree in hindi

  • K <18 के बाद से, k 16 और 18 के बीच स्थित है। 16 के दाहिने बच्चे या 18 के बाएं बच्चे में खोजें।


b tree in data structure
b tree in data structure

  • k पाया जाता है।

b tree example
b tree example


Algorithm For B tree in Hindi

BtreeSearch(x, k)
 i = 1
 while i ≤ n[x] and k ≥ keyi[x]        // n[x] means number of keys in x node
    do i = i + 1
if i  n[x] and k = keyi[x]
    then return (x, i)
if leaf [x]
    then return NIL
else
    return BtreeSearch(ci[x], k)

B tree example program in c

#include <stdio.h>
#include <stdlib.h>

#define MAX 3
#define MIN 2

struct BTreeNode {
  int val[MAX + 1], count;
  struct BTreeNode *link[MAX + 1];
};

struct BTreeNode *root;

// Create a node
struct BTreeNode *createNode(int val, struct BTreeNode *child) {
  struct BTreeNode *newNode;
  newNode = (struct BTreeNode *)malloc(sizeof(struct BTreeNode));
  newNode->val[1] = val;
  newNode->count = 1;
  newNode->link[0] = root;
  newNode->link[1] = child;
  return newNode;
}

// Insert node
void insertNode(int val, int pos, struct BTreeNode *node,
        struct BTreeNode *child) {
  int j = node->count;
  while (j > pos) {
    node->val[j + 1] = node->val[j];
    node->link[j + 1] = node->link[j];
    j--;
  }
  node->val[j + 1] = val;
  node->link[j + 1] = child;
  node->count++;
}

// Split node
void splitNode(int val, int *pval, int pos, struct BTreeNode *node,
         struct BTreeNode *child, struct BTreeNode **newNode) {
  int median, j;

  if (pos > MIN)
    median = MIN + 1;
  else
    median = MIN;

  *newNode = (struct BTreeNode *)malloc(sizeof(struct BTreeNode));
  j = median + 1;
  while (j <= MAX) {
    (*newNode)->val[j - median] = node->val[j];
    (*newNode)->link[j - median] = node->link[j];
    j++;
  }
  node->count = median;
  (*newNode)->count = MAX - median;

  if (pos <= MIN) {
    insertNode(val, pos, node, child);
  } else {
    insertNode(val, pos - median, *newNode, child);
  }
  *pval = node->val[node->count];
  (*newNode)->link[0] = node->link[node->count];
  node->count--;
}

// Set the value
int setValue(int val, int *pval,
           struct BTreeNode *node, struct BTreeNode **child) {
  int pos;
  if (!node) {
    *pval = val;
    *child = NULL;
    return 1;
  }

  if (val < node->val[1]) {
    pos = 0;
  } else {
    for (pos = node->count;
       (val < node->val[pos] && pos > 1); pos--)
      ;
    if (val == node->val[pos]) {
      printf("Duplicates are not permitted\n");
      return 0;
    }
  }
  if (setValue(val, pval, node->link[pos], child)) {
    if (node->count < MAX) {
      insertNode(*pval, pos, node, *child);
    } else {
      splitNode(*pval, pval, pos, node, *child, child);
      return 1;
    }
  }
  return 0;
}

// Insert the value
void insert(int val) {
  int flag, i;
  struct BTreeNode *child;

  flag = setValue(val, &i, root, &child);
  if (flag)
    root = createNode(i, child);
}

// Search node
void search(int val, int *pos, struct BTreeNode *myNode) {
  if (!myNode) {
    return;
  }

  if (val < myNode->val[1]) {
    *pos = 0;
  } else {
    for (*pos = myNode->count;
       (val < myNode->val[*pos] && *pos > 1); (*pos)--)
      ;
    if (val == myNode->val[*pos]) {
      printf("%d is found", val);
      return;
    }
  }
  search(val, pos, myNode->link[*pos]);

  return;
}

// Traverse then nodes
void traversal(struct BTreeNode *myNode) {
  int i;
  if (myNode) {
    for (i = 0; i < myNode->count; i++) {
      traversal(myNode->link[i]);
      printf("%d ", myNode->val[i + 1]);
    }
    traversal(myNode->link[i]);
  }
}

int main() {
  int val, ch;

  insert(8);
  insert(9);
  insert(10);
  insert(11);
  insert(15);
  insert(16);
  insert(17);
  insert(18);
  insert(20);
  insert(23);

  traversal(root);

  printf("\n");
  search(11, &ch, root);
}

b tree insertion Operation

  •      यदि पेड़ खाली है, तो रूट नोड आवंटित करें और कुंजी डालें।
  •      नोड में कुंजियों की अनुमत संख्या को अपडेट करें।
  •      सम्मिलन के लिए उपयुक्त नोड खोजें।
  •      यदि नोड भरा हुआ है, तो नीचे दिए गए चरणों का पालन करें।
  •      तत्वों को बढ़ते क्रम में डालें।
  •      अब, इसकी सीमा से अधिक तत्व हैं। तो, मंझला में विभाजित करें।
  •      माध्य कुंजी को ऊपर की ओर धकेलें और बाएँ कुंजियों को बाएँ बच्चे के रूप में और दाएँ कुंजियों को दाएँ बच्चे के रूप में बनाएँ।
  •      यदि नोड भरा नहीं है, तो नीचे दिए गए चरणों का पालन करें।
  •      बढ़ते क्रम में नोड डालें।

b tree insertion Example

आइए नीचे दिए गए चित्रों के साथ सम्मिलन ऑपरेशन को समझते हैं।

सम्मिलित किए जाने वाले तत्व 8, 9, 10, 11, 15, 16, 17, 18, 20, 23 हैं।

b tree example
b tree example

 b tree insertion Algorithm

 

BreeInsertion(T, k)
r  root[T]
if n[r] = 2t - 1
    s = AllocateNode()
    root[T] = s
    leaf[s] = FALSE
    n[s] <- 0
    c1[s] <- r
    BtreeSplitChild(s, 1, r)
    BtreeInsertNonFull(s, k)
else BtreeInsertNonFull(r, k)
BtreeInsertNonFull(x, k)
i = n[x]
if leaf[x]
    while i  1 and k < keyi[x]
        keyi+1 [x] = keyi[x]
        i = i - 1
    keyi+1[x] = k
    n[x] = n[x] + 1
else while i  1 and k < keyi[x]
        i = i - 1
    i = i + 1
    if n[ci[x]] == 2t - 1
        BtreeSplitChild(x, i, ci[x])
        if k &rt; keyi[x]
            i = i + 1
    BtreeInsertNonFull(ci[x], k)
BtreeSplitChild(x, i)
BtreeSplitChild(x, i, y)
z = AllocateNode()
leaf[z] = leaf[y]
n[z] = t - 1
for j = 1 to t - 1
    keyj[z] = keyj+t[y]
if not leaf [y]
    for j = 1 to t
        cj[z] = cj + t[y]
n[y] = t - 1
for j = n[x] + 1 to i + 1
    cj+1[x] = cj[x]
ci+1[x] = z
for j = n[x] to i
    keyj+1[x] = keyj[x]
keyi[x] = keyt[y]
n[x] = n[x] + 1



Sunday, September 27, 2020

Data structure in Hindi | classification of data structure in Hindi

September 27, 2020 0
Data structure in Hindi | classification of data structure in Hindi

what is data structure in hindi



data structure को डेटा तत्वों के समूह के रूप में परिभाषित किया जा सकता है जो कंप्यूटर में डेटा को संग्रहीत और व्यवस्थित करने का एक कुशल तरीका प्रदान करता है ताकि इसे कुशलता से उपयोग किया जा सके। डेटा स्ट्रक्चर्स के कुछ उदाहरण एरेज़, लिंक्ड लिस्ट, स्टैक, क्यू इत्यादि हैं। डेटा स्ट्रक्चर्स का इस्तेमाल कंप्यूटर साइंस के लगभग हर पहलू यानी ऑपरेटिंग सिस्टम, कंपाइलर डिज़ाइन, आर्टिफ़िशियल इंटेलिजेंस, ग्राफिक्स और बहुत कुछ में व्यापक रूप से किया जाता है।



data structure in hindi
data structure in hindi

data structure in Hindi कई कंप्यूटर विज्ञान एल्गोरिदम का मुख्य हिस्सा हैं क्योंकि वे प्रोग्रामर को कुशल तरीके से डेटा को संभालने में सक्षम बनाते हैं। यह सॉफ्टवेयर या प्रोग्राम के प्रदर्शन को बढ़ाने में एक महत्वपूर्ण भूमिका निभाता है क्योंकि सॉफ्टवेयर का मुख्य कार्य उपयोगकर्ता के डेटा को यथासंभव तेजी से संग्रहित करना और प्राप्त करना है।


Basic Terminology in data structure In Hindi


data structure किसी भी प्रोग्राम या सॉफ़्टवेयर के बिल्डिंग ब्लॉक हैं। एक प्रोग्रामर के लिए उपयुक्त डेटा संरचना चुनना एक प्रोग्रामर के लिए सबसे मुश्किल काम है। जहाँ तक डेटा संरचनाओं का संबंध है, शब्दावली का उपयोग किया जाता है

Data: डेटा को एक प्राथमिक मूल्य या मूल्यों के संग्रह के रूप में परिभाषित किया जा सकता है, उदाहरण के लिए, छात्र का नाम और उसकी आईडी छात्र के बारे में डेटा है।

Group Items: जिन डेटा आइटमों के अधीनस्थ डेटा आइटम होते हैं, उन्हें समूह आइटम कहा जाता है, उदाहरण के लिए, किसी छात्र के नाम में पहला नाम और अंतिम नाम हो सकता है।

Record: रिकॉर्ड को विभिन्न डेटा आइटमों के संग्रह के रूप में परिभाषित किया जा सकता है, उदाहरण के लिए, अगर हम छात्र इकाई के बारे में बात करते हैं, तो छात्र का रिकॉर्ड बनाने के लिए उसका नाम, पता, पाठ्यक्रम और अंक एक साथ रखा जा सकता है।

File: एक फ़ाइल एक प्रकार की इकाई के विभिन्न रिकॉर्ड का एक संग्रह है, उदाहरण के लिए, यदि कक्षा में 60 कर्मचारी हैं, तो संबंधित फ़ाइल में 20 रिकॉर्ड होंगे जहां प्रत्येक रिकॉर्ड में प्रत्येक कर्मचारी के बारे में डेटा होता है।

Attribute and Entity: एक इकाई कुछ वस्तुओं के वर्ग का प्रतिनिधित्व करती है। इसमें विभिन्न विशेषताएं हैं। प्रत्येक विशेषता उस इकाई की विशेष संपत्ति का प्रतिनिधित्व करती है।

Field: फ़ील्ड एक इकाई की विशेषता का प्रतिनिधित्व करने वाली जानकारी की एक एकल प्राथमिक इकाई है।


Need of Data Structures In Hindi


जैसे-जैसे एप्लिकेशन जटिल होते जा रहे हैं और डेटा की मात्रा दिन-ब-दिन बढ़ती जा रही है, निम्नलिखित समस्याएं हो सकती हैं:

Processor speed: डेटा की बहुत बड़ी मात्रा को संभालने के लिए, उच्च गति प्रसंस्करण की आवश्यकता होती है, लेकिन जैसा कि डेटा प्रति दिन अरबों फाइलों में बढ़ रहा है, प्रोसेसर डेटा की उस मात्रा से निपटने में विफल हो सकता है।


Data Search: किसी स्टोर में 106 आइटमों की एक सूची आकार पर विचार करें, यदि हमारे एप्लिकेशन को किसी विशेष आइटम की खोज करने की आवश्यकता है, तो उसे हर बार 106 आइटमों को पीछे करने की आवश्यकता होती है, जिसके परिणामस्वरूप खोज प्रक्रिया धीमा हो जाती है।

Multiple requests: यदि हजारों उपयोगकर्ता वेब सर्वर पर एक साथ डेटा खोज रहे हैं, तो ऐसी संभावना है कि इस प्रक्रिया के दौरान एक बहुत बड़ा सर्वर हो सकता है

उपरोक्त समस्याओं को हल करने के लिए, डेटा संरचनाओं का उपयोग किया जाता है। डेटा को इस तरह से डेटा संरचना बनाने के लिए व्यवस्थित किया जाता है कि सभी वस्तुओं को खोजे जाने की आवश्यकता नहीं होती है और आवश्यक डेटा को तुरंत खोजा जा सकता है।



Advantages of Data Structures in Hindi


Efficiency: एक कार्यक्रम की दक्षता Data Structures की पसंद पर निर्भर करती है। उदाहरण के लिए: मान लीजिए, हमारे पास कुछ डेटा है और हमें एक पर्टिकुलर रिकॉर्ड की खोज करने की आवश्यकता है। उस स्थिति में, यदि हम अपने डेटा को किसी सरणी में व्यवस्थित करते हैं, तो हमें तत्व द्वारा क्रमिक रूप से खोज करना होगा। इसलिए, सरणी का उपयोग करना यहां बहुत कुशल नहीं हो सकता है। बेहतर data structure हैं जो खोज की प्रक्रिया को क्रमबद्ध सरणी, बाइनरी सर्च ट्री या हैश टेबल जैसे कुशल बना सकती हैं।

Reusability: data structure पुन: प्रयोज्य हैं, अर्थात् एक बार जब हमने किसी विशेष डेटा संरचना को लागू किया है, तो हम इसे किसी अन्य स्थान पर उपयोग कर सकते हैं। डेटा संरचनाओं के कार्यान्वयन को पुस्तकालयों में संकलित किया जा सकता है जो विभिन्न ग्राहकों द्वारा उपयोग किया जा सकता है।

Abstraction:
data structure ADT द्वारा निर्दिष्ट की जाती है जो अमूर्त स्तर प्रदान करता है। ग्राहक कार्यक्रम कार्यान्वयन विवरण में शामिल किए बिना, केवल इंटरफ़ेस के माध्यम से data structure का उपयोग करता है।

Classification For Data Structure in Hindi


Linear Data Structures in Hindi: एक Data Structures को रैखिक कहा जाता है यदि इसके सभी तत्व रैखिक क्रम में व्यवस्थित होते हैं। रैखिक डेटा संरचनाओं में, तत्वों को गैर-श्रेणीबद्ध तरीके से संग्रहीत किया जाता है जहां प्रत्येक तत्व में पहले और अंतिम तत्व को छोड़कर उत्तराधिकारी और पूर्ववर्ती होते हैं।

रैखिक डेटा संरचना के प्रकार नीचे दिए गए हैं:


Arrays: एक सरणी समान प्रकार के डेटा आइटम का एक संग्रह है और प्रत्येक डेटा आइटम को सरणी का एक तत्व कहा जाता है। तत्व का डेटा प्रकार किसी भी मान्य डेटा प्रकार जैसे चार, इंट, फ्लोट या डबल हो सकता है।

सरणी के तत्व समान चर नाम साझा करते हैं, लेकिन हर एक सबस्क्रिप्ट के रूप में जाना जाता है एक अलग सूचकांक संख्या वहन करती है। सरणी एक आयामी, दो आयामी या बहुआयामी हो सकती है।

सरणी आयु के अलग-अलग तत्व हैं:

age[0], age[1], age[2], age[3]........

Linked List in Hindi: लिंक्ड सूची एक रैखिक डेटा संरचना है जिसका उपयोग मेमोरी में एक सूची को बनाए रखने के लिए किया जाता है। इसे गैर-सन्निहित स्मृति स्थानों पर संग्रहीत नोड्स के संग्रह के रूप में देखा जा सकता है। सूची के प्रत्येक नोड में इसके आसन्न नोड के लिए एक पॉइंटर होता है।

Stack: स्टैक एक रैखिक सूची है जिसमें प्रविष्टि और विलोपन केवल एक छोर पर करने की अनुमति है, जिसे शीर्ष कहा जाता है।

स्टैक एक अमूर्त डेटा प्रकार (ADT) है, जिसे अधिकांश प्रोग्रामिंग भाषाओं में लागू किया जा सकता है। इसे स्टैक के रूप में नामित किया गया है क्योंकि यह एक वास्तविक दुनिया स्टैक की तरह व्यवहार करता है,

 उदाहरण के लिए: - प्लेटों के ढेर या कार्ड के डेक आदि।

Queue:  कतार एक रेखीय सूची है जिसमें तत्वों को केवल एक छोर पर डाला जा सकता है जिसे रियर कहा जाता है और केवल दूसरे छोर पर हटा दिया जाता है जिसे फ्रंट कहा जाता है।

यह स्टैक के समान एक अमूर्त डेटा संरचना है। कतार दोनों छोर पर खोली जाती है इसलिए यह डेटा आइटम संग्रहीत करने के लिए प्रथम-प्रथम-प्रथम-आउट (FIFO) पद्धति का अनुसरण करती है।


Non Linear Data Structures: यह डेटा संरचना एक अनुक्रम नहीं बनाती है अर्थात् प्रत्येक आइटम या तत्व एक गैर-रेखीय व्यवस्था में दो या अधिक अन्य वस्तुओं के साथ जुड़ा हुआ है। डेटा तत्वों को क्रमिक संरचना में व्यवस्थित नहीं किया जाता है।

Non Linear Data Structures के प्रकार नीचे दिए गए हैं:

Trees: पेड़ों को बहुस्तरीय डेटा संरचना होती है, जिसमें इसके तत्वों के बीच पदानुक्रमित संबंध होते हैं जिन्हें नोड्स कहा जाता है। हियरशियो में बॉटलमॉस्ट नोड्स को लीफ नोड कहा जाता है जबकि सबसे ऊपरी नोड को रूट नोड कहा जाता है। प्रत्येक नोड में समीपवर्ती नोड्स को इंगित करने के लिए पॉइंटर्स होते हैं।

ट्री डेटा संरचना नोड्स के बीच parent-child relationship पर आधारित है। पेड़ में प्रत्येक नोड में पत्ती नोड्स को छोड़कर एक से अधिक बच्चे हो सकते हैं, जबकि प्रत्येक नोड में मूल नोड को छोड़कर एक से अधिक माता-पिता हो सकते हैं। पेड़ों को कई श्रेणियों में वर्गीकृत किया जा सकता है जिन पर बाद में इस ट्यूटोरियल में चर्चा की जाएगी।


Graphs: रेखांकन को किनारों के रूप में ज्ञात लिंक द्वारा जुड़े तत्वों के समुच्चय का चित्रण (वर्टिकल द्वारा दर्शाया गया) के रूप में परिभाषित किया जा सकता है। एक ग्राफ इस मायने में पेड़ से अलग है कि एक ग्राफ में चक्र हो सकता है जबकि पेड़ में एक नहीं हो सकता।

Operations on data structure in Hindi

1) Traversing: प्रत्येक डेटा संरचना में डेटा तत्वों का सेट होता है। खोज या छँटाई जैसे कुछ विशिष्ट ऑपरेशन करने के लिए डेटा संरचना के प्रत्येक तत्व का पता लगाने के लिए डेटा संरचना का पता लगाना है।

उदाहरण: यदि हमें किसी छात्र द्वारा 6 अलग-अलग विषयों में प्राप्त अंकों की औसत गणना करने की आवश्यकता है, तो हमें अंकों की पूरी सरणी को पार करने और कुल योग की गणना करने की आवश्यकता है, तो हम उस योग को विषयों की संख्या 6, 6 से विभाजित करेंगे। औसत खोजने के लिए।

2)
Insertion: सम्मिलन को किसी भी स्थान पर डेटा संरचना में तत्वों को जोड़ने की प्रक्रिया के रूप में परिभाषित किया जा सकता है।

यदि डेटा संरचना का आकार n है, तो हम केवल इसमें n-1 डेटा तत्व सम्मिलित कर सकते हैं।

3)
Deletion: डेटा संरचना से एक तत्व को हटाने की प्रक्रिया को डीलेटियन कहा जाता है। हम किसी भी यादृच्छिक स्थान पर डेटा संरचना से एक तत्व को हटा सकते हैं।

यदि हम किसी तत्व को खाली डेटा संरचना से हटाने की कोशिश करते हैं तो अंडरफ्लो होता है।

4)
Searching: डेटा संरचना के भीतर एक तत्व के स्थान को खोजने की प्रक्रिया को खोज कहा जाता है। खोज करने के लिए दो एल्गोरिदम हैं, रैखिक खोज और बाइनरी सर्च। हम इस ट्यूटोरियल में बाद में उनमें से प्रत्येक पर चर्चा करेंगे।

5)
Sorting: डेटा संरचना को एक विशिष्ट क्रम में व्यवस्थित करने की प्रक्रिया को सॉर्टिंग के रूप में जाना जाता है। कई एल्गोरिदम हैं जिनका उपयोग छँटाई करने के लिए किया जा सकता है, उदाहरण के लिए, सम्मिलन प्रकार, चयन प्रकार, बुलबुला प्रकार, आदि।

6)
Merging: जब दो सूचियाँ क्रमश: M और N के आकार A और सूची B की सूची बनाती हैं, समान प्रकार के तत्वों में, तीसरी सूची का निर्माण करने के लिए मिलाया जाता है या आकार की सूची C (M + N) का निर्माण किया जाता है, तो इस प्रक्रिया को विलय कहा जाता है

List Of Topic In data structure in Hindi

Array in data structure

Types Of data structure in Hindi

difference between array and link list in Hindi

Types of Queue in Hindi

binary trees in data structure in Hindi

linked list in Hindi
 

Thursday, September 17, 2020

big o notation in hindi and time complexity

September 17, 2020 0
big o notation in hindi and time complexity

 यदि आप एक कुशल प्रोग्रामर हैं तो समय जटिलता एक सामान्य शब्द है (big o notation, small o notation, omega notation) हालाँकि, यदि आपने तब यह सुनिश्चित नहीं किया है कि आप समय जटिलता की गणना को विस्तार से समझने के लिए इस लेख को अच्छी तरह से पढ़ेंगे।


What is Time Complexity in Hindi in Data

 structure?


किसी भी एल्गोरिथ्म / कार्यक्रम का Time Complexity कार्यक्रम को निष्पादित करने के लिए उठाए गए वास्तविक समय का माप नहीं है, बल्कि यह है कि तर्क के प्रत्येक कथन को आवश्यक आउटपुट का उत्पादन करने के लिए निष्पादित किया जाता है।

सरल शब्दों में, यहां हमारा मतलब है। नीचे दिए गए कोड पर विचार करें।

#include <stdio.h>
void main()
{
int i, n = 5;
for (i = 1; i <= n; i++) {
printf("computer in n");
                  } }
                  

इसलिए, एक compiler का उपयोग करके निष्पादित किए गए उपरोक्त कोड ने नीचे आउटपुट दिया है। यदि आप देख सकते हैं, संकलक दिखाता है कि कोड 1.166 सेकेंड में निष्पादित किया गया था और हम में से बहुत से इसे समय जटिलता मानते हैं, लेकिन यह नहीं है।

बल्कि, इस कोड की
Time Complexity उस समय पर निर्भर करती है जब कथन निष्पादित होते हैं। यहाँ, लूप के लिए कई बार 'n' संख्या निष्पादित होती है और इसलिए जटिलता O (n) है (हम समझेंगे कि इस लेख के बाद के भाग में O क्या है)

Need to Calculate Time Complexity?


बहुत बार, किसी विशेष समस्या को हल करने के लिए एक से अधिक तरीके हैं और ऐसे मामलों में, आपको सभी में से सबसे कुशल समाधान की पहचान करने में सक्षम होना चाहिए। यह वह जगह है जहां
Time Complexity चित्र में आती है। 

समय जटिलता आपको विभिन्न समाधानों के प्रदर्शन की तुलना करने में मदद करती है, इस प्रकार आपको सबसे कुशल समाधान निर्धारित करने में मदद करती है।


Calculate the Time Complexity of an Algorithm?

समय की जटिलता को एसिम्प्टोटिक सूचनाओं के रूप में नीचे दिए गए तीन शब्दों का उपयोग करके व्यक्त किया जा सकता है।


    Big - Oh or Big O Notation in hindi (BIG O)
    Big - Omega
    Big - Theta


लेकिन ज्यादातर बार, हम
Big O Notation in hindi का उपयोग करेंगे क्योंकि यह हमें निष्पादन समय की एक ऊपरी सीमा प्रदान करेगा यानी सबसे खराब स्थिति में निष्पादन का समय। साथ ही, एक एल्गोरिथ्म का चलने का समय एक ही आकार के विभिन्न इनपुट्स के बीच भिन्न हो सकता है, और इसलिए हम सबसे खराब स्थिति पर विचार करते हैं, जो किसी दिए गए आकार के इनपुट के लिए आवश्यक अधिकतम समय है।

समय जटिलता उदाहरण


1)


Big o natation in hindi
Big o natation example


Time Complexity Calculation:
उपरोक्त दिए गए कार्यक्रम की समय जटिलता हे (1) है, क्योंकि इस कार्यक्रम में केवल असाइनमेंट, अंकगणितीय संचालन शामिल हैं और उन सभी को केवल एक बार निष्पादित किया जाएगा।

2)

Big o natation in hindi
Big o natation in hindi

 

Time Complexity Calculation: ऊपर दिए गए स्निपेट में, हमारे पास एक नियंत्रण कथन है जो n समय के लिए निष्पादित होता है। इसके साथ ही हमारे पास असाइनमेंट, अंकगणित और रिटर्न स्टेटमेंट जैसे ऑपरेशन भी हैं। इसलिए, समय जटिलता O (n + 3) है।

N के बड़े मूल्यों के लिए, निरंतर मान नगण्य हो जाते हैं। इसलिए यदि किसी कार्यक्रम में एक नियंत्रण कथन है, तो असाइनमेंट, अंकगणितीय, तार्किक और रिटर्न स्टेटमेंट की जटिलताओं को अनदेखा किया जा सकता है।


इसलिए, ऊपर दिए गए स्निपेट की अंतिम समय जटिलता O (n) है।


3)

big o notation
big o notation


Time Complexity Calculation:  उपरोक्त स्निपेट में, लूप के लिए पहले और दूसरे को व्यक्तिगत रूप से n बार निष्पादित किया जाता है। तो समय जटिलता n * n = O (n2) के लिए होती है

4)

big o notation
big o notation



Time Complexity Calculation:  यह बाइनरी खोज का एल्गोरिथ्म है। यह तत्वों के दिए गए सेट को दो हिस्सों में तोड़ता है और फिर एक विशेष तत्व की खोज करता है। इसके अलावा, यह इन दो हिस्सों को आगे के हिस्सों में विभाजित करता रहता है जब तक कि प्रत्येक अलग-अलग तत्व सेट न हो जाए। ऐसे सभी एल्गोरिदम जो तत्वों के पुनरावर्ती विभाजन के सिद्धांत पर काम करते हैं, उनमें ओ (लॉग एन) जटिलता होगी।


Some Real-Time Examples of Time Complexity in

 hindi



उदाहरण 1:

मान लें कि आपकी कक्षा के किसी व्यक्ति ने आपकी पसंदीदा चॉकलेट चुरा ली है। आपको वह चॉकलेट ढूंढनी होगी। नीचे इसे खोजने के कुछ तरीके दिए गए हैं।


  •     By asking each and every person in the class, जिसका अर्थ है कि यदि छात्रों की संख्या n है, तो आपको n व्यक्तियों से पूछने की आवश्यकता है। इसलिए, जटिलता हे (एन) है।
  •     By asking only one of the students in the class और यदि उसके पास वह चॉकलेट नहीं है, तो उसी व्यक्ति से शेष छात्रों के बारे में पूछें। तो, प्रत्येक व्यक्ति से आप उसी व्यक्ति के बारे में पूछ रहे हैं और शेष व्यक्तियों के बारे में भी। इसलिए, पिछले मामले की तुलना में जटिलता दो बार है। यानी O (n2)। उपर्युक्त दो तरीके कठिन प्रतीत होते हैं।
  •     इसलिए, यह कहें कि क्या आप पूरी कक्षा को दो हिस्सों में विभाजित करते हैं और पूछते हैं कि चॉकलेट दाईं ओर है या बाईं ओर। यदि यह दाईं ओर है, तो दाहिनी ओर के लोगों की संख्या को फिर से दो में विभाजित करें और उसी प्रक्रिया को दोहराएं। यहां, पूछताछ की संख्या तेजी से घट रही है। इसलिए, जटिलता हे (लॉग एन)।



Time Complexity Table

big o notation
big o notation

Time Complexity Chart

आप अब सोच रहे होंगे कि यह बिग ओ नोटेशन आपको विभिन्न एल्गोरिदम की तुलना करने में कैसे मदद कर सकता है और ओ (एन), ओ (एन 2) या ओ (लॉग एन) में से कौन बेहतर है? तो यहां एक चार्ट है जो आपको यह समझने में मदद करेगा कि ऊपर चर्चा की गई समय जटिलताएं कुशल एल्गोरिदम का कौन सा उपाय है।

notation chart
big notation chart

 

Time Complexity Cheat Sheet of Algorithms

नीचे दिए गए टाइम कॉम्प्लेक्सिटी चीट शीट में कुछ महत्वपूर्ण डेटा संरचना एल्गोरिदम की सबसे अच्छी, औसत और सबसे खराब स्थिति की जटिलताएं हैं


big o notation in hindi
big o notation in hindi

Friday, August 28, 2020

What is queue in data structure Hindi

August 28, 2020 0
What is queue in data structure Hindi
Queue एक abstract data structure है जो Stack के समान है। स्टैक के विपरीत, दोनों सिरों पर एक Queue खुली होती है। एक सिरा हमेशा डेटा (enqueue) और दूसरा सिरा डेटा (dequeue) निकालने के लिए लगाया जाता है।

 

queue in data structure in Hindi

What is queue meaning in Hindi
What is queue meaning in Hindi

एक
Queue एक FIFO (First In First Out) data structure है जहां पहले जोड़ा गया तत्व पहले हटा दिया जाएगा। Basic Queue Operation enqueue (प्रविष्टि) और dequeue (विलोपन) हैं। Enqueue Queue के सामने किया जाता है और Queue के अंत में डीक्यू किया जाता है। एक Queue में elements को क्रमिक रूप से व्यवस्थित किया जाता है और इसलिए Queue को linear data structures कहा जाता है।

The practical examples of queues are

  •     जो उपभोक्ता पहले किसी दुकान पर आता है, उसे पहले सेवा दी जाएगी।
  •     CPU कार्य शेड्यूलिंग और डिस्क शेड्यूलिंग।
  •     बस और ट्रेन के टिकट के मामले में टिकट की प्रतीक्षा सूची।
 

Types of Queues in Data Structure in Hindi

  •  Simple Queue
  • Circular Queue
  • Priority Queue 
  • Dequeue (डबल एंडेड क्यू)

Simple Queue in Hindi

First Type Of Queue Simple Queue एक सामान्य Queue है जहाँ Queue के अंत में सम्मिलन होता है और Queue के अंत में विलोपन होता है।

circular queue in data structure in Hindi


  •     एक परिपत्र कतार में, अंतिम नोड पहले नोड से जुड़ा हुआ है।
  •     वृत्ताकार कतार को Ring Buffer भी कहा जाता है।
  •     Insertion in a circular queue FRONT पर होता है और Queue के अंत में  deletion होता है।

priority queue in data structure in Hindi


  •     एक Priority Queue में, नोड्स में कुछ पूर्वनिर्धारित प्राथमिकता होगी।
  •     नोड्स के आगमन के क्रम में एक Priority Queue में प्रविष्टि की जाती है।
  •     सबसे कम प्राथमिकता वाले नोड को Priority Queue से हटा दिया जाएगा।


double ended queue in data structure in Hindi



एक Doubly Ended Queue में, insertion and deletion कार्य Queue के FRONT और END दोनों पर किया जा सकता है।
 

Basic operations in a queue in Data structure


Data structure में सबसे basic queue Operation निम्नलिखित हैं

    enqueue () -
queue की शुरुआत में एक तत्व जोड़ता है। यदि queue भरी है, तो यह एक अतिप्रवाह है।
    dequeue () -
queue के अंत में एक तत्व हटाता है। यदि queue खाली है, तो यह एक अंतर्प्रवाह (underflow) है।


enqueue() In Queue


  •     जाँच करें कि Queue भरी हुई है या नहीं।
  •     यदि Queue भरी हुई है, तो "Queue underflow" प्रिंट करें।
  •     increment REAR by 1.
  •     QUEUE असाइन करें [REAR] = ELEMENT

dequeue() Type of Queue

  •     जांचें कि क्या कतार खाली है।
  •     यदि कतार खाली है, तो "Queue underflow" प्रिंट करें।
  •     तत्व को कतार के सामने कुछ अस्थायी चर पर कॉपी करें, TEMP = QUEUE [FRONT]
  •    In Queue  Increment FRONT by 1.
  •     Print temp and delete करें

Thursday, May 14, 2020

Greedy Algorithm Proof and its examples in hindi

May 14, 2020 0
Greedy Algorithm Proof and its examples in hindi
This chapter will help you to learn about greedy algorithm and its examples in hindi and also give you understanding and knowledge about how to solve greedy algorithm.

Greedy Algorithm Proof and its examples in hindi
Greedy Algorithm Proof and its examples in hindi

एक algorithms डिजाइन में कोई भी 'सिल्वर बुलेट' नहीं है जो सभी गणना समस्याओं का इलाज है। विभिन्न समस्याओं के लिए विभिन्न प्रकार की तकनीकों के उपयोग की आवश्यकता होती है। एक अच्छा प्रोग्रामर इन सभी तकनीकों का उपयोग समस्या के प्रकार के आधार पर करता है। कुछ आमतौर पर इस्तेमाल की जाने वाली तकनीकें हैं:


  •     Divide and conquer
  •     Randomized algorithms
  •     Greedy algorithms (This is not an algorithm, it is a technique.)
  •     Dynamic programming

'लालची
algorithms' क्या है?

एक लालची
algorithms, जैसा कि नाम से पता चलता है, हमेशा वह विकल्प बनाता है जो उस पल में सबसे अच्छा लगता है। इसका मतलब यह है कि यह इस उम्मीद में स्थानीय रूप से इष्टतम विकल्प बनाता है कि यह विकल्प वैश्विक स्तर पर इष्टतम समाधान के लिए नेतृत्व करेगा।

आप कैसे तय करते हैं कि कौन सा विकल्प इष्टतम है?

मान लें कि आपके पास एक objective function है जिसे दिए गए बिंदु पर अनुकूलित (या तो अधिकतम या न्यूनतम) किया जाना है। एक लालची
algorithms प्रत्येक चरण में लालची विकल्प बनाता है ताकि यह सुनिश्चित हो सके कि objective function अनुकूलित है। Greedy algorithms में इष्टतम समाधान की गणना करने के लिए केवल एक शॉट है ताकि यह कभी वापस न जाए और निर्णय को उलट दे।

 some advantages and disadvantages in Greedy algorithms


  •     एक समस्या के लिए लालची algorithms (या यहां तक ​​कि कई Greedy algorithms) के साथ आना काफी आसान है।

  •     Greedy algorithms के लिए रन टाइम का विश्लेषण आम तौर पर अन्य तकनीकों (जैसे डिवाइड और जीत) की तुलना में बहुत आसान होगा। डिवाइड और विजय तकनीक के लिए, यह स्पष्ट नहीं है कि तकनीक तेज या धीमी है। ऐसा इसलिए है क्योंकि iteration के प्रत्येक स्तर पर आकार छोटा हो जाता है और उप-समस्याओं की संख्या बढ़ जाती है।

  •     मुश्किल हिस्सा यह है कि Greedy algorithms के लिए आपको शुद्धता के मुद्दों को समझने के लिए बहुत अधिक मेहनत करनी होगी। सही algorithms के साथ भी, यह साबित करना कठिन है कि यह सही क्यों है। यह साबित करना कि एक लालची algorithms सही है, एक विज्ञान की तुलना में एक कला का अधिक है। इसमें बहुत सारी रचनात्मकता शामिल है।

C. एक Greedy algorithms कैसे बनाएँ?


बहुत व्यस्त व्यक्ति होने के नाते, आपके पास कुछ दिलचस्प काम करने के लिए बिल्कुल सही समय है और आप इस तरह की अधिकतम चीजें करना चाहते हैं।

आपको पूर्णांक का एक सरणी A दिया जाता है, जहां प्रत्येक तत्व पूरा होने में लगने वाले समय को इंगित करता है। आप उन चीजों की अधिकतम संख्या की गणना करना चाहते हैं जो आप सीमित समय में कर सकते हैं।

यह एक सरल
Greedy algorithms समस्या है। प्रत्येक iteration में, आपको उन चीजों का लालच करना होगा जो दो चर वर्तमान समय और संख्याओं को बनाए रखते हुए पूरा करने में न्यूनतम समय लेगी। गणना पूरी करने के लिए, आपको यह करना होगा:
  •     सरणी A को गैर-घटते क्रम में सॉर्ट करें।
  •     एक-एक करके प्रत्येक आइटम का चयन करें।
  •     उस समय को जोड़ें जो उस समय से आइटम को चालू करने में पूरा करेगा।
  •     एक नंबर में जोड़ें।

इसे तब तक दोहराएं जब तक कि वर्तमान समय T के बराबर या उससे कम न हो।

A = {5, 3, 4, 2, 1} और T = 6

छाँटने के बाद A = {1, 2, 3, 4, 5}

पहली
iteration के बाद:

    वर्तमान समय = १
    numberOfThings = 1

2 iteration के बाद:

    करंट टाइम 1 + 2 = 3 है
    numberOfThings = 2

3
iteration के बाद:

    वर्तमान समय 3 + 3 = 6 है
    numberOfThings = 3

4 वें
iteration के बाद, वर्तमान समय 6 + 4 = 10 है, जो टी से अधिक है। इसलिए, उत्तर 3 है।


#include <iostream>
    #include <algorithm>

    using namespace std;
    const int MAX = 105;
    int A[MAX];

    int main()
    {
        int T, N, numberOfThings = 0, currentTime = 0;
        cin >> N >> T;
        for(int i = 0;i < N;++i)
            cin >> A[i];
        sort(A, A + N);
        for(int i = 0;i < N;++i)
        {
            currentTime += A[i];
            if(currentTime > T)
                break;
            numberOfThings++;
        }
        cout << numberOfThings << endl;
        return 0;
    }

यह उदाहरण बहुत तुच्छ है और जैसे ही आप समस्या को पढ़ते हैं, यह स्पष्ट है कि आप इसके लिए Greedy algorithms को लागू कर सकते हैं।

अधिक कठिन समस्या पर विचार करें-निर्धारण समस्या।

आपके पास निम्नलिखित हैं:

  •      उन सभी कार्यों की सूची, जिन्हें आपको आज पूरा करने की आवश्यकता है
  •      प्रत्येक कार्य को पूरा करने के लिए आवश्यक समय
  •      प्रत्येक कार्य को प्राथमिकता (या वजन)।

आपको यह निर्धारित करने की आवश्यकता है कि सबसे इष्टतम परिणाम प्राप्त करने के लिए आपको किस क्रम में कार्यों को पूरा करना चाहिए।

इस समस्या को हल करने के लिए आपको अपने इनपुट का विश्लेषण करने की आवश्यकता है। इस समस्या में, आपके इनपुट निम्नानुसार हैं:

  •      जितनी नौकरियां आप पूरा करना चाहते हैं, उसके लिए integer N
  •      List P: प्राथमिकता (या वजन)
  •      List T: वह समय जो किसी कार्य को पूरा करने के लिए आवश्यक है

यह समझने के लिए कि किस मापदंड को अनुकूलित करना है, आपको प्रत्येक कार्य को पूरा करने के लिए आवश्यक कुल समय निर्धारित करना चाहिए।


 C(j) = T[1] + T[2] + .... + T[j] where 1 <= j <= N

ऐसा इसलिए है क्योंकि jth के काम के लिए पहले (j-1) कार्य पूरे होने तक इंतजार करना पड़ता है, जिसके बाद इसे पूरा करने के लिए T [j] समय की आवश्यकता होती है।

उदाहरण के लिए, यदि T = {1, 2, 3}, पूरा होने का समय होगा:

    C (1) = T [1] = 1
    C (2) = T [1] + T [2] = 1 + 2 = 3
    C (3) = T [1] + T [2] + T [3] = 1 + 2 + 3 = 6

आप स्पष्ट रूप से जितना संभव हो उतना कम समय पूरा करना चाहते हैं। लेकिन यह इतना आसान नहीं है।

किसी दिए गए अनुक्रम में, शुरुआत में पंक्तिबद्ध होने वाले
Jobs का समय पूरा होने का समय कम हो जाता है और Jobs की समाप्ति की ओर Queued हो जाता है।

कार्यों को पूरा करने का इष्टतम तरीका क्या है?

यह आपके
objective function पर निर्भर करता है। जबकि "Scheduling" समस्या में कई function कार्य हैं, आपका objective function एफ पूरा होने के समय का भारित योग है।

F = P[1] * C(1) + P[2] * C(2) + ...... + P[N] * C(N)

इस
objective function को कम से कम किया जाना चाहिए।

Special Case

उन
Special Case पर विचार करें जो कि optimal बात है कि सबसे optimal चीज क्या है। इन विशेष मामलों को देखने से कुछ प्राकृतिक Greedy algorithms सामने आएंगे, जिसके बाद आपको यह पता लगाना होगा कि कैसे इनको केवल एक उम्मीदवार तक सीमित किया जाए, जिसे आप सही साबित करेंगे।

Two
Special Case ForFollows:

    यदि विभिन्न कार्यों को पूरा करने के लिए आवश्यक समय एक ही है यानी T [i] = T [j] जहां 1 <= i, j <= N है, लेकिन उनकी अलग-अलग प्राथमिकताएं हैं तो
schedule the jobs करने के लिए किस क्रम में समझदारी होगी?

    यदि विभिन्न कार्यों की प्राथमिकताएं समान हैं यानी P [i] = P [j] जहां 1 <= i, j <= N है, लेकिन उनकी अलग-अलग लंबाई है तो आपको किस क्रम में लगता है कि हमें
jobs का समय निर्धारित करना चाहिए?

यदि विभिन्न कार्यों को पूरा करने के लिए आवश्यक समय समान है, तो आपको उच्च प्राथमिकता वाले कार्य को प्राथमिकता देनी चाहिए 


Case 1
 objective function पर विचार करें जिसे आपको कम से कम करने की आवश्यकता है। मान लें कि विभिन्न कार्यों को पूरा करने के लिए आवश्यक समय t है।

T [i] = t जहाँ 1 <= i <= N है

चाहे जो भी अनुक्रम का उपयोग किया जाए, प्रत्येक कार्य के लिए पूरा होने का समय निम्नानुसार होगा:

C(1) = T[1] = t
C(2) = T[1] + T[2] = 2 * t
C(3) = T[1] + T[2] + T[3] = 3 * t
...
C(N) = N * t 


objective function को यथासंभव छोटा बनाने के लिए सर्वोच्च प्राथमिकता को कम से कम समय पूरा करने के साथ जुड़ा होना चाहिए।

Case 2

दूसरे मामले में, यदि विभिन्न कार्यों की प्राथमिकताएं समान हैं, तो आपको उस कार्य का पक्ष लेना होगा जिसे पूरा करने के लिए कम से कम समय की आवश्यकता होती है। मान लें कि विभिन्न कार्यों की प्राथमिकताएं P हैं।


F = P[1] * C(1) + P[2] * C(2) + ...... + P[N] * C(N)
F = p * C(1) + p * C(2) + ...... + p * C(N)
F = p * (C(1) + C(2) + ...... + C(N)) 


F के मूल्य को कम करने के लिए, आपको कम से कम (C (1) + C (2) + ...... + C (N)) करना होगा, जो यदि आप उन कार्यों पर काम करना शुरू कर सकते हैं जिनमें सबसे कम समय की आवश्यकता होती है पूरा करना।

दो नियम हैं। उन कार्यों को प्राथमिकता दें जो:

  •     एक उच्च प्राथमिकता है
  •     पूरा करने के लिए कम समय लें

अगला कदम विशेष मामलों से परे, सामान्य मामले में जाना है। इस मामले में, प्राथमिकताएं और प्रत्येक कार्य के लिए आवश्यक समय अलग-अलग हैं।

यदि आपके पास 2 कार्य हैं और ये दोनों नियम आपको एक ही सलाह देते हैं, तो जिस कार्य की प्राथमिकता अधिक है और पूरा होने में कम समय लगता है, वह कार्य स्पष्ट रूप से पहले पूरा किया जाना चाहिए। लेकिन क्या होगा अगर ये दोनों नियम आपको परस्पर विरोधी सलाह दें? 


यदि आपके पास ऐसे कार्यों की एक जोड़ी है जहाँ उनमें से एक की प्राथमिकता अधिक है और दूसरे को पूरा करने के लिए अधिक समय की आवश्यकता है? (यानी P [i]> P [j] लेकिन T [i]> T [j])। आपको पहले कौन सा पूरा करना चाहिए?

क्या आप इन 2 मापदंडों (समय और प्राथमिकता) को एक अंक में जोड़ सकते हैं जैसे कि यदि आप उच्च स्कोर से निचले स्कोर तक की नौकरियों को छांटते हैं तो आपको हमेशा एक इष्टतम समाधान मिलेगा?

2 नियम याद रखें।

  •     उच्च प्राथमिकताओं को वरीयता दें ताकि उच्च प्राथमिकताएं एक उच्च स्कोर की ओर ले जाएं।
  •     उन कार्यों को वरीयता दें, जिन्हें पूरा करने के लिए कम समय की आवश्यकता होती है ताकि अधिक समय की आवश्यकता होने पर स्कोर कम हो।

आप एक साधारण गणितीय फ़ंक्शन का उपयोग कर सकते हैं, जो इनपुट के रूप में 2 नंबर (प्राथमिकता और आवश्यक समय) लेता है और इन दो गुणों को पूरा करते हुए आउटपुट के रूप में एक नंबर (स्कोर) देता है। (इस तरह के कार्यों की अनंत संख्या है।)

सबसे सरल कार्यों में से दो लेते हैं जिनमें ये गुण हैं

    Algorithm # 1:
decreasing value of ( P[i] - T[i] ) नौकरियों का आदेश दें
    
Algorithm # 2: decreasing value of ( P[i] / T[i] ) नौकरियों का आदेश दें

सादगी के लिए हम मान रहे हैं कि कोई संबंध नहीं है।

अब आपके पास दो
Algorithm हैं और उनमें से कम से कम एक गलत है। एल्गोरिथ्म को नियम दें जो सही काम नहीं करता है।

T = {5, 2} और P = {3, 1}
Algorithm के अनुसार # 1 ( P[1] - T[1] ) < ( P[2] - T[2] ), इसलिए, दूसरा कार्य पहले पूरा किया जाना चाहिए और आपका उद्देश्य कार्य होगा:
F = P[1] * C(1) + P[2] * C(2) = 1 * 2 + 3 * 7 = 23 

Algorithm # 2 (P [1] / T [1])> (P [2] / T [2]) के अनुसार, इसलिए, पहला कार्य पहले पूरा किया जाना चाहिए और आपका उद्देश्य कार्य होगा:

F = P [1] * C (1) + P [2] * C (2) = 3 * 5 + 1 * 7 = 22
Algorithm # 1 आपको इष्टतम उत्तर नहीं देगा और इसलिए, Algorithm # 1 सही (हमेशा) सही नहीं है।

नोट: याद रखें कि Greedy
Algorithm अक्सर गलत होते हैं। सिर्फ इसलिए कि एल्गोरिथ्म # 1 सही नहीं है, इसका अर्थ यह नहीं है कि एल्गोरिथम # 2 के सही होने की गारंटी है। हालांकि, यह पता चलता है कि इस मामले में एल्गोरिथ्म # 2 हमेशा सही होता है।

इसलिए, अंतिम
Algorithm जो objective function का optimal मान लौटाता है: 

Algorithm (P, T, N)
    {
        let S be an array of pairs ( C++ STL pair ) to store the scores and their indices
        , C be the completion times and F be the objective function
        for i from 1 to N:
            S[i] = ( P[i] / T[i], i )            // Algorithm #2
        sort(S)
        C = 0
        F = 0
        for i from 1 to N:                // Greedily choose the best choice
            C = C + T[S[i].second]
            F = F + P[S[i].second]*C
        return F
    }

Greedy Algorithm Time Complexity

Sorting Funcation Time complexity : O(N * logN)
overall time complexity is O(2 * N + N * logN) = O(N * logN)

यह साबित करने के लिए कि Algorithm # 2 सही है, विरोधाभास द्वारा सबूत का उपयोग करें। यह मान लें कि आप जो साबित करने की कोशिश कर रहे हैं वह झूठा है और उस चीज़ से कुछ हासिल करें जो जाहिर तौर पर झूठी है।

इसलिए, मान लें कि यह
Greedy Algorithm एक इष्टतम समाधान का उत्पादन नहीं करता है और Greedy Algorithm की तुलना में एक और समाधान है (Greedy Algorithm द्वारा आउटपुट नहीं)।

A =
Greedy अनुसूची (जो एक Optimal कार्यक्रम नहीं है)
B = Optimal अनुसूची (सबसे अच्छा शेड्यूल जो आप बना सकते हैं)

Assumption # 1: सभी (पी [i] / T [i]) अलग हैं।
Assumption # 2: (सिर्फ सादगी के लिए, सामान्यता को प्रभावित नहीं करेगा) (P [1] / T [1])> (P [2] / T [2])> ....> (P [N] / टी [एन])

Assumption # 2 की धारणा के कारण,
Greedy अनुसूची ए = (1, 2, 3, ....., एन) होगी। चूँकि A Optimal नहीं है (जैसा कि हमने ऊपर माना है) और A, B के बराबर नहीं है (क्योंकि B इष्टतम है), आप दावा कर सकते हैं कि B में दो लगातार नौकरियां होनी चाहिए (i, j) जैसे कि उन 2 लगातार नौकरियों में से पहले की है एक बड़ा सूचकांक (i> j)। यह सच है क्योंकि एकमात्र अनुसूची जिसमें संपत्ति है, जिसमें केवल सूचकांक ऊपर जाते हैं, ए = (1, 2, 3, ...., एन) है।

इसलिए, बी = (1, 2, ..., आई, जे, ..., एन) जहां मैं> जे।

आपको यह भी सोचना होगा कि इन 2 नौकरियों को स्वैप करने पर लाभ या हानि प्रभाव क्या है। निम्नलिखित के पूरा होने पर इस स्वैप के प्रभाव के बारे में सोचें:

  1.     I और j के अलावा अन्य k पर काम करें
  2.     मैं पर काम
  3.     J पर काम करें

K के लिए, 2 मामले होंगे:

जब k, B के i और j के बाईं ओर है, यदि आप i और j को स्वैप करते हैं, तो k के पूरा होने के समय पर कोई प्रभाव नहीं पड़ेगा।

जब k बी स्वैपिंग के बाद i और j के दाईं ओर होता है, तो k का पूरा होने का समय C (k) = T [1] + T [2] + .. + T [j] + T [i] + होता है। .टी [के], के ही रहेगा।

I पूर्ण समय के लिए: स्वैप करने से पहले C (i) = T [1] + T [2] + ... + T [i] स्वैपिंग के बाद C (i) = T [1] + T [2] + होता है ... + टी [जे] + टी [मैं]

स्पष्ट रूप से, i के लिए पूरा होने का समय T [j] तक जाता है और j के लिए पूरा होने का समय T [i] से कम हो जाता है।

Loss due to the swap is (P[i] * T[j])
Profit due to the swap is (P[j] * T[i])

# 2 का उपयोग करते हुए, i> j का तात्पर्य है कि (P [i] / T [i]) <(P [j] / T [j])। इसलिए (P [i] * T [j]) <(P [j] * T [i]) जिसका अर्थ है Mean Lose < Profit। इसका मतलब है कि स्वैप बी को बेहतर बनाता है लेकिन यह एक विरोधाभास है क्योंकि हमने मान लिया है कि बी इष्टतम कार्यक्रम है। इससे हमारा प्रमाण पूरा होता है।
Greedy Algorithm का उपयोग कहां करें?

एक समस्या को काम करने के लिए एक
Greedy Algorithm के लिए इन दो घटकों को शामिल करना चाहिए:

    इसमें इष्टतम सबस्ट्रक्चर हैं। समस्या के लिए Optimal समाधान में उप-समस्याओं का इष्टतम समाधान होता है।

    इसके पास एक Greedy संपत्ति है (इसकी शुद्धता साबित करने के लिए कठिन!)। यदि आप एक ऐसा विकल्प बनाते हैं जो इस समय सबसे अच्छा लगता है और शेष उप-समस्याओं को बाद में हल करता है, तो आप अभी भी एक इष्टतम समाधान तक पहुंच सकते हैं। आपको अपने पहले के विकल्पों पर पुनर्विचार नहीं करना होगा।

उदाहरण के लिए:

    Activity Selection problem
    Fractional Knapsack problem
    Scheduling problem

उदाहरण


Greedy विधि काफी शक्तिशाली है और समस्याओं की एक विस्तृत श्रृंखला के लिए अच्छी तरह से काम करती है। कई एल्गोरिदम को 
Greedy Algorithm के अनुप्रयोगों के रूप में देखा जा सकता है, जैसे (शामिल है लेकिन यह सीमित नहीं है):

    Minimum Spanning Tree
    Dijkstra’s algorithm for shortest paths from a single source
    Huffman codes ( data-compression codes )