पुनरावर्ती स्यूडोकोड में, 2^n एल्गोरिथ्म
GenerateAndTest(verticesNotYetConsidered, subsetSoFar):
if verticesNotYetConsidered is empty:
yield subsetSoFar if it induces a connected subgraph
else:
choose a vertex v in verticesNotYetConsidered
GenerateAndTest(verticesNotYetConsidered - {v}, subsetSoFar)
GenerateAndTest(verticesNotYetConsidered - {v}, subsetSoFar union {v})
यह कोई फर्क नहीं पड़ता जो शीर्ष वी चुना जाता है; हम भी दो भाई कॉल में अलग-अलग चुन सकते हैं। हम रिकर्सन पेड़ को काटकर लगभग रैखिक-समय एल्गोरिदम (समाधानों की संख्या एन बार) प्राप्त करने के लिए इस स्वतंत्रता का फायदा उठाते हैं।
यदि subsetSoFar
खाली है, तो विकल्प अभी भी अनजान है। अन्यथा, हम subsetSoFar
में एक कोष्ठक के निकट होने के लिए v
चुनते हैं। यदि ऐसा कोई v
मौजूद नहीं है, तो हम subsetSoFar
उत्पन्न करते हैं और वापस आते हैं, क्योंकि इस उप-क्षेत्र में कोई अन्य समाधान नहीं है।
नया इन्वेरिएंट नोट करें कि subsetSoFar
हमेशा कनेक्ट होता है, इसलिए हम स्पष्ट कनेक्टिविटी परीक्षण को समाप्त कर सकते हैं। हम ओ (एन) रिकर्सन पेड़ के प्रत्येक नोड पर काम करते हैं (naively O (n^2) लेकिन हम निकटवर्ती शिखर के सेट को लगातार बढ़ा सकते हैं), जो पूर्ण बाइनरी है और जिनके पत्ते प्रत्येक उपज वास्तव में एक समाधान उत्पन्न करते हैं, इसलिए कुल काम के रूप में दावा किया जाता है (याद रखें कि आंतरिक नोड्स की संख्या पत्तियों की संख्या से कम है)।
नए आविष्कार के कारण, कोई डिस्कनेक्टेड सबग्राफ उत्पन्न नहीं हुआ है।
प्रत्येक जुड़ा हुआ सबग्राफ उत्पन्न होता है। शिखर सम्मेलन एस के एक सेट के लिए जो एक जुड़े सबग्राफ को प्रेरित करता है, एस के साथ सहमत शाखाओं का पालन करें। एस के उचित सबसेट के लिए एस के बाकी हिस्सों के लिए कोई निकटता नहीं है, इसलिए एस काटा नहीं जाता है।
नया छद्म कोड निम्नानुसार है। N(v)
v
के पड़ोसियों के सेट को दर्शाता है।
GenerateConnectedSubgraphs(verticesNotYetConsidered, subsetSoFar, neighbors):
if subsetSoFar is empty:
let candidates = verticesNotYetConsidered
else
let candidates = verticesNotYetConsidered intersect neighbors
if candidates is empty:
yield subsetSoFar
else:
choose a vertex v from candidates
GenerateConnectedSubgraphs(verticesNotYetConsidered - {v},
subsetSoFar,
neighbors)
GenerateConnectedSubgraphs(verticesNotYetConsidered - {v},
subsetSoFar union {v},
neighbors union N(v))
संपादित करें: अधिकतम डिग्री हे (1) के रेखांकन के लिए, हम verticesNotYetConsidered intersect neighbors
को बनाए रखने, जो मैं स्पष्टता के लिए ऐसा नहीं किया द्वारा इस सही मायने में रेखीय समय कर सकते हैं। यदि आप ग्राफ को एक आसन्न मैट्रिक्स के रूप में प्रतिनिधित्व करके शब्द-समांतरता का शोषण करते हैं तो यह अनुकूलन शायद अधिक मूल्यवान नहीं है, जहां प्रत्येक पंक्ति को एक या दो-शब्द बिटमैप के रूप में संग्रहीत किया जाता है।
क्या आप जटिलता ओ (2^एन) के बारे में निश्चित हैं? एक क्लिक एन में 2^एन से जुड़े सबग्राफ हैं। – galath
क्या आप कोई ग्राफ विशेषताएं प्रदान कर सकते हैं? कम से कम घनत्व। साथ ही, क्या आप जानते हैं कि सामान्य क्लाइक समस्या एनपी-पूर्ण है? – Mikhail
@galath - Kn में 2^n से जुड़े उप-अनुच्छेद हैं, लेकिन केवल 2^n जुड़े _induced_ subgraphs। –