2011-07-02 19 views
5

जुड़े हुए हैं कि क्या यहाँ समस्या है:कैसे तय करने के लिए दो व्यक्तियों

दो व्यक्तियों को संभालने एक सामाजिक नेटवर्किंग वेबसाइट, कैसे तय करने के लिए कि क्या वे या नहीं जुड़े हुए हैं में पंजीकृत हैं?

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

इस बिंदु पर बिडड्रोलोल बेहतर समाधान होना चाहिए।

+0

डीएफएस ... दिलचस्प परिणाम देगा। एलिस बॉब जानता है। ऐलिस कैरल को भी जानता है, जो डेव को जानता है, जो ईव को जानता है, जो बॉब को जानता है। डीएफएस एलिस-> कैरोल-> डेव-> ईव-> बॉब को एलिस-> बॉब के रूप में वापस करने की समान संभावना है। :) –

उत्तर

0

नोट: उत्तर संपादित किया गया।

कोई भी विधि बहुत धीमी हो सकती है। यदि आपको बार-बार ऐसा करने की ज़रूरत है, तो ग्राफ के कनेक्टेड घटकों को ढूंढना सबसे अच्छा है, जिसके बाद कार्य एक छोटा ओ (1) ऑपरेशन बन जाता है: यदि दो लोग एक ही घटक में हैं, तो वे जुड़े हुए हैं।

ध्यान दें कि पहली बार कनेक्टेड घटकों को ढूंढना धीमा हो सकता है, लेकिन ग्राफ में जोड़े गए नए किनारों/नोड्स के रूप में उन्हें अद्यतन रखने के लिए तेज़ है।

कनेक्टेड घटकों को खोजने के लिए कई विधियां हैं।

एक विधि ग्राफ के लैपलासीन का निर्माण करना है, और इसके eigenvalues ​​/ eigenvectors को देखना है। शून्य eigenvalues ​​की संख्या आपको जुड़े घटकों की संख्या देता है। संबंधित eigenvectors के गैर-शून्य तत्व संबंधित घटकों से संबंधित नोड्स देता है।

एक और तरीका है निम्नलिखित लाइनों के साथ है:

  1. नोड्स के एक परिवर्तन तालिका बनाएं। सरणी के तत्व n में नोड की अनुक्रमणिका होती है जो नोड n में बदल जाती है। ग्राफ में सभी किनारों (i,j) (i और j के बीच एक कनेक्शन को संकेतित) के माध्यम से

  2. लूप:

    • कंप्यूट रिकर्सिवली जो नोड कर i और j वर्तमान तालिका के आधार पर करने के लिए बदलना। आइए परिणामों को k और l द्वारा इंगित करें। को l में बदलने के लिए प्रविष्टिअपडेट करें। l पर इंगित करने के लिए प्रविष्टियां i और j अपडेट करें।
  3. तालिका के माध्यम से फिर से लूप, और सीधे बात करने के लिए नोड यह रिकर्सिवली को बदल देती है लिए प्रत्येक प्रविष्टि अद्यतन करें।

अब उसी कनेक्टेड घटक में नोड्स में परिवर्तन तालिका में एक ही प्रविष्टि होगी। तो यह जांचने के लिए कि क्या दो नोड जुड़े हुए हैं, बस जांचें कि क्या वे एक ही मान में बदल जाते हैं।

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

+4

क्या यह दो निर्दिष्ट नोड्स के बीच सबसे छोटा रास्ता खोजने के लिए थोड़ा सा नहीं है? – biziclop

+1

ग्राफ के कनेक्टेड घटकों को ढूंढने के साथ 2 नोड्स के बीच कनेक्शन की जांच करना बहुत ही कम है। – kilotaras

+0

@biziclop, नहीं, यह इस बात पर निर्भर करता है कि आपके पास पहले से कौन से टूल्स उपलब्ध हैं। – Szabolcs

3

दोनों के बीच एक रास्ता खोजने के लिए, आपको पहली बार चौड़ाई वाली खोज शुरू करनी चाहिए। सबसे पहले A के सभी पड़ोसियों को ढूंढें, फिर A आदि के सभी पड़ोसियों के सभी पड़ोसियों को ढूंढें। एक बार B मारा जाता है, न केवल आपके पास A से B तक कोई पथ है, लेकिन आपके पास भी कम से कम ऐसा पथ है।

Dijkstra's algorithm चट्टानों, और आप दोनों अंत से काम करके इसे गति देने में सक्षम हो सकते हैं, यानी A के पड़ोसियों और B के पड़ोसियों को ढूंढें, और तुलना करें।

यदि आप पहली बार गहराई से खोज करते हैं, तो आप एक समय में एक पथ का अनुसरण कर रहे हैं। यह बहुत धीमा होगा।

+2

दोनों डीएफएस और बीएफएस में ओ (एन + एम) जटिलता होगी, इसलिए यह इतना बड़ा अंतर नहीं है। – kilotaras

