C ++ में ग्राफ़ की समस्याओं के लिए बेहतर, आसन्न सूचियाँ या आसन्न मैट्रिक्स क्या है?


129

C ++ में ग्राफ़ की समस्याओं के लिए बेहतर, आसन्न सूचियाँ या आसन्न मैट्रिक्स क्या है? हर एक के फायदे और नुकसान क्या हैं?


21
आपके द्वारा उपयोग की जाने वाली संरचना भाषा पर निर्भर नहीं करती है बल्कि उस समस्या पर है जिसे आप हल करने का प्रयास कर रहे हैं।
21

1
मैं djikstra एल्गोरिथ्म जैसे सामान्य उपयोग के लिए था, मैंने इस प्रश्न का कारण पूछा कि मुझे नहीं पता है कि इसे लागू करने के लिए लिंक करने योग्य सूची है क्योंकि यह आसन्न मैट्रिक्स की तुलना में कोड के लिए कठिन है।
मैजिक्स

C ++ में सूचियां टाइप करना जितना आसान है std::list(या अभी तक बेहतर है std::vector)।
अवकर

1
@ वकार: या std::dequeया std::set। यह इस बात पर निर्भर करता है कि समय के साथ ग्राफ क्या बदलेगा और आप उन पर क्या एल्गोरिदम चलाना चाहते हैं।
एलेक्जेंडर सी।

जवाबों:


125

यह समस्या पर निर्भर करता है।

सहखंडज मैट्रिक्स

  • O (n ^ 2) मेमोरी का उपयोग करता है

  • किसी भी दो नोड्स O (1) के बीच विशिष्ट किनारे की उपस्थिति या अनुपस्थिति के लिए यह देखना और जांचना तेज़ है
  • यह सभी किनारों पर पुनरावृति करने के लिए धीमा है
  • एक नोड को जोड़ना / हटाना धीमा है; एक जटिल ऑपरेशन O (n ^ 2)
  • यह एक नया किनारा जोड़ने के लिए तेजी से हे (1)

आसन्न सूची

  • मेमोरी का उपयोग किनारों की संख्या पर निर्भर करता है (नोड्स की संख्या नहीं),
    जो आसन्न मैट्रिक्स के फैलने पर बहुत सी मेमोरी को बचा सकता है।
  • किसी भी दो नोड्स के बीच विशिष्ट बढ़त की उपस्थिति या अनुपस्थिति का पता लगाना
    मैट्रिक्स ओ (के) की तुलना में थोड़ा धीमा है; जहाँ k पड़ोसी की संख्या है
  • यह सभी किनारों पर तेजी से चलना है क्योंकि आप सीधे किसी भी नोड पड़ोसियों तक पहुंच सकते हैं
  • एक नोड को जोड़ना / हटाना तेज़ है; मैट्रिक्स प्रतिनिधित्व की तुलना में आसान है
  • यह तेजी से एक नई बढ़त ओ (1) जोड़ने के लिए

लिंक की गई सूचियां कोड के लिए कठिन हैं, क्या आपको लगता है कि कार्यान्वयन उन्हें सीखने में कुछ समय बिताने के लायक है?
मैजिक्स

11
@magiix: हाँ मुझे लगता है कि आपको यह समझना चाहिए कि यदि आवश्यक हो तो लिंक की गई कोड को कैसे कोड किया जाए, लेकिन पहिया को सुदृढ़
मार्क बायर्स

क्या कोई कह सकता है कि लिंक सूची प्रारूप में चौड़ाई पहले खोज के लिए एक स्वच्छ कोड के साथ एक लिंक प्रदान कर सकता है ??
मैजिक्स

Std का उपयोग करना :: सूची geeksforgeeks.org/breadth-first-traversal-for-a-graph
atif93

78

यह उत्तर केवल C ++ के लिए नहीं है क्योंकि उल्लिखित सब कुछ स्वयं डेटा संरचनाओं के बारे में है, चाहे भाषा कोई भी हो। और, मेरा उत्तर यह मान रहा है कि आप आसन्न सूचियों और मैट्रिसेस की मूल संरचना को जानते हैं।

स्मृति

यदि मेमोरी आपकी प्राथमिक चिंता है, तो आप एक सरल ग्राफ के लिए इस फॉर्मूले का पालन कर सकते हैं जो लूप की अनुमति देता है:

एक निकटता मैट्रिक्स n पर 2 /8 बाइट अंतरिक्ष (प्रवेश प्रति एक बिट)।

