संरचनात्मक और सामग्री में दो दिए गए द्विआधारी पेड़ बराबर होने के लिए कुशल एल्गोरिदम क्या होगा?निर्धारित करें कि क्या दो बाइनरी पेड़ बराबर हैं
उत्तर
यह एक छोटी समस्या है, लेकिन मैं पहले समाधान अनुकूलित चाहते हैं इस प्रकार है ...
eq(t1, t2) =
t1.data=t2.data && eq(t1.left, t2.left) && eq(t1.right, t2.right)
कारण यह है कि मीटर है आइसमैच सामान्य होने की संभावना है, और आगे बढ़ने से पहले - तुलना करना (और तुलना करना बंद करना) बेहतर है। बेशक, मैं यहां एक शॉर्ट सर्किट & & ऑपरेटर मान रहा हूं।
मैं यह भी बताउंगा कि यह संरचनात्मक रूप से अलग-अलग पेड़ों को सही तरीके से संभालने और पुनरावर्तन समाप्त करने के साथ कुछ मुद्दों पर चमक रहा है। असल में, t1.left आदि के लिए कुछ शून्य जांच होने की आवश्यकता है। यदि एक पेड़ में शून्य है। बाएं लेकिन दूसरा नहीं है, तो आपको संरचनात्मक अंतर मिला है। यदि दोनों में शून्य है। बाएं, कोई फर्क नहीं पड़ता है, लेकिन आप एक पत्ते तक पहुंच गए हैं - आगे की देखभाल न करें। केवल अगर दोनों। बाएं मान गैर-शून्य हैं तो क्या आप उप-जांच की जांच करते हैं। ठीक है, ठीक है, ठीक है।
आप उदाहरण के लिए चेक शामिल कर सकते हैं (t1.left == t2.left), लेकिन यह केवल तभी समझ में आता है जब subtrees को दो पेड़ों के लिए शारीरिक रूप से साझा किया जा सकता है (समान डेटा संरचना नोड्स)। यह जांच रिकर्सिंग से बचने का एक और तरीका होगा जहां यह अनावश्यक है - यदि t1.left और t2.left एक ही भौतिक नोड हैं, तो आप पहले से ही जानते हैं कि उन सभी उप-समान समान हैं।
एसी कार्यान्वयन हो सकती है ...
bool tree_compare (const node* t1, const node* t2)
{
// Same node check - also handles both NULL case
if (t1 == t2) return true;
// Gone past leaf on one side check
if ((t1 == NULL) || (t2 == NULL)) return false;
// Do data checks and recursion of tree
return ((t1->data == t2->data) && tree_compare (t1->left, t2->left)
&& tree_compare (t1->right, t2->right));
}
संपादित एक टिप्पणी के जवाब में ...
का उपयोग कर एक पूर्ण पेड़ तुलना के लिए समय से चल रहा है यह सबसे बस हे के रूप में कहा गया है (एन) जहां एन एक पेड़ का आकार थोडा है। यदि आप अधिक जटिल बाध्यता स्वीकार करने के इच्छुक हैं तो आप ओ (न्यूनतम (एन 1, एन 2)) जैसे छोटे से प्राप्त कर सकते हैं जहां n1 और n2 पेड़ के आकार होते हैं।
स्पष्टीकरण मूल रूप से है कि पुनरावर्ती कॉल केवल बाईं पेड़ में प्रत्येक नोड के लिए (अधिकतम) किया जाता है एक बार, और केवल बनाया (अधिकतम) एक बार सही पेड़ में प्रत्येक नोड के लिए है। कार्य के रूप में (रिकर्सन को छोड़कर) केवल सबसे अधिक काम की मात्रा (कोई लूप नहीं है) पर निर्दिष्ट करता है, सभी रिकर्सिव कॉल सहित कार्य केवल छोटे पेड़ के आकार के आकार के बराबर हो सकता है।
आप पेड़ों के चौराहे के विचार का उपयोग करके अधिक जटिल लेकिन छोटी बाध्य पाने के लिए आगे विश्लेषण कर सकते हैं, लेकिन बड़ा ओ केवल ऊपरी बाउंड देता है - जरूरी नहीं कि न्यूनतम संभव ऊपरी सीमा हो। यह संभवतः उस विश्लेषण को करने योग्य नहीं है जब तक कि आप इसे एक घटक के रूप में एक बड़ा एल्गोरिदम/डेटा संरचना बनाने की कोशिश नहीं कर रहे हैं, और नतीजतन आप जानते हैं कि कुछ संपत्ति हमेशा उन पेड़ों पर लागू होती है जो आपको एक कड़े बाध्य होने की अनुमति दे सकती हैं बड़ा एल्गोरिदम।
बाघ बांधने का एक तरीका दोनों पेड़ों में नोड्स के पथों के सेट पर विचार करना है। प्रत्येक चरण या तो एक एल (बाएं उपट्री) या एक आर (दाएं उपट्री) है। तो रूट एक खाली पथ के साथ निर्दिष्ट है। रूट के बाएं बच्चे का सही बच्चा "एलआर" है। एक पेड़ में वैध पथ के सेट का प्रतिनिधित्व करने के लिए "पथ (टी)" (गणितीय रूप से - कार्यक्रम का हिस्सा नहीं) को परिभाषित करें - प्रत्येक नोड के लिए एक पथ।
तो हम हो सकता है ...
paths(t1) = { "", "L", "LR", "R", "RL" }
paths(t2) = { "", "L", "LL", "R", "RR" }
उसी रास्ते विनिर्देशों दोनों पेड़ पर लागू होते हैं। और प्रत्येक पुनरावर्तन हमेशा दोनों पेड़ों के लिए एक ही बाएं/दाएं लिंक का पालन करता है। तो रिकर्सन इन सेटों के पुनरावृत्ति में पथों का दौरा करता है, और सबसे सख्त बाध्य हम इसका उपयोग करके निर्दिष्ट कर सकते हैं कि उस छेड़छाड़ की मुख्यता है (अभी भी प्रति रिकर्सिव कॉल पर निरंतर बाध्यता के साथ)।
ऊपर वृक्ष संरचना के लिए, हम निम्नलिखित पथ के लिए recursions कर ...
paths(t1) intersection paths(t2) = { "", "L", "R" }
तो इस मामले में हमारे काम सबसे तीन बार में घिरा है में गैर पुनरावर्ती काम का अधिकतम मूल्य tree_compare समारोह।
यह आम तौर पर एक अनावश्यक मात्रा में विस्तार होता है, लेकिन स्पष्ट रूप से पथ-सेट का चौराहे सबसे छोटे मूल पेड़ में नोड्स की संख्या जितना बड़ा होता है। और क्या ओ (एन) में एन एक मूल पेड़ में नोड्स की संख्या या दोनों में नोड्स के योग को संदर्भित करता है, यह स्पष्ट रूप से न्यूनतम या हमारे चौराहे से छोटा नहीं है। इसलिए ओ (एन) इतनी तंग बंधन नहीं है, लेकिन यह अभी भी एक वैध ऊपरी सीमा है, भले ही हम थोड़ा अस्पष्ट हो, जिस आकार के बारे में हम बात कर रहे हैं।
आप जो संभवतः पूरा करने की कोशिश कर रहे हैं उसके लिए एक और सामान्य शब्द graph isomorphism है। उस पृष्ठ पर ऐसा करने के लिए कुछ एल्गोरिदम हैं।
एफडब्ल्यूआईडब्ल्यू, पेड़ आइसोमोर्फिज्म रैखिक समय में चेक किया जा सकता है। – ShreevatsaR
Modulo ढेर अतिप्रवाह, जैसे
eq(t1, t2) =
eq(t1.left, t2.left) && t1.data=t2.data && eq(t1.right, t2.right)
कुछ (यह सभी पेड़-संरचित बीजीय डेटा प्रकार के लिए एक समानता विधेय को सामान्यीकृत -, संरचित डेटा के किसी भी भाग के लिए जाँच करता है, तो इसके उप-भागों में से प्रत्येक के बराबर हैं अन्य किसी के उप-भागों में से प्रत्येक के लिए।)
उपयुक्त स्पष्टीकरण देने के लिए ब्रायन धन्यवाद। – Rachel
मैं इसे निम्नानुसार लिखूंगा। निम्नलिखित कोड सबसे कार्यात्मक भाषा में काम करेंगे, और यहां तक कि अजगर में अगर आपके डेटाटाइप्स hashable हैं (उदाहरण के लिए नहीं शब्दकोशों या सूचियों):
संस्थानिक समानता (, संरचना में एक ही यानी
Tree(1,Tree(2,3))==Tree(Tree(2,3),1)
):tree1==tree2
मतलब हैset(tree1.children)==set(tree2.children)
आदेश दिया समानता:
tree1==tree2
मतलब हैtree1.children==tree2.children
क्योंकि समानता उनके लिए पहले से ही परिभाषित किया गया है तुम्हें पता है, आधार मामलों (पत्ते) को संभालने की जरूरत नहीं है (Tree.children बच्चों की एक आदेश दिया सूची है)।
क्या आप विस्तारित कर सकते हैं कि 'सेट (tree1.children) == सेट (tree2.children) 'ट्री (0, वृक्ष (1, वृक्ष (2,3)) पर काम करेगा) == वृक्ष (0, वृक्ष (वृक्ष (1,3), 2)) '? – jfs
@ जेएफएसबीस्टियन: यह सही तरीके से काम करेगा (यानी परिणाम "बराबर नहीं" परिणाम): '0 == 0' और' (1, (2,3)) == ((1,3), 2) '? आइए पहले जांच करें कि '(1, (2,3)) == ((1,3), 2)'। '1 == (1,3)' और '(2,3) == 2' है? नहीं, क्योंकि एक पेड़ परमाणु के बराबर नहीं है। इसलिए यह सच नहीं है कि '(1, (2,3)) == ((1,3), 2)'। इसलिए यह सच नहीं है कि '(0, (1, (2,3))) == (0, ((1,3), 2))'। विचार यह है कि सेट समानता को इसके तत्वों की समानता पर पुन: परिभाषित किया गया है, और इसलिए एक समानता जांच सहजता से रिकर्सिव होगी। – ninjagecko
आप '1 == 2' और' (2,3) == (1,3) 'चेक क्यों छोड़ते हैं? क्या आपकी 'सेट()' परिभाषा तत्वों के लिए एक निश्चित क्रम का तात्पर्य है? अन्यथा यह [बहुत महंगा] है (http://www.wolframalpha.com/input/?i=a%5Bn%5D+%3D%3D+1+%2B+2+a%5Bn+-+1%5D%2C एक कार्यान्वयन के रूप में +% 5 बी 0% 5 डी +% 3 डी% 3 डी + 1)।यह केवल परिभाषा के रूप में ठीक हो सकता है (किसी भी कार्यान्वयन को लागू नहीं करता है) हालांकि शब्द * टोपोलॉजिकल * मेरे लिए * का अर्थ है * कि नोड्स मान महत्वपूर्ण नहीं हैं और केवल वृक्षों का आकार महत्वपूर्ण है, [[एक शीर्ष विशेषज्ञ, कॉफी कप और एक डोनट एक ही बात है] (http://www.youtube.com/watch?v=4iHjt2Ovqag) – jfs
हम दो ट्रैवर्सल (प्री ऑर्डर, पोस्ट ऑर्डर या इन-ऑर्डर) में से कोई भी कर सकते हैं और फिर दोनों पेड़ों के परिणामों की तुलना कर सकते हैं। यदि वे समान हैं, तो हम उनके समकक्षता के बारे में सुनिश्चित हो सकते हैं।
चूंकि यह एक सिद्ध तथ्य यह है कि है - यह रूप में लंबे समय के रूप में हमारे पास एक द्विआधारी पेड़ पुन: बनाने के लिए निम्न संभव है:
- नोड्स एक इन-आदेश Traversal में सामना होता है के अनुक्रम।
- नोड्स के अनुक्रम है कि एक प्री-ऑर्डर या बाद आदेश Traversal
दो द्विआधारी पेड़ में आदेश में एक ही और है, तो [प्री-ऑर्डर या बाद आदेश] अनुक्रम में सामना होता है, तो वे संरचनात्मक रूप से और मूल्यों के संदर्भ में दोनों बराबर होना चाहिए।
प्रत्येक ट्रैवर्सल ओ (एन) ऑपरेशन है। ट्रैवर्सल कुल में 4 गुना किया जाता है और उसी प्रकार के ट्रैवर्सल के परिणामों की तुलना की जाती है। O (n) * 4 + 2 => हे (एन) हे इसलिए, समय-जटिलता की कुल आदेश होगा (एन)
- 1. जांचें कि क्या दो "चयन" बराबर हैं
- 2. जांचें कि क्या दो वैक्टर बराबर हैं
- 3. जांचना कि दो वस्तुओं के बराबर हैं,
- 4. बाइनरी पेड़ क्यों महत्वपूर्ण हैं?
- 5. यह निर्धारित करने के लिए कि क्या दो संख्याएं लगभग बराबर हैं, जब महत्वपूर्ण दशमलव अंकों
- 6. कोको: जांचें कि क्या दो एनएसएआरएआर बराबर हैं
- 7. आप कैसे निर्धारित करते हैं कि दो हैशसेट बराबर हैं (मूल्य के अनुसार, संदर्भ द्वारा नहीं)?
- 8. सामान्य पेड़ से बाइनरी पेड़
- 9. साबित करें कि एक ही इनऑर्डर और प्रीऑर्डर ट्रैवर्सल के साथ बाइनरी पेड़ समान हैं?
- 10. क्या दो प्रकार के बराबर हैं() विधि
- 11. निर्धारित करें कि क्या सी ++
- 12. बाइनरी खोज पेड़ क्यों?
- 13. एवीएल पेड़ पर बाइनरी सर्च पेड़
- 14. बाइनरी पेड़ कैसे बनाएं
- 15. हास्केल: फ्लैट बाइनरी पेड़
- 16. ओकैमल: बाइनरी पेड़ खींचें
- 17. बाइनरी पेड़ में संतुलित रकम
- 18. सी # कैसे पता लगाएं कि दो ऑब्जेक्ट बराबर हैं
- 19. स्थिर रूप से जांचें कि दो अनुपात बराबर हैं?
- 20. जोर दें कि दो जावा बीन्स बराबर हैं
- 21. मुझे कैसे पता चलेगा कि दो चर लगभग बराबर हैं?
- 22. बाइनरी पेड़ में दो सबसे दूर तत्वों को ढूंढना
- 23. क्या LINQ अभिव्यक्ति पेड़ उचित पेड़ हैं?
- 24. यह निर्धारित करने के लिए कि क्या तीन इन्स सभी बराबर हैं
- 25. दो सही बाइनरी ढेर विलय?
- 26. निर्धारित करें कि PHP
- 27. निर्धारित करें कि अधिसूचना
- 28. निर्धारित करें कि w3wp.exe
- 29. php: निर्धारित करें कि
- 30. सी # बाइनरी पेड़ और शब्दकोश
क्या आप बराबर से मतलब है? – pierrotlefou
मतलब वे समान हैं या नहीं? – Rachel
बराबर मतलब संरचना-वार या/और मूल्य-वार है? – Ashwin