BCA / B.Tech 11 min read

Algorithm of Graph in Hindi

Graph Algorithm in Hindi | ग्राफ एल्गोरिदम :

 
ग्राफ एल्गोरिदम का उपयोग ग्राफ डेटा संरचना में विभिन्न कार्यों को निष्पादित करने के लिए किया जाता है, जैसे कि पथ ढूंढना, ग्राफ को ट्रैवर्स करना, कनेक्टिविटी की जाँच करना, और न्यूनतम स्पैनिंग ट्री (Minimum Spanning Tree) खोजना। ग्राफ एल्गोरिदम कम्प्यूटर विज्ञान में बहुत महत्वपूर्ण भूमिका निभाते हैं क्योंकि ये नेटवर्क्स, सोशल कनेक्शन, ट्रांसपोर्ट सिस्टम और अन्य संबंधित क्षेत्रों में प्रभावी समाधान प्रदान करते हैं।

Introduction to Graph Algorithm in Data Structure in Hindi |  ग्राफ एल्गोरिदम का परिचय :

ग्राफ एल्गोरिदम वे नियमों का समूह होते हैं जो ग्राफ की विभिन्न समस्याओं को हल करने के लिए उपयोग किए जाते हैं। ये एल्गोरिदम ग्राफ में नोड्स और कड़ियों के आधार पर विभिन्न ऑपरेशन्स को निष्पादित करते हैं। ग्राफ एल्गोरिदम आमतौर पर निम्नलिखित समस्याओं को हल करते हैं:

  • ग्राफ ट्रैवर्सल (Graph Traversal): इसमें ग्राफ के सभी नोड्स को एक्सप्लोर करना शामिल होता है।
  • शॉर्टेस्ट पाथ एल्गोरिदम (Shortest Path Algorithm): इसमें किसी नोड से दूसरे नोड तक का सबसे छोटा रास्ता खोजना शामिल होता है।
  • स्पैनिंग ट्री एल्गोरिदम (Spanning Tree Algorithm): ग्राफ के सभी नोड्स को कनेक्ट करने वाले ट्री को ढूंढना।
  • कनेक्टिविटी जाँच (Checking Connectivity): यह जांचना कि ग्राफ के सभी नोड्स एक-दूसरे से जुड़े हुए हैं या नहीं।

साइक्ल जाँच (Cycle Detection): ग्राफ में साइक्ल्स की उपस्थिति का पता लगाना।

Major Graph Algorithms in Data Structure in Hindi | प्रमुख ग्राफ एल्गोरिदम :

1. ग्राफ ट्रैवर्सल एल्गोरिदम (Graph Traversal Algorithms)

ग्राफ ट्रैवर्सल का मतलब होता है कि ग्राफ के सभी नोड्स को क्रमशः एक्सप्लोर करना। ग्राफ में ट्रैवर्सल के लिए मुख्यतः दो एल्गोरिदम का उपयोग किया जाता है:

ब्रेथ फर्स्ट सर्च (BFS - Breadth First Search):

  • यह एल्गोरिदम ग्राफ को स्तर अनुसार (level-wise) एक्सप्लोर करता है।
  • इसमें पहले सभी नोड्स का पहला लेवल देखा जाता है, फिर दूसरे लेवल के नोड्स को देखा जाता है।
  • इसे एक लाइन में कहा जा सकता है कि यह सबसे पहले नोड के पड़ोसियों (neighbors) को एक्सप्लोर करता है।
  • BFS एल्गोरिदम का उपयोग शॉर्टेस्ट पाथ ढूंढने और कनेक्टिविटी की जाँच के लिए किया जाता है।

BFS एल्गोरिदम के चरण:

  • एक प्रारंभिक नोड को चुने।
  • उस नोड को विजिट करें और उसकी सभी कड़ियों को देखें।
  • उन नोड्स को एक कतार (queue) में जोड़ें।
  • कतार से एक नोड निकालें और उसके पड़ोसियों को देखें।
  • प्रक्रिया को तब तक दोहराएं जब तक सभी नोड्स एक्सप्लोर न हो जाएं।

डेप्थ फर्स्ट सर्च (DFS - Depth First Search):

  • यह एल्गोरिदम गहराई में जाकर ग्राफ को एक्सप्लोर करता है।
  • एक नोड से शुरुआत करके इसे अधिकतम गहराई तक एक्सप्लोर किया जाता है और फिर बैकट्रैक किया जाता है।
  • इसका उपयोग साइकल जाँच और ग्राफ कनेक्टिविटी की जाँच के लिए किया जाता है।

DFS एल्गोरिदम के चरण:

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

2. शॉर्टेस्ट पाथ एल्गोरिदम (Shortest Path Algorithms)