एक आसन्न सूची 8e स्थान पर है, जहां ई किनारों की संख्या (32 बिट कंप्यूटर) है।

यदि हम ग्राफ के घनत्व को d = e / n 2 (किनारों की अधिकतम संख्या से विभाजित किनारों की संख्या) के रूप में परिभाषित करते हैं , तो हम "ब्रेकप्वाइंट" पा सकते हैं जहां एक सूची मैट्रिक्स से अधिक मेमोरी लेती है:

8e> n 2 /8 जब d> 1/64

तो इन संख्याओं के साथ (अभी भी 32-बिट विशिष्ट) 1/64 पर ब्रेकपॉइंट भूमि । यदि घनत्व (e / n 2 ) 1/64 से बड़ा है, तो एक मैट्रिक्स बेहतर है यदि आप स्मृति को सहेजना चाहते हैं।

आप इसके बारे में विकिपीडिया (आसन्न matrices पर लेख) और कई अन्य साइटों पर पढ़ सकते हैं ।

साइड नोट : एक हैश तालिका का उपयोग करके आसन्न मैट्रिक्स की अंतरिक्ष-दक्षता में सुधार कर सकते हैं जहां चाबियाँ वर्टिकल जोड़े (केवल अप्रत्यक्ष) हैं।

Iteration और लुकअप

निकटता सूची केवल मौजूदा किनारों का प्रतिनिधित्व करने का एक कॉम्पैक्ट तरीका है। हालाँकि, यह विशिष्ट किनारों की संभवतः धीमी खोज की लागत पर आता है। चूंकि प्रत्येक सूची एक शीर्ष की डिग्री के रूप में लंबे समय के रूप में सबसे खराब स्थिति लुकअप समय एक विशिष्ट किनारे के लिए जाँच का समय ओ (एन) बन सकता है, अगर सूची अनियंत्रित है। हालांकि, एक शीर्ष के पड़ोसियों को देखते हुए तुच्छ हो जाता है, और एक विरल या छोटे ग्राफ के लिए आसन्न सूचियों के माध्यम से पुनरावृति की लागत नगण्य हो सकती है।

दूसरी ओर आसन्न मैट्रिसेस निरंतर लुकअप समय प्रदान करने के लिए अधिक स्थान का उपयोग करते हैं। चूंकि हर संभव प्रविष्टि मौजूद है, आप अनुक्रमित समय का उपयोग करके निरंतर समय में बढ़त के अस्तित्व की जांच कर सकते हैं। हालाँकि, पड़ोसी लुकअप O (n) लेता है क्योंकि आपको सभी संभावित पड़ोसियों की जांच करने की आवश्यकता होती है। स्पष्ट स्थान की कमी यह है कि विरल रेखांकन के लिए बहुत अधिक पैडिंग जोड़ी जाती है। इस पर अधिक जानकारी के लिए उपरोक्त स्मृति चर्चा देखें।

यदि आप अभी भी अनिश्चित हैं कि क्या उपयोग करें : अधिकांश वास्तविक दुनिया की समस्याएं विरल और / या बड़े रेखांकन पैदा करती हैं, जो आसन्न सूची के प्रतिनिधित्व के लिए बेहतर अनुकूल हैं। वे लागू करना कठिन लग सकता है, लेकिन मैं आपको विश्वास दिलाता हूं कि वे नहीं हैं, और जब आप बीएफएस या डीएफएस लिखते हैं और नोड के सभी पड़ोसियों को लाना चाहते हैं तो वे कोड की सिर्फ एक पंक्ति दूर हैं। हालाँकि, ध्यान दें कि मैं सामान्य रूप से आसन्न सूचियों को बढ़ावा नहीं दे रहा हूँ।


9
अंतर्दृष्टि के लिए +1, लेकिन आसन्न सूचियों को संग्रहीत करने के लिए उपयोग किए जाने वाले वास्तविक डेटा संरचना द्वारा इसे ठीक किया जाना है। आप प्रत्येक वर्टेक्स को अपनी आसन्न सूची को मानचित्र या वेक्टर के रूप में संग्रहीत करना चाहते हैं, जिस स्थिति में आपके सूत्रों में वास्तविक संख्याओं को अपडेट करना होगा। इसके अलावा, इसी तरह की गणना का उपयोग विशेष एल्गोरिदम की समय जटिलता के लिए ब्रेक-ईवन बिंदुओं का आकलन करने के लिए किया जा सकता है।
अलेक्जेंड्रे सी।

