इस तरह एक ग्राफ पर विचार करें। एक सामान्य बीएफएस सीधे ए से बी तक पथ लेगा, बी को चिह्नित के रूप में चिह्नित करेगा, और ए से सी को चिह्नित करेगा, जैसा सी देखा गया है।
अगले चरण में, सी, बी से प्रचारित पहले से ही चिह्नित किया गया है, इसलिए सी से बी के पथ को संभावित छोटे पथ के रूप में नहीं माना जाएगा, और बीएफएस आपको बताएगा कि ए से सबसे छोटा रास्ता बी का वजन 3.
आप भारित ग्राफ पर सबसे कम पथ खोजने के लिए बीएफएस के बजाय Dijkstra's algorithm का उपयोग कर सकते हैं। कार्यात्मक रूप से, एल्गोरिदम बीएफएस के समान ही है, और बीएफएस के समान तरीके से लिखा जा सकता है। एकमात्र चीज जो बदलती है वह वह क्रम है जिसमें आप नोड्स पर विचार करते हैं।
उदाहरण के लिए, उपरोक्त आलेख में, ए से शुरू होने पर, एक बीएफएस ए -> बी, फिर ए -> सी को संसाधित करेगा, और वहां रुक जाएगा क्योंकि सभी नोड्स देखे गए हैं।
दूसरी ओर, डिज्कस्ट्रा एल्गोरिथ्म के रूप में काम करेगा इस प्रकार है:
- पर विचार करें A -> सी
- पर विचार सी (चूंकि यह एक से सबसे कम बढ़त वजन है) -> बी (चूंकि यह अब तक पहुंचने वाले किसी भी नोड से सबसे कम वजन वाला किनारा है, जिसे हमने अभी तक नहीं माना है)
- ए -> बी पर विचार करें और अनदेखा करें क्योंकि बी पहले से ही देखा जा चुका है।
ध्यान दें कि अंतर केवल क्रम में स्थित है जिसमें किनारों का निरीक्षण किया जाता है। एक BFS, अन्य नोड्स पर जाने से पहले एक भी नोड से सभी किनारों पर विचार करेगी, जबकि डिज्कस्ट्रा एल्गोरिथ्म हमेशा सबसे कम वजन अनदेखी बढ़त पर विचार करेंगे, से जुड़ा किनारों के सेट से सभी नोड्स कि इतने देखा गया है दूर।यह भ्रामक लगता है, लेकिन स्यूडोकोड बहुत सरल है:
create a heap or priority queue
place the starting node in the heap
dist[2...n] = {∞}
dist[1] = 0
while the heap contains items:
vertex v = top of heap
pop top of heap
for each vertex u connected to v:
if dist[u] > dist[v] + weight of v-->u:
dist[u] = dist[v] + weight of edge v-->u
place u on the heap with weight dist[u]
विकिपीडिया से यह GIF क्या होता है का एक अच्छा दृश्य प्रदान करता है:
सूचना है कि यह बहुत ही BFS कोड के समान दिखता है, एकमात्र वास्तविक अंतर नियमित कतार डेटा संरचना की बजाय, नोड से दूरी से क्रमबद्ध एक ढेर का उपयोग होता है।
धन्यवाद लेकिन मुझे संदेह है। आपने समझाया कि डिज्कास्ट्रा ने उपरोक्त उदाहरण के लिए कैसे काम किया और उसने ए-सी से पथ चुना क्योंकि सी के लिए सबसे कम बढ़त वजन है। मान लीजिए, सी-> बी के किनारे का वजन 4 था और ए से किनारे थे -> डी (वजन 3) और डी-> बी (वजन 1)। आपने जो कहा है उसके आधार पर, किनारे ए-> सी और सी-> बी पहले ट्रैवर्स हो जाते हैं, है ना? फिर, मुझे लगता है कि ए-> डी और डी-> बी से किनारे को पार किया जाना चाहिए, भले ही बी को देखा गया हो, हम सबसे कम पथ खो देंगे। तो, हम उस मार्ग को कैसे नजरअंदाज कर सकते हैं? मुझे लगता है कि आपने बताया कि बिंदु 3 में। अगर मैं गलत हूं तो कृपया मुझे सही करें? :/.. धन्यवाद – user2125722
@ user2125722 ए-> सी पहले ट्रैवर्स किया जाएगा, क्योंकि यह सबसे कम वजन वाला किनारा है, उसके बाद ए-> बी और ए-> डी, फिर डी-> बी, फिर सी-> बी। यदि आपको समझ में नहीं आता कि यह मामला क्यों है, तो इस ग्राफ के लिए एल्गोरिदम के लिए छद्म कोड के माध्यम से कदम उठाने का प्रयास करें। – Greg
@ user2125722 ध्यान दें कि डिज्क्स्ट्रा के एल्गोरिदम में * देखा * की परिभाषा थोड़ा अलग है। मैंने वास्तव में क्या होता है यह स्पष्ट रूप से प्रतिबिंबित करने के लिए कोड अपडेट किया। – Greg