डिजकस्ट्रा एल्गोरिदम (Dijkstra's Algorithm):

  • डिजकस्ट्रा एल्गोरिदम का उपयोग ग्राफ में किसी नोड से दूसरे नोड तक के सबसे छोटे पथ को खोजने के लिए किया जाता है।
  • यह वज़नित (weighted) ग्राफ में काम करता है जहां धारों का भार होता है।
  • यह एल्गोरिदम पहले नोड से प्रारंभ करता है और सभी संभावित पथों की लंबाई की तुलना करके सबसे छोटे पथ को चुनता है।

डिजकस्ट्रा एल्गोरिदम के चरण:

  • सभी नोड्स की दूरी को अनंत (infinity) सेट करें सिवाय प्रारंभिक नोड के।
  • प्रारंभिक नोड से शुरू करें और उसके पड़ोसी नोड्स को देखें।
  • सबसे छोटे पथ का चयन करें और उसकी दूरी को अपडेट करें।
  • प्रक्रिया को तब तक दोहराएं जब तक सभी नोड्स को एक्सप्लोर न कर लिया जाए।

बेलमैन-फोर्ड एल्गोरिदम (Bellman-Ford Algorithm):

  • यह एल्गोरिदम भी शॉर्टेस्ट पाथ के लिए उपयोग होता है, लेकिन यह नकारात्मक वज़न वाली धारों (negative weight edges) वाले ग्राफ के लिए भी काम करता है।
  • डिजकस्ट्रा एल्गोरिदम के विपरीत, यह एल्गोरिदम प्रत्येक नोड को क्रमिक रूप से अपडेट करता है।

3. स्पैनिंग ट्री एल्गोरिदम (Spanning Tree Algorithm)

प्रिम्स एल्गोरिदम (Prim’s Algorithm):

इसका उपयोग न्यूनतम स्पैनिंग ट्री (Minimum Spanning Tree) खोजने के लिए किया जाता है।
यह एल्गोरिदम एक नोड से शुरू होकर सबसे छोटे भार वाली धार को चुनता है और ट्री को बढ़ाता है।

क्रुसकल्स एल्गोरिदम (Kruskal’s Algorithm):

यह भी न्यूनतम स्पैनिंग ट्री खोजने के लिए उपयोग किया जाता है, लेकिन इसमें धारों को उनके वज़न के अनुसार चुना जाता है।
सबसे छोटे वज़न वाली धार को चुना जाता है और एक ट्री का निर्माण किया जाता है।

 Applications of Graph Algorithms in Data Structure in Hindi | ग्राफ एल्गोरिदम के उपयोग :

ग्राफ एल्गोरिदम के कई उपयोग होते हैं जो विभिन्न क्षेत्रों में लागू होते हैं:

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


 Characteristics of Pointer in Data Structure in Hindi | पॉइंटर की विशेषताएँ :

पॉइंटर में कुछ मुख्य विशेषताएँ होती हैं, जो इसे सामान्य वेरिएबल से अलग बनाती हैं:

1. मेमोरी एड्रेस का स्टोर करना (Stores Memory Address)

पॉइंटर किसी अन्य वेरिएबल के मेमोरी लोकेशन (अड्रेस) को स्टोर करता है, जिसे सीधे एक्सेस किया जा सकता है। उदाहरण:

int a = 10;
int *p = &a; // 'a' का मेमोरी एड्रेस 'p' में स्टोर होता है।

2. डायरेक्ट मेमोरी एक्सेस (Direct Memory Access)

पॉइंटर का सबसे बड़ा फायदा यह है कि यह मेमोरी को डायरेक्ट एक्सेस कर सकता है, जिससे प्रोग्राम अधिक कुशल हो सकता है। डायरेक्ट मेमोरी एक्सेस के कारण, पॉइंटर मेमोरी इंटेंसिव ऑपरेशंस के लिए उपयोगी होते हैं।

3. डेटा और एड्रेस को अलग-अलग संभालना (Handles Data and Address Separately)

सामान्य वेरिएबल केवल डेटा स्टोर करते हैं, जबकि पॉइंटर डेटा के साथ-साथ उस डेटा का एड्रेस भी संभालता है। इससे डेटा और एड्रेस दोनों को अलग-अलग नियंत्रित किया जा सकता है।

4. डायनामिक मेमोरी एलोकेशन (Dynamic Memory Allocation)

पॉइंटर के द्वारा हम डायनामिक मेमोरी एलोकेशन कर सकते हैं, यानी रन-टाइम पर मेमोरी को एलोकेट और डीलोकेट कर सकते हैं। इसके लिए malloc(), calloc(), और free() जैसी फंक्शन का उपयोग किया जाता है।

int *p = (int *)malloc(sizeof(int));
*p = 20; // डायनामिक मेमोरी में वैल्यू असाइन करना।

5. फंक्शन पॉइंटर्स (Function Pointers)

पॉइंटर का उपयोग फंक्शन को पॉइंट करने के लिए भी किया जा सकता है, जिससे हम किसी फंक्शन को डायनेमिक रूप से कॉल कर सकते हैं। उदाहरण:

void func() {
    printf("Hello, World!");
}
void (*fptr)() = func;
fptr(); // Function को पॉइंटर के द्वारा कॉल करना।

6. कॉन्टिग्यूस मेमोरी एक्सेस (Contiguous Memory Access)

पॉइंटर का उपयोग एरे जैसी स्ट्रक्चर्स में किया जाता है, जो कॉन्टिग्यूस (लगातार) मेमोरी में स्टोर होते हैं। इससे पॉइंटर के द्वारा मेमोरी को आसानी से एक्सेस किया जा सकता है।

7. मल्टी-लेवल पॉइंटर (Multi-Level Pointers)

पॉइंटर के माध्यम से हम मल्टी-लेवल पॉइंटर बना सकते हैं, यानी एक पॉइंटर किसी दूसरे पॉइंटर को पॉइंट करता है। इससे हम जटिल डेटा स्ट्रक्चर्स को आसानी से मैनेज कर सकते हैं।

int a = 10;
int *p = &a;
int **pp = &p; // Multi-level pointer