3
हाँ, यह सूत्र विशिष्ट परिदृश्य के लिए है। यदि आप एक मोटा जवाब चाहते हैं, तो आगे बढ़ें और इस सूत्र का उपयोग करें, या आवश्यकतानुसार अपने विनिर्देशों के अनुसार इसे संशोधित करें (उदाहरण के लिए, आजकल ज्यादातर लोगों के पास 64 बिट कंप्यूटर है :))
कीसर

1
रुचि रखने वालों के लिए, ब्रेकिंग पॉइंट (एन नोड के ग्राफ में औसत किनारों की अधिकतम संख्या) का सूत्र है e = n / s, जहां sसूचक आकार है।
deceleratedcaviar

33

ठीक है, मैंने ग्राफ़ पर बुनियादी संचालन के समय और स्थान की जटिलताओं को संकलित किया है।
नीचे की छवि स्व-व्याख्यात्मक होनी चाहिए।
ध्यान दें कि जब हम ग्राफ के घने होने की अपेक्षा करते हैं, तो आसन्न मैट्रिक्स कितना बेहतर है, और जब हम ग्राफ के विरल होने की उम्मीद करते हैं, तो आसन्नता की सूची कैसे बेहतर है।
मैंने कुछ धारणाएँ बनाई हैं। मुझसे पूछें कि क्या जटिलता (समय या स्थान) को स्पष्टीकरण की आवश्यकता है। (उदाहरण के लिए, एक विरल ग्राफ के लिए, मैंने एन को एक छोटा सा स्थिरांक मान लिया है, क्योंकि मैंने मान लिया है कि एक नए शीर्ष के अलावा केवल कुछ किनारों को जोड़ा जाएगा, क्योंकि हम उम्मीद करते हैं कि ग्राफ़ को जोड़ने के बाद भी विरल बने रहेंगे शीर्ष।)

अगर कोई गलती हो तो कृपया मुझे बताएं।

यहाँ छवि विवरण दर्ज करें


यदि यह ज्ञात नहीं है कि ग्राफ एक घना है या विरल है, तो क्या यह कहना सही होगा कि आसन्न सूची के लिए स्थान की जटिलता O (v + e) ​​होगी?

अधिकांश व्यावहारिक एल्गोरिदम के लिए, सबसे महत्वपूर्ण संचालन में से एक दिए गए शीर्ष से बाहर जाने वाले सभी किनारों के माध्यम से पुनरावृत्ति करता है। आप इसे अपनी सूची में जोड़ना चाह सकते हैं - यह एएल के लिए ओ (डिग्री) और एएम के लिए ओ (वी) है।
अधिकतम

@ जॉन ने यह कहना बेहतर नहीं है कि AL के लिए एक शीर्ष (समय) जोड़ना O (1) है क्योंकि O (en) के बजाय क्योंकि हम वास्तव में एक शीर्ष जोड़ने पर किनारों को नहीं जोड़ते हैं। बढ़त जोड़ने से एक अलग ऑपरेशन के रूप में निपटा जा सकता है। एएम के लिए यह समझ में आता है, लेकिन यहां तक ​​कि हमें प्रासंगिक पंक्तियों और नए शीर्ष के स्तंभ को शून्य करने की आवश्यकता है। एएम के लिए किनारों का जोड़ भी अलग-अलग हो सकता है।
उस्मान

AL O (V) में एक शीर्ष कैसे जोड़ रहा है? हमें एक नया मैट्रिक्स बनाना होगा, इसमें पिछले मानों को कॉपी करना होगा। यह O (v ^ 2) होना चाहिए।
एलेक्स_बन

19

यह इस बात पर निर्भर करता है कि आप क्या खोज रहे हैं।

आसन्न मैट्रिसेस के साथ आप प्रश्नों का तेजी से उत्तर दे सकते हैं कि क्या दो कोने के बीच एक विशिष्ट बढ़त ग्राफ से संबंधित है, और आपके पास किनारों के त्वरित सम्मिलन और विलोपन भी हो सकते हैं। नकारात्मक पक्ष यह है कि आप विशेष रूप से अधिक शीर्ष है, जो बहुत अक्षम खासकर यदि आपकी ग्राफ विरल है है के साथ रेखांकन के लिए अत्यधिक अंतरिक्ष उपयोग करने के लिए, होता है।

दूसरी ओर, आसन्न सूचियों के साथ यह जांचना कठिन है कि किसी दिए गए किनारे को ग्राफ में है या नहीं, क्योंकि आपको किनारे को खोजने के लिए उपयुक्त सूची के माध्यम से खोजना होगा, लेकिन वे अधिक स्थान कुशल हैं।

