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

जावास्क्रिप्ट में प्रिम एल्गोरिदम


प्रिम का एल्गोरिदम एक लालची एल्गोरिदम है जो वेटेड अनडायरेक्टेड ग्राफ के लिए न्यूनतम स्पैनिंग ट्री ढूंढता है। यह एजेज का एक सबसेट ढूंढता है जो एक ट्री बनाता है जिसमें हर वर्टेक्स शामिल होता है, जहां ट्री में सभी एजेज का कुल वजन न्यूनतम होता है।

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

प्रिम का एल्गोरिदम कैसे काम करता है?

आइए देखते हैं कि प्रिम का एल्गोरिदम कैसे काम करता है इसका एक चित्रण:

1. किसी भी मनमाने नोड को रूट नोड के रूप में चुनें: इस मामले में, हम S नोड को प्रिम के स्पैनिंग ट्री के रूट नोड के रूप में चुनते हैं। यह नोड मनमाने ढंग से चुना जाता है, इसलिए कोई भी नोड रूट नोड हो सकता है। कोई आश्चर्य कर सकता है कि कोई भी वीडियो रूट नोड क्यों हो सकता है। तो जवाब है, स्पैनिंग ट्री में ग्राफ के सभी नोड्स शामिल होते हैं और क्योंकि यह कनेक्टेड है तो कम से कम एक एज होनी चाहिए, जो इसे बाकी ट्री से जोड़ेगी।

2. आउटगोइंग एजेज की जांच करें और कम लागत वाले को चुनें: रूट नोड S चुनने के बाद, हम देखते हैं कि S, A और S, C दो एज हैं जिनका वजन क्रमशः 7 और 8 है। हम एज S, A को चुनते हैं क्योंकि यह दूसरे से कम है।

जावास्क्रिप्ट में प्रिम एल्गोरिदम

अब, ट्री S-7-A को एक नोड के रूप में माना जाता है और हम इससे बाहर जाने वाली सभी एजेज की जांच करते हैं। हम सबसे कम लागत वाले को चुनते हैं और इसे ट्री में शामिल करते हैं।

जावास्क्रिप्ट में प्रिम एल्गोरिदम

इस चरण के बाद, S-7-A-3-C ट्री बनता है। अब हम फिर से इसे एक नोड के रूप में मानेंगे और सभी एजेज की फिर से जांच करेंगे। हालांकि, हम केवल सबसे कम लागत वाली एज चुनेंगे। इस मामले में, C-3-D नई एज है, जो अन्य एजेज की लागत 8, 6, 4 आदि से कम है।

जावास्क्रिप्ट में प्रिम एल्गोरिदम

नोड D को स्पैनिंग ट्री में जोड़ने के बाद, अब हमारे पास इससे बाहर जाने वाली दो एज हैं जिनकी लागत समान है, यानी D-2-T और D-2-B। इस प्रकार, हम उनमें से किसी एक को जोड़ सकते हैं। लेकिन अगला चरण फिर से एज 2 को सबसे कम लागत के रूप में देगा। इसलिए, हम दोनों एजेज शामिल करके स्पैनिंग ट्री दिखा रहे हैं।

जावास्क्रिप्ट में प्रिम एल्गोरिदम

अब आइए देखते हैं कि हम इसे अपने कोड में कैसे लागू कर सकते हैं:

उदाहरण

