जिकस्ट्रा के एल्गोरिथम का उपयोग एक नोड से अन्य सभी नोड्स तक के सबसे छोटे पथ की दूरी/पथ को खोजने के लिए किया जाता है। ऐसे मामले हैं जहां हमें सभी नोड्स से अन्य सभी नोड्स के लिए सबसे छोटा रास्ता खोजने की आवश्यकता है। यह वह जगह है जहां सभी जोड़े सबसे छोटा पथ एल्गोरिदम काम में आते हैं। सबसे अधिक इस्तेमाल किया जाने वाला सबसे छोटा पथ एल्गोरिथम फ़्लॉइड वारशॉल एल्गोरिथम है।
फ़्लॉइड वारशॉल एल्गोरिथम निम्न प्रकार से कार्य करता है -
- हम दूरियों के एक N x N मैट्रिक्स को इनफिनिटी के रूप में प्रारंभ करते हैं।
- फिर प्रत्येक किनारे u, v के लिए, हम इस मैट्रिक्स को इस किनारे का भार दिखाने के लिए अपडेट करते हैं और किनारों v, v के लिए हम वजन को 0 पर अपडेट करते हैं।
- हम इटरेटर I, j और k के साथ 3 नेस्टेड लूप बनाते हैं। प्रत्येक नोड के लिए I की दूरी प्रत्येक नोड j के लिए, हम k को मध्यवर्ती बिंदुओं के रूप में उपयोग करने पर विचार करते हैं और यदि हमें मौजूदा arr[i][j] से कम मिलता है तो दूरी को अपडेट करें।
मैट्रिक्स का उपयोग करने के बजाय, हम किसी ऑब्जेक्ट का उपयोग करेंगे क्योंकि यदि हम प्रत्येक नोड का प्रतिनिधित्व करने के लिए जटिल ऑब्जेक्ट का उपयोग कर रहे हैं तो हमें इंडेक्स का ट्रैक रखने की आवश्यकता नहीं है।
आइए अब उसी के क्रियान्वयन पर एक नजर डालते हैं -
उदाहरण
floydWarshallAlgorithm() { let dist ={}; के लिए (चलो मैं =0; मैं(dist[this.nodes[i]][e.node] =e.weight) ); this.nodes.forEach(n => {// अन्य सभी नोड्स के लिए इसे अनंत को असाइन करें यदि (dist[this.nodes[i]][n] ==undefined) dist[this.nodes[i]][n] =इन्फिनिटी; // सेल्फ एज के लिए डिस्ट को 0 पर असाइन करें यदि (यह। नोड्स [i] ===n) डिस्ट [यह। नोड्स [i]] [n] =0;}); } यह। सीधे i से j तक जा रहा है। यदि हाँ तो // i से j मान को नए मान में अपडेट करें यदि (dist[i][k] + dist[k][j] आप -
. का उपयोग करके इसका परीक्षण कर सकते हैंउदाहरण
चलो g =नया ग्राफ़ ();g.addNode("A");g.addNode("B");g.addNode("C");g.addNode("D");g.addEdge ("ए", "सी", 100);g.addEdge("A", "B", 3);g.addEdge("A", "D", 4);g.addEdge("D", "सी", 3);console.log(g.floydWarshallAlgorithm());आउटपुट
यह आउटपुट देगा -
{ए:{सी:7, बी:3, डी:4, ए:0}, बी:{ए:3, बी:0, सी:10, डी:7}, सी:{ए:7 , डी:3, बी:10, सी:0}, डी:{ए:4, सी:3, बी:7, डी:0}}