आम तौर पर हालांकि, आसन्न सूचियां रेखांकन के अधिकांश अनुप्रयोगों के लिए सही डेटा संरचना हैं।


क्या होगा यदि आप आसन्न सूची को संग्रहीत करने के लिए शब्दकोशों का उपयोग करते हैं, जो आपको ओ (1) परिशोधित समय में बढ़त की उपस्थिति देगा।
बजे रोहित येरवथुला

10

मान लेते हैं कि हमारे पास एक ग्राफ है जिसमें n की संख्या n और किनारों की m संख्या है,

उदाहरण ग्राफ
यहाँ छवि विवरण दर्ज करें

समीपता मैट्रिक्स: हम एक मैट्रिक्स बना रहे हैं जिसमें n पंक्तियों और स्तंभों की संख्या है इसलिए स्मृति में यह स्थान लेगा जो n 2 के लिए आनुपातिक है । अगर यू और वी के रूप में नामित दो नोड्स के बीच एक किनारे है, तो जाँच करना odes (1) समय लगेगा। उदाहरण के लिए (1, 2) की जाँच करना एक धार है जो कोड में निम्नानुसार होगा:

if(matrix[1][2] == 1)

यदि आप सभी किनारों की पहचान करना चाहते हैं, तो आपको मैट्रिक्स पर ओवररेट करना होगा, इसके लिए दो नेस्टेड लूप की आवश्यकता होगी और इसमें ) (n 2 ) लगेगा । (आप सभी किनारों को निर्धारित करने के लिए मैट्रिक्स के ऊपरी त्रिकोणीय भाग का उपयोग कर सकते हैं लेकिन यह फिर से the (n 2 ) होगा)

निकटता सूची: हम एक ऐसी सूची बना रहे हैं, जिसमें प्रत्येक नोड दूसरी सूची को भी इंगित करता है। आपकी सूची में n तत्व होंगे और प्रत्येक तत्व एक सूची को इंगित करेगा, जिसमें कई आइटम हैं जो इस नोड के पड़ोसियों की संख्या के बराबर है (बेहतर दृश्य के लिए छवि देखें)। तो यह मेमोरी में जगह लेगा जो n + m के समानुपाती होता है । अगर (यू, वी) की जाँच की जा रही है तो ओ (डाउन (यू)) समय लगेगा जिसमें डी (यू) यू के पड़ोसियों की संख्या के बराबर है। क्योंकि अधिक से अधिक, आपको उस सूची पर पुनरावृत्त करना होगा जो यू द्वारा इंगित की गई है। सभी किनारों की पहचान करने में take (n + m) लगेगा।

उदाहरण ग्राफ की निकटता सूची

यहाँ छवि विवरण दर्ज करें
आपको अपनी जरूरत के हिसाब से अपनी पसंद बनानी चाहिए। अपनी प्रतिष्ठा के कारण मैं मैट्रिक्स की छवि नहीं बना सका, इसके लिए खेद है


7

यदि आप C ++ में ग्राफ विश्लेषण देख रहे हैं, तो शायद शुरू करने वाला पहला स्थान बूस्ट ग्राफ लाइब्रेरी होगा , जो बीएफएस सहित कई एल्गोरिदम को लागू करता है।

संपादित करें

एसओ पर यह पिछला सवाल शायद मदद करेगा:

कैसे-बनाने के लिए-एसी-बूस्ट-अप्रत्यक्ष-ग्राफ-एंड-ट्रैवर्स-इट-इन-डेप्थ-फर्स्ट-सियर एच


धन्यवाद, मैं
magiix

ग्राफ बढ़ाने के लिए +1। यह जाने का रास्ता है (पाठ्यक्रम को छोड़कर अगर यह शैक्षिक उद्देश्यों के लिए है)
ट्रिस्टाराम ग्रैबनर

5

यह उदाहरणों के साथ सबसे अच्छा उत्तर दिया गया है।

उदाहरण के लिए फ्लोयड-वारशॉल के बारे में सोचें । हमें एक आसन्न मैट्रिक्स का उपयोग करना होगा, या एल्गोरिथ्म asymptotically धीमा होगा।