primsMST() {
    // MST रखने वाला ग्राफ इनिशियलाइज़ करें
    const MST = new Graph();
    if (this.nodes.length === 0) {
        return MST;
    }
    // पहले नोड को शुरुआती नोड के रूप में चुनें
    let s = this.nodes[0];
    // प्रायोरिटी क्यू और एक्सप्लोर्ड सेट बनाएं
    let edgeQueue = new PriorityQueue(this.nodes.length * this.nodes.length);
    let explored = new Set();
    explored.add(s);
    MST.addNode(s);
    // इस शुरुआती नोड से सभी एजेज को वजन को प्रायोरिटी के रूप में लेकर PQ में जोड़ें
    this.edges[s].forEach(edge => {
        edgeQueue.enqueue([s, edge.node], edge.weight);
    });
    // सबसे छोटी एज लें और उसे नए ग्राफ में जोड़ें
    let currentMinEdge = edgeQueue.dequeue();
    while (!edgeQueue.isEmpty()) {
        // अनएक्सप्लोर्ड नोड वाली एज मिलने तक एज हटाते रहें
        while (!edgeQueue.isEmpty() && explored.has(currentMinEdge.data[1])) {
            currentMinEdge = edgeQueue.dequeue();
        }
        let nextNode = currentMinEdge.data[1];
        // फिर से जांचें क्योंकि क्यू अनएक्सप्लोर्ड एलिमेंट दिए बिना खाली हो सकती है
        if (!explored.has(nextNode)) {
            MST.addNode(nextNode);
            MST.addEdge(currentMinEdge.data[0], nextNode, currentMinEdge.priority);
            // फिर से सभी एजेज को PQ में जोड़ें
            this.edges[nextNode].forEach(edge => {
                edgeQueue.enqueue([nextNode, edge.node], edge.weight);
            });
            // इस नोड को एक्सप्लोर्ड मार्क करें
            explored.add(nextNode);
            s = nextNode;
        }
    }
    return MST;
}

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

let g = new Graph();
g.addNode("A");
g.addNode("B");
g.addNode("C");
g.addNode("D");
g.addNode("E");
g.addNode("F");
g.addNode("G");
g.addEdge("A", "C", 100);
g.addEdge("A", "B", 3);
g.addEdge("A", "D", 4);
g.addEdge("C", "D", 3);
g.addEdge("D", "E", 8);
g.addEdge("E", "F", 10);
g.addEdge("B", "G", 9);
g.primsMST().display();

आउटपुट

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

A->B, D
B->A, G
D->A, C, E
C->D
E->D, F
G->B
F->E

ध्यान दें कि हमारा प्रारंभिक ग्राफ था:

उदाहरण

/**
 *       A
 *     / | \
 *    C  | B
 *     \ | |
 *      D G
 *      | /
 *      E
 *      |
 *      F */

आउटपुट

हमारा वर्तमान ग्राफ इस तरह दिखता है:

/**
 *       A
 *       |\
 *    C  | B
 *     \ | |
 *      D G
 *      |
 *      E
 *      |
 *      F
 *      * */

हमने सबसे महंगी एजेज को हटा दिया है और अब हमारे पास एक स्पैनिंग ट्री है।


  1. जावास्क्रिप्ट में बाइनरी ट्री जावास्क्रिप्ट में बाइनरी ट्री

    बाइनरी ट्री डेटा स्टोरेज उद्देश्यों के लिए उपयोग की जाने वाली एक विशेष डेटा संरचना है। बाइनरी ट्री में एक विशेष शर्त होती है कि प्रत्येक नोड में अधिकतम दो चाइल्ड हो सकते हैं। बाइनरी ट्री में एक क्रमबद्ध ऐरे और एक लिंक्ड लिस्ट दोनों के लाभ होते हैं क्योंकि सर्च क्रमबद्ध ऐरे की तरह तेज़ होता है और इं

  1. जावास्क्रिप्ट में AVL रोटेशन्स जावास्क्रिप्ट में AVL रोटेशन्स

    स्वयं को बैलेंस करने के लिए, एक AVL ट्री निम्नलिखित चार प्रकार के रोटेशन कर सकता है: लेफ्ट रोटेशन राइट रोटेशन लेफ्ट-राइट रोटेशन राइट-लेफ्ट रोटेशन पहले दो रोटेशन सिंगल रोटेशन हैं और अगले दो डबल रोटेशन हैं। एक अनबैलेंस्ड ट्री होने के लिए, हमें कम से कम ऊंचाई 2 के ट्री की आवश्यकता होती है। इस सरल ट्

  1. JavaScript में चाइल्ड नोड काउंट कैसे प्राप्त करें? JavaScript में चाइल्ड नोड काउंट कैसे प्राप्त करें?

    उदाहरण children.length प्रॉपर्टी से चाइल्ड नोड्स की संख्या गिनें। <!DOCTYPE html> <html lang=en> <head> <meta charset=UTF-8> <meta name=viewport content=width=device-width, initial-scale=1.0> <title>Document</title> </head> <body> <lab