+1

डीएफएस के लिए औसत समय बहुत खराब है। यह वास्तव में समय बनाम अंतरिक्ष संतुलन का सवाल है। – PengOne

+0

दोनों सिरों से काम करना वास्तविक सामाजिक नेटवर्क में एक अच्छा विचार है, क्योंकि अधिकांश पथ बहुत कम हैं। यह भी एक विचार है कि वास्तव में कुछ प्रणालियों में उपयोग किया जाता है। – biziclop

1

मुझे लगता है कि सही मानदंड है: ए और बी के बीच कम से कम एन पथ हैं तो के, या ए और बी मरने से जुड़े हुए हैं। मैं के = 3 और एन के पास 5 के पास जाऊंगा, यानी 5 आम दोस्त हैं।

+0

क्या आप समझा सकते हैं कि यह क्यों मिला -1? [पृथक्करण सिद्धांत के छह डिग्री] के अनुसार (http://en.wikipedia.org/wiki/Six_degrees_of_separation) दो व्यक्तियों को वैसे भी जोड़ा जाएगा। सवाल यह है कि वे पर्याप्त जुड़े हुए हैं। – kilotaras

+0

आह! मैं इसके लिए खोज रहा था, लेकिन इसे नहीं मिला। इसका एक अच्छा सिद्धांत है, हेरिस्टिक्स के लिए इस्तेमाल किया जा सकता है, लेकिन इस समस्या के लिए बाध्य लगाने के लिए अच्छा नहीं होगा। इसके अलावा, एन शून्य हो सकता है, इसका मतलब है कि वे जुड़े नहीं हैं। रचनात्मकता के लिए +1 :)। –

2

एक तरह से संघ का उपयोग का पता लगाएं, सभी लिंक union(from,to) जोड़ने के लिए है, और अगर find(A) is find(B) तो यह सच है है A और B जुड़े हुए हैं। यह रिकर्सिव खोज से बचाता है लेकिन यह वास्तव में सभी जोड़ों की कनेक्टिविटी की गणना करता है और आपको A और B से कनेक्ट करने वाले पथ नहीं देता है।

1

यदि आप सोशल नेटवर्क पर दो लोग जुड़े हैं या नहीं, तो यह बहुत लंबा लगेगा!

आप पहले से ही दो व्यक्तियों को जानते हैं, इसलिए आपको Bidirectional Search. का उपयोग करना चाहिए। लेकिन, सरल बिडरेक्शनल खोज एक सोशल नेटवर्किंग साइट के रूप में बड़े ग्राफ के लिए पर्याप्त नहीं होगी। आपको कुछ ह्युरिस्टिक्स का उपयोग करना होगा। विकिपीडिया पेज के कुछ लिंक हैं।

तुम भी विकिपीडिया से A* search. उपयोग करने में सक्षम हो सकता है: "एक * एक सबसे पहले खोज का उपयोग करता है और एक लक्ष्य नोड के लिए (एक या अधिक संभव लक्ष्यों में से) किसी प्रारंभिक नोड से कम से कम लागत वाली पथ पाता है। "

संपादित करें: मैं ए * का सुझाव देता हूं क्योंकि "एक द्विपक्षीय खोज करने की अतिरिक्त जटिलता का अर्थ है कि ए * खोज एल्गोरिदम अक्सर बेहतर विकल्प होता है यदि हमारे पास उचित ह्युरिस्टिक है।" इसलिए, यदि आप एक उचित ह्युरिस्टिक नहीं बना सकते हैं, तो बिडरेक्शनल खोज का उपयोग करें। (एक अच्छा हेरिस्टिक बनाना कभी आसान नहीं होता है))।

+0

मुझे संदेह है कि आप निष्पक्ष होने के लिए ए * का उपयोग कर सकते हैं। ए * केवल तभी काम करता है जब आपको एक उदारता मिलती है जो कभी खत्म नहीं होती है। सोशल नेटवर्क के लिए आप इस तरह के एक उदारवादी कैसे निर्माण करेंगे? – biziclop

+0

@biziclop: विकी से: "एक द्विपक्षीय खोज करने की अतिरिक्त जटिलता का अर्थ है कि ए * खोज एल्गोरिदम अक्सर बेहतर विकल्प होता है यदि हमारे पास उचित ह्युरिस्टिक है।" यदि आप एक resonable ह्युरिस्टिक नहीं बना सकते हैं, तो बिडरेक्शनल खोज का उपयोग करें! –

+0

तर्कसंगत ए * के लिए पर्याप्त नहीं है, जैसा कि मैंने कहा था कि आपका उत्तराधिकारी स्वीकार्य होना चाहिए। मैं इस समस्या के लिए किसी भी तरह के गैर-तुच्छ स्वीकार्य हेरिस्टिक को तैयार नहीं कर सकता हूं। – biziclop

संबंधित मुद्दे