या क्या होगा अगर यह 30,000 चक्करों पर एक सघन ग्राफ है? फिर एक आसन्न मैट्रिक्स समझ में आ सकता है, जैसा कि आप प्रति जोड़ी 16 बिट्स के बजाय 1 बिट प्रति वर्टिकल का संचय कर रहे होंगे, (प्रति आसन्न सूची के लिए आवश्यक न्यूनतम): वह 107 एमबी है, बजाय 1.7 जीबी।

लेकिन डीएफएस, बीएफएस (और एडमंड्स-कार्प जैसे) का उपयोग करने वाले एल्गोरिदम के लिए, प्राथमिकता-पहली खोज (डीजकस्ट्रा, प्राइम, ए *) आदि, एक आसन्न सूची मैट्रिक्स के रूप में अच्छी है। ठीक है, जब ग्राफ घना होता है, तो मैट्रिक्स में थोड़ी बढ़त हो सकती है, लेकिन केवल एक अचूक स्थिर कारक द्वारा। (कितना? यह प्रयोग करने की बात है।)


2
डीएफएस और बीएफएस जैसे एल्गोरिदम के लिए, यदि आप एक मैट्रिक्स का उपयोग करते हैं तो आपको हर बार पूरी पंक्ति की जांच करने की आवश्यकता होती है जब आप आसन्न नोड्स ढूंढना चाहते हैं, जबकि आपके पास पहले से ही आसन्न सूची में निकटवर्ती नोड हैं। आप an adjacency list is as good as a matrixउन मामलों में क्यों सोचते हैं ?
realUser404

@ realUser404 वास्तव में, एक पूरी मैट्रिक्स पंक्ति को स्कैन करना एक O (n) ऑपरेशन है। जब आप सभी आउटगोइंग किनारों को पार करने की आवश्यकता होती है, तो विरल ग्राफ़ के लिए आसन्न सूचियां बेहतर होती हैं, वे ऐसा ओ (डी) (डी: नोड की डिग्री) में कर सकते हैं। क्रमिक सूचियों की तुलना में मैट्रिस के पास बेहतर कैश प्रदर्शन है, क्योंकि अनुक्रमिक पहुंच के कारण, इसलिए कुछ हद तक घने रेखांकन के लिए, मैट्रिस को स्कैन करना अधिक समझ में आता है।
जोकेम कूइजपर्स

3

मेमोरी उपयोग के बारे में keyser5053 के उत्तर को जोड़ने के लिए।

किसी भी निर्देशित ग्राफ के लिए, एक आसन्न मैट्रिक्स (प्रति छोर पर 1 बिट) n^2 * (1)मेमोरी के बिट्स का उपभोग करता है ।

एक पूर्ण ग्राफ़ के लिए , एक आसन्न सूची (64 बिट पॉइंटर्स के साथ) n * (n * 64)सूची ओवरहेड को छोड़कर, मेमोरी के बिट्स का उपभोग करती है ।

अधूरे ग्राफ के लिए, एक आसन्न सूची 0मेमोरी के बिट्स की खपत करती है , सूची ओवरहेड को छोड़कर।


एक आसन्न सूची के लिए, आप eएक मेमोरी के लिए एक आसन्न मैट्रिक्स इष्टतम होने से पहले किनारों की अधिकतम संख्या ( ) निर्धारित करने के लिए अनुसरण सूत्र का उपयोग कर सकते हैं ।

edges = n^2 / sकिनारों की अधिकतम संख्या निर्धारित करने के लिए, sप्लेटफ़ॉर्म का सूचक आकार कहां है।

यदि आप ग्राफ़ को गतिशील रूप से अपडेट कर रहे हैं, तो आप इस दक्षता को औसत बढ़त गणना (प्रति नोड) के साथ बनाए रख सकते हैं n / s


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

एक निर्देशित ग्राफ के लिए, जहां n300 है, आसन्न सूची का उपयोग करके नोड के प्रति किनारों की इष्टतम संख्या है:

= 300 / 64
= 4

यदि हम इसे keyser5053 के सूत्र में प्लग करते हैं, d = e / n^2(जहां eकुल बढ़त संख्या है), तो हम देख सकते हैं कि हम ब्रेक के नीचे हैं [] 1 / s:

d = (4 * 300) / (300 * 300)
d < 1/64
aka 0.0133 < 0.0156

हालांकि, एक पॉइंटर के लिए 64 बिट्स ओवरकिल हो सकते हैं। यदि आप इसके बजाय 16 बिट पूर्णांक को सूचक ऑफ़सेट के रूप में उपयोग करते हैं, तो हम ब्रेकिंग पॉइंट से पहले 18 किनारों तक फिट हो सकते हैं।

