डायनेमिक ग्राफ़ पर जुड़े घटक जानकारी को बनाए रखने के लिए सबसे कुशल एल्गोरिथम और डेटा संरचना क्या है?


9

कहें कि मेरे पास एक अप्रत्यक्ष परिमित विरल ग्राफ है, और निम्नलिखित प्रश्नों को कुशलता से चलाने में सक्षम होने की आवश्यकता है:

  • IsConnected(N1,N2) - लौटता है T अगर बीच में कोई रास्ता है N1 तथा N2, अन्यथा F
  • ConnectedNodes(N) - उन नोड्स के सेट को लौटाता है जो से पहुंच योग्य हैं N

यह आसानी से ग्राफ के जुड़े घटकों को पूर्व-कंप्यूटिंग द्वारा किया जाता है। दोनों क्वेरीज़ चल सकती हैंO(1) समय।

अगर मुझे भी मनमाने ढंग से किनारों को जोड़ने में सक्षम होना चाहिए - AddEdge(N1,N2)- तब मैं घटकों को एक असंतुष्ट-सेट डेटा संरचना में संग्रहीत कर सकता हूं । जब भी कोई बढ़त जोड़ी जाती है, अगर वह अलग-अलग घटकों में दो नोड्स को जोड़ती है, तो मैं उन घटकों को मर्ज कर दूंगा। यह जोड़ता हैO(1) को लागत AddEdge तथा O(InverseAckermann(|Nodes|)) को लागत IsConnected तथा ConnectedNodes (जो भी हो सकता है O(1))।

अगर मुझे भी मनमाने ढंग से किनारों को हटाने में सक्षम होने की आवश्यकता है, तो इस स्थिति को संभालने के लिए सबसे अच्छा डेटा संरचना क्या है? एक जाना जाता है? संक्षेप में, यह निम्नलिखित कार्यों का कुशलता से समर्थन करना चाहिए:

  • IsConnected(N1,N2) - लौटता है T अगर बीच में कोई रास्ता है N1 तथा N2, अन्यथा F
  • ConnectedNodes(N) - उन नोड्स के सेट को लौटाता है जो से पहुंच योग्य हैं N
  • AddEdge(N1,N2)- दो नोड्स के बीच एक बढ़त जोड़ता है। ध्यान दें किN1, N2 या दोनों पहले अस्तित्व में नहीं थे।
  • RemoveEdge(N1,N2) - दो नोड्स के बीच मौजूदा बढ़त को हटाता है।

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


ConnectedNodes संभवतः अंदर नहीं चल सकता था O(1), क्योंकि अगर यह एक सूची देता है n नोड्स, इसकी आवश्यकता होगी Ω(n)समय। क्रियान्वयनConnectedNodesएक BFS के साथ इष्टतम है, इसलिए एक संभावित डेटा संरचना को केवल IsConnected, AddEdge और RemoveEdge का समर्थन करना होगा। यह आपके प्रश्न के लिए प्रासंगिक लगता है: stackoverflow.com/questions/7241151/…
टॉम वैन डेर ज़ंडेन

@TomvanderZanden एक सेट लौटाता है जो पहले से ही बनाया गया है (प्रोग्रामिंग में, एक सूचक या संदर्भ) O(1)... हालांकि बहुत उपयोगकर्ता नहीं है ConnectedNodes ऐसा कर सकता था O(1) और द्वारा कवर नहीं किया गया IsConnected
user253751

जवाबों:


11

इस समस्या को गतिशील कनेक्टिविटी के रूप में जाना जाता है और यह सैद्धांतिक कंप्यूटर विज्ञान समुदाय में अनुसंधान का एक सक्रिय क्षेत्र है। अभी भी कुछ महत्वपूर्ण समस्याएं अभी भी यहाँ हैं।

शब्दावली को स्पष्ट करने के लिए, आप किनारों को जोड़ने और हटाने के लिए पूरी तरह से गतिशील कनेक्टिविटी के लिए पूछते हैं। होल्म, डी लिक्टेनबर्ग और थोरुप (जेएसीएम 2001) का एक परिणाम है जो प्राप्त करता हैO(log2n) अद्यतन समय और O(logn/loglogn)क्वेरी समय। मेरी समझ से यह लागू करने योग्य लगता है। बस डेटा संरचना बोलने से पेड़ों को फैलाने का एक पदानुक्रम बना रहता है - और पेड़ों में गतिशील कनेक्टिविटी को कवर करना आसान है। मैं एक अच्छे स्पष्टीकरण के लिए एरिक डी। डेमियन के नोट्स की सिफारिश यहां एक वीडियो के लिए देख सकता हूं । एरिक के नोट में अन्य प्रासंगिक परिणामों के संकेत भी हैं। नोट के रूप में: ये सभी परिणाम सैद्धांतिक परिणाम हैं।

ये डेटा संरचनाएँ प्रति से कनेक्टेडनोड्स प्रश्न प्रदान नहीं कर सकती हैं , लेकिन इसे प्राप्त करना आसान है। बस एक अतिरिक्त डेटा संरचना के रूप में बनाए रखें ग्राफ (जैसे कि दोगुनी कनेक्टेड एज लिस्ट) और नोड्स को प्राप्त करने के लिए गहराई-पहली-खोज करें जो एक निश्चित नोड से पहुंचा जा सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.