Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> JavaScript

जावास्क्रिप्ट में फ्लॉयड-वार्शल एल्गोरिदम


डिज्क्स्ट्रा का एल्गोरिदम एक नोड से अन्य सभी नोड्स तक के सबसे छोटे पाथ की दूरी/पाथ को खोजने के लिए उपयोग किया जाता है। ऐसे मामले होते हैं जहां हमें सभी नोड्स से अन्य सभी नोड्स तक के सबसे छोटे पाथ खोजने की आवश्यकता होती है। यहीं ऑल-पेयर्स शॉर्टेस्ट पाथ एल्गोरिदम काम आते हैं। सबसे अधिक उपयोग किया जाने वाला ऑल-पेयर्स शॉर्टेस्ट पाथ एल्गोरिदम फ्लॉयड-वार्शल एल्गोरिदम है।

फ्लॉयड-वार्शल एल्गोरिदम इस प्रकार काम करता है:

  • हम दूरियों के N x N मैट्रिक्स को इनफिनिटी से इनिशियलाइज़ करते हैं।
  • फिर प्रत्येक एज u, v के लिए, हम इस मैट्रिक्स को इस एज के वजन को दिखाने के लिए अपडेट करते हैं और एज v, v के लिए हम वजन को 0 पर अपडेट करते हैं।
  • हम I, j और k इटरेटर्स के साथ 3 नेस्टेड लूप बनाते हैं। हर नोड I की हर नोड j से दूरी के लिए, हम k को इंटरमीडिएट पॉइंट्स के रूप में मानते हैं और दूरी को अपडेट करते हैं अगर हमें मौजूदा arr[i][j] से कम दूरी मिलती है।

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

अब आइए इसके कार्यान्वयन को देखते हैं:

उदाहरण

floydWarshallAlgorithm() {
    let dist = {};
    for (let i = 0; i < this.nodes.length; i++) {
        dist[this.nodes[i]] = {};
        // मौजूदा एज के लिए डिस्ट को वजन के समान असाइन करें
        this.edges[this.nodes[i]].forEach(e => (dist[this.nodes[i]][e.node] = e.weight));
        this.nodes.forEach(n => {
            // अन्य सभी नोड्स के लिए इसे इनफिनिटी असाइन करें
            if (dist[this.nodes[i]][n] == undefined)
                dist[this.nodes[i]][n] = Infinity;
            // सेल्फ एज के लिए डिस्ट को 0 असाइन करें
            if (this.nodes[i] === n) dist[this.nodes[i]][n] = 0;
        });
    }
    this.nodes.forEach(i => {
        this.nodes.forEach(j => {
            this.nodes.forEach(k => {
                // जांचें कि i से k फिर k से j जाना बेहतर है
                // सीधे i से j जाने से। अगर हां तो अपडेट करें
                // i से j वैल्यू को नई वैल्यू से
                if (dist[i][k] + dist[k][j] < dist[i][j])
                    dist[i][j] = dist[i][k] + dist[k][j];
            });
        });
    });
    return dist;
}

आप इसका परीक्षण इस तरह कर सकते हैं:

उदाहरण

let g = new Graph();
g.addNode("A");
g.addNode("B");
g.addNode("C");
g.addNode("D");
g.addEdge("A", "C", 100);
g.addEdge("A", "B", 3);
g.addEdge("A", "D", 4);
g.addEdge("D", "C", 3);
console.log(g.floydWarshallAlgorithm());

आउटपुट

इससे निम्न आउटपुट मिलेगा:

{
    A: { C: 7, B: 3, D: 4, A: 0 },
    B: { A: 3, B: 0, C: 10, D: 7 },
    C: { A: 7, D: 3, B: 10, C: 0 },
    D: { A: 4, C: 3, B: 7, D: 0 }
}

  1. जावास्क्रिप्ट में new.target जावास्क्रिप्ट में new.target

    new.target एक मेटाप्रॉपर्टी है जो हमें रनटाइम पर यह निर्धारित करने की अनुमति देती है कि कोई फ़ंक्शन या कंस्ट्रक्टर new कीवर्ड का उपयोग करके बुलाया गया था या नहीं। जावास्क्रिप्ट में new.target के लिए निम्नलिखित कोड है: उदाहरण <!DOCTYPE html> <html lang="en"> <head> <me

  1. जावास्क्रिप्ट में डिबगर स्टेटमेंट जावास्क्रिप्ट में डिबगर स्टेटमेंट

    जावास्क्रिप्ट में डिबगर स्टेटमेंट का उपयोग कोड में ब्रेकपॉइंट सेट करने के लिए किया जाता है। कोड का निष्पादन डिबगर स्टेटमेंट का सामना करते ही रुक जाता है और डिबगर फ़ंक्शन को कॉल करता है (यदि उपलब्ध हो)। जावास्क्रिप्ट में डिबगर स्टेटमेंट लागू करने के लिए निम्नलिखित कोड है: उदाहरण <!DOCTYPE html>

  1. जावास्क्रिप्ट में image() ऑब्जेक्ट जावास्क्रिप्ट में image() ऑब्जेक्ट

    image ऑब्जेक्ट HTML  एलिमेंट को दर्शाता है। जावास्क्रिप्ट में image ऑब्जेक्ट के लिए निम्नलिखित कोड है: उदाहरण <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initia