= 300 / 16
= 18

d = ((18 * 300) / (300^2))
d < 1/16
aka 0.06 < 0.0625

इन उदाहरणों में से प्रत्येक आसन्न सूची के ओवरहेड को स्वयं ( 64*2एक वेक्टर और 64 बिट पॉइंटर्स के लिए) को अनदेखा करता है ।


मैं हिस्सा d = (4 * 300) / (300 * 300)नहीं समझ सकता, यह नहीं होना चाहिए d = 4 / (300 * 300)? चूंकि सूत्र है d = e / n^2
सौरभ

2

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


1

यदि आप आसन्न मैट्रिक्स या सूची के बजाय हैश तालिका का उपयोग करते हैं, तो आपको सभी ऑपरेशनों के लिए बेहतर या समान बिग-ओ रन-टाइम और स्थान मिलेगा (एक किनारे की जाँच करना O(1), सभी आसन्न किनारों को प्राप्त करना है O(degree), आदि)।

ओवर-टाइम और स्पेस दोनों के लिए कुछ स्थिर कारक ओवरहेड है (हैश टेबल लिंक की गई सूची या सरणी लुकअप के रूप में तेज़ नहीं है, और टकराव को कम करने के लिए एक सभ्य राशि लेता है)।


1

मैं केवल नियमित आसन्न सूची प्रतिनिधित्व के व्यापार-बंद पर काबू पाने के लिए संपर्क करने जा रहा हूं, क्योंकि अन्य उत्तरों ने अन्य पहलुओं को कवर किया है।

डिक्शनरी और हैशसेट डेटा संरचनाओं का लाभ उठाकर निरंतर समय में एजएक्सिस्ट्स क्वेरी के साथ आसन्न सूची में एक ग्राफ का प्रतिनिधित्व करना संभव है । एक शब्दकोष में अनुलंब रखने के लिए विचार है, और प्रत्येक शीर्ष के लिए, हम एक हैश सेट का उल्लेख करते हैं, जो अन्य कोने के साथ है।

इस कार्यान्वयन में एक मामूली व्यापार यह है कि इसमें नियमित जटिलता सूची की तरह O (V + E) के बजाय अंतरिक्ष जटिलता O (V + 2E) होगी, क्योंकि किनारों को यहां दो बार दर्शाया गया है (क्योंकि प्रत्येक शीर्ष का अपना हैश सेट है किनारों पर)। लेकिन AddVertex , AddEdge , RemoveEdge जैसे ऑपरेशन इस कार्यान्वयन के साथ परिशोधित समय O (1) में किए जा सकते हैं, केवल RemoveVertex को छोड़कर जो आसन्न मैट्रिक्स की तरह O (V) लेता है। इसका मतलब यह होगा कि कार्यान्वयन सादगी के अलावा, आसन्न मैट्रिक्स का कोई विशेष लाभ नहीं है। हम इस आसन्न सूची कार्यान्वयन में लगभग समान प्रदर्शन के साथ विरल ग्राफ पर स्थान बचा सकते हैं।

विवरण के लिए Github C # रिपॉजिटरी में कार्यान्वयन पर एक नज़र डालें। ध्यान दें कि भारित ग्राफ के लिए यह शब्दकोश-हैश सेट संयोजन के बजाय एक नेस्टेड शब्दकोश का उपयोग करता है ताकि वजन मूल्य को समायोजित किया जा सके। इसी तरह निर्देशित ग्राफ के लिए अलग और बाहर किनारों के लिए हैश सेट है।

उन्नत-एल्गोरिदम

नोट: मेरा मानना ​​है कि आलसी विलोपन का उपयोग करते हुए हम आगे RemoveVertex ऑपरेशन को O (1) में बदल सकते हैं, भले ही मैंने उस विचार का परीक्षण नहीं किया हो। उदाहरण के लिए, विलोपन पर केवल शब्दकोश में हटाए गए शीर्ष के रूप में चिह्नित करें, और फिर अन्य कार्यों के दौरान आलसी स्पष्ट और अनाथ किनारों।


आसन्न मैट्रिक्स के लिए, शीर्ष निकालें O (V ^ 2) नहीं O (V)
सौरभ

हाँ। लेकिन यदि आप सरणी सूचकांकों को ट्रैक करने के लिए एक शब्दकोश का उपयोग करते हैं, तो यह ओ (वी) के नीचे चला जाएगा। इस RemoveVertex कार्यान्वयन पर एक नज़र डालें ।
justcoding121
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.