रैखिक समय एक पेड़ के लिए एल्गोरिथ्म लेबलिंग?


12

मेरे पास एक अप्रत्यक्ष पेड़ है, जिसका सिरा मैं लेबल करना चाहता हूं। पत्ती नोड्स को एक लेबल किया जाना चाहिए। फिर, मान लें कि पत्तियां हटा दी गईं। जिस पेड़ में रहता है, उसमें पत्तियों को दो लेबल करना चाहिए। यह प्रक्रिया स्पष्ट तरीके से जारी रहती है जब तक कि सभी कोने में एक लेबल न हो। ऐसा करने का कारण यह है कि मैं एक कतार में कोने को संग्रहीत करना चाहता हूं, और उनके माध्यम से "पहले छोड़ देता हूं"। क्या यह समय करने का एक आसान तरीका है ?O(n+m)

मैं हर कदम पर BFS कर समस्या का समाधान कर सकता हूं। लेकिन सबसे खराब स्थिति में, हर कदम पर मैं हर शिखर से गुजरता हूं, बिल्कुल दो पत्तियों को हटाता हूं और उन्हें संलग्न करता हूं। मेरा मानना ​​है कि यह द्विघात समय लगता है।

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

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

आदर्श रूप से, रैखिक समय एल्गोरिथ्म को समझाने और कार्यान्वित करना आसान होगा।

जवाबों:


8

बिना कटे पेड़

में इसे हल करने के लिए आप एक प्राथमिकता कतार का उपयोग कर सकते हैं :O(E+VlogV)

  • एक प्राथमिकता कतार में सभी कोने रखें, उनकी प्राथमिकता उनकी डिग्री है।
  • जबकि कतार गैर-रिक्त है:
    • न्यूनतम प्राथमिकता का एक शीर्ष निकालें , जो (या बहुत अंत में ) होना चाहिए ।v10
    • Let , जहां सभी मूल पड़ोसियों पर जाता है ।यू वीσ(v)=1+maxσ(u)uv
    • शेष शेष पड़ोसी (यदि कोई हो) की प्राथमिकता से घटाएं ।यू1u

वास्तव में, हमें वास्तव में एक प्राथमिकता कतार की आवश्यकता नहीं है, और इस एल्गोरिथ्म को समय में एक सरल कतार का उपयोग करके लागू किया जा सकता है :O(E+V)

  • सभी चक्करों की डिग्री के साथ लंबाई की एक सरणी को आरम्भ करें।V
  • " " के साथ लंबाई दूसरे सरणी को आरम्भ करें ।V
  • पहले सरणी के माध्यम से एक बार जाएं, और डिग्री सभी शीर्षों को एक कतार में धकेलें ।1
  • जबकि कतार गैर-रिक्त है:
    • पॉप वर्टेक्स ।v
    • Let , जहां सभी मूल पड़ोसियों पर जाता है ।यू वीσ(v)=1+maxσ(u)uv
    • " " के रूप में मार्क ।v
    • अगर कुछ "जीवित" पड़ोसी है , घटाना की डिग्री से ।यू 1 यूvu1u
    • तो के नए डिग्री है , धक्का कतार में।1 यूu1u

जड़ वाले पेड़

इसके बजाय DFS का उपयोग करें। यहाँ एल्गोरिथ्म का एक स्केच है।

  • नोड को देखते हुए , यदि एक पत्ती है, तो सेट करें ।v d ( v ) = 1vvd(v)=1
  • यदि पत्ती नहीं है, तो उसके सभी बच्चों पर एल्गोरिथ्म चलाएं, और फिर , जहां सभी बच्चों के सेट पर चला जाता है।d ( v ) = 1 + अधिकतम d ( u ) uvd(v)=1+maxd(u)u

आप इस एल्गोरिथ्म को रूट पर चलाएँ।


क्या यह सही है? पेड़ पर विचार करें 1- 1- 2-> 3-> 4-> 5, जहां 1 जड़ है। 2 को लेबल 1 मिलना चाहिए, लेकिन आप 3 देते हैं? या बच्चों द्वारा आप पड़ोसियों से मतलब रखते हैं? हम तब से किस नोड को शुरू करते हैं?
नॉटे

मेरा कार्यान्वयन "एक के बाद एक" है, लेकिन आपके विवरण के अनुसार, को लेबल होना चाहिए , क्योंकि आपको को निकालना है , फिर , फिर , और उसके बाद केवल को एक पत्ता बनना है। 4 5 4 3 2245432
युवल फिल्मस

मैंने सवाल नहीं पूछा :-)। मैंने प्रश्न की व्याख्या की: एक अप्रत्यक्ष वृक्ष। सभी पत्तियों को लेबल करें। उन्हें हटाओ। परिणामी पेड़ पर फिर से जागना। उस मामले में पेड़ वास्तव में 1-2-3-4-5, चरण 1 है, आप 1 और 5 को हटाते हैं, फिर 2 और 4 और फिर 3. "मुकुट ग्राफ" के बारे में पैराग्राफ देखें। यह एक पेड़ के केंद्र को खोजने के लिए क्लासिक एल्गोरिदम में से एक है।
नॉटे

1 पत्ता नहीं है। यह पत्ती होने से बहुत दूर है, यह जड़ है। मैंने इस प्रश्न की व्याख्या जड़ वाले पेड़ों को लक्षित करके की। शायद हमें ओपी के जवाब का इंतजार करना चाहिए।
युवल फिल्मस

2
@ युवलफिल्मस, सिर्फ मेरे 2 सेंट फेंकने के लिए, यह नहीं होना चाहिए ? पत्तियां , यदि आप उन्हें हटाते हैं तो नई पत्तियां होनी चाहिए , इसलिए यह इस तरह का एक उपाय है कि आपको शीर्ष पर पत्ती बनने से पहले कितनी परतों को हटाना होगा। मिनट के साथ, पत्ती से सटे किसी भी शीर्ष पर 2 हो जाते हैं, लेकिन पत्तियां हटने पर यह पत्ती नहीं बन सकती है। उस वाक्य में बहुत सारे पत्ते थे। मुझे झाड़ू की जरूरत है। 1 21+max{d(u)}12
ल्यूक मैथिसन

2

एक सीधा जवाब इस प्रकार है:

  • इसे एक निर्देशित ग्राफ में बदल दें, जहां हमारे पास प्रत्येक नोड से उसके पैरेंट तक एक किनारे है । ध्यान दें कि आपको एक डैग (निर्देशित एसाइक्लिक ग्राफ) मिलता है।यू वी(u,v)uv

  • Topologically ग्राफ़ को सॉर्ट करें।

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

इनमें से प्रत्येक चरण समय में किया जा सकता है , इसलिए कुल चलने का समय । मैं इस वैकल्पिक दृष्टिकोण का उल्लेख केवल तभी करता हूं जब आप इसे युवल के उत्तर की तुलना में समझने के लिए वैचारिक रूप से आसान पाते हैं।O ( n + m )O(n+m)O(n+m)

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