2008-10-30 16 views
16

मैं एक ग्राफ के लिए प्रभुत्व वृक्ष की गणना करने के लिए पथ संपीड़न के साथ लेंगौयर और तारजन एल्गोरिदम का उपयोग कर रहा हूं जहां लाखों नोड्स हैं। एल्गोरिदम काफी जटिल है और मुझे यह मानना ​​है कि मैंने इसे पूरी तरह से समझने के लिए समय नहीं लिया है, मैं बस इसका उपयोग कर रहा हूं। अब मुझे रूट नोड के प्रत्यक्ष बच्चों के प्रभुत्व के पेड़ों की गणना करने की आवश्यकता है और संभवत: इस ऑपरेशन को दोहराते हुए एक निश्चित गहराई तक ग्राफ को फिर से भरना होगा। अर्थात। जब मैं रूट नोड के बच्चे के लिए प्रभुत्व वृक्ष की गणना करता हूं, तो मैं नाटक करना चाहता हूं कि रूट नोड को ग्राफ़ से हटा दिया गया है।पुनरावर्तक पेड़ की गणना करने के लिए कुशल तरीका?

मेरा सवाल यह है कि क्या इसका कोई कुशल समाधान है जो रूट नोड के लिए प्रारंभिक प्रभुत्व वाले पेड़ में पहले से गणना की गई तत्काल प्रभुत्व जानकारी का उपयोग करता है? दूसरे शब्दों में मैं प्रत्येक बच्चे के लिए खरोंच से शुरू नहीं करना चाहता क्योंकि पूरी प्रक्रिया काफी समय ले रही है।

नैतिक रूप से ऐसा लगता है कि यह संभव है क्योंकि ग्राफ में बहुत सारे नोड्स गहरे नीचे होंगे, जिनके पास मूर्तियां उनके ऊपर थोड़ी सी तरफ हैं और ग्राफ के शीर्ष पर परिवर्तनों से अप्रभावित हैं।

बीटीडब्ल्यू बस एक तरफ: यह विचित्र है कि प्रभुत्व वाले पेड़ों का विषय संकलक लोगों द्वारा "स्वामित्व" है और क्लासिक ग्राफ सिद्धांत पर पुस्तकों में इसका कोई उल्लेख नहीं है। जिस एप्लिकेशन का मैं इसका उपयोग कर रहा हूं - मेरे FindRoots जावा हीप विश्लेषक - कंपाइलर सिद्धांत से संबंधित नहीं है।

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

उत्तर

5

boost::lengauer_tarjan_dominator_tree_without_dfs मदद कर सकता है।

+0

हां, यह मदद कर सकता है, धन्यवाद। मैं एल्गोरिदम के दूसरे भाग के बारे में चिंता करता हूं, हालांकि आमतौर पर समय के समान क्रम को डीएफएस के रूप में लेता है लेकिन कभी-कभी खराब होता है (और यही कारण है कि आपको निश्चित रूप से पथ संपीड़न की आवश्यकता है)। –

2

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

मेरा पहला विचार यह है कि यदि यह ग्राफ अन्य कंपाइलर्स द्वारा उत्पन्न होता है तो क्या यह इस समस्या को हल करने के लिए जीसीसी जैसे ओपन-सोर्स कंपाइलर को देखने लायक होगा?

मेरा दूसरा विचार यह है कि, आपके प्रश्न का मुख्य बिंदु पेड़ की जड़ के परिणाम को पुनः संयोजित करने से परहेज करता है।

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

मुझे उम्मीद है कि इससे मदद मिलती है!

+0

धन्यवाद साइमन द्वारा "स्वामित्व" नहीं है। दुर्भाग्यवश एल्गोरिदम जटिल रूप से जटिल है (कम से कम मेरी आंखों के लिए) और पेड़ से उतरने की तरह कुछ भी सरल नहीं करता है। जैसे यह पूर्वजों की श्रृंखला का पालन करता है। इसके लिए एक महसूस करने के लिए इसे देखें: http://www.cl.cam.ac.uk/~mr10/lengtarj.pdf। –

1

आप आप के साथ शुरू कर रहे हैं ग्राफ किस तरह पर विस्तृत सकता है? मैं नहीं देखता कि एक पेड़ के पेड़ और उस ग्राफ के प्रभुत्व के पेड़ के बीच कोई अंतर कैसे है। प्रत्येक नोड के माता-पिता को अपनी मूर्ति होना चाहिए, और यह निश्चित रूप से पेड़ में उपरोक्त सब कुछ का प्रभुत्व होगा।

+0

हाय, आप सही हैं, कृपया ऊपर स्पष्टीकरण देखें। –

0

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

तुम बस "वृद्धिशील अद्यतन dominator पेड़" के लिए खोज कर सकते हैं कुछ संदर्भों को खोजने के लिए।

मुझे लगता है कि आप जानते हैं the Eclipse Memory Analyzer dominator पेड़ का उपयोग करता है, इसलिए इस विषय पूरी तरह से अब और संकलक समुदाय :)

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