यह समस्या पुस्तक कोडिंग साक्षात्कार क्रैकिंग से है ढूँढना के लिए अंतरिक्ष जटिलता की गणना करने के लिए। मुझे समाधान की अंतरिक्ष जटिलता को समझने में परेशानी है।कैसे बाइनरी सबट्री
समस्या:
आप दो बहुत बड़ी द्विआधारी पेड़: टी 1, नोड्स के लाखों लोगों के साथ, और टी 2, नोड्स के सैकड़ों के साथ। यह निर्धारित करने के लिए एक एल्गोरिदम बनाएं कि टी 2टी 1 का उपखंड है।
समाधान (जावा में):
public static boolean containsTree(TreeNode t1, TreeNode t2) {
if (t2 == null)
return true; // The empty tree is a subtree of every tree.
else
return subTree(t1, t2);
}
/* Checks if the binary tree rooted at r1 contains the binary tree
* rooted at r2 as a subtree somewhere within it.
*/
public static boolean subTree(TreeNode r1, TreeNode r2) {
if (r1 == null)
return false; // big tree empty & subtree still not found.
if (r1.data == r2.data) {
if (matchTree(r1,r2)) return true;
}
return (subTree(r1.left, r2) || subTree(r1.right, r2));
}
/* Checks if the binary tree rooted at r1 contains the
* binary tree rooted at r2 as a subtree starting at r1.
*/
public static boolean matchTree(TreeNode r1, TreeNode r2) {
if (r2 == null && r1 == null)
return true; // nothing left in the subtree
if (r1 == null || r2 == null)
return false; // big tree empty & subtree still not found
if (r1.data != r2.data)
return false; // data doesn’t match
return (matchTree(r1.left, r2.left) &&
matchTree(r1.right, r2.right));
}
किताब में लिखा इस समाधान का अंतरिक्ष जटिलताहे (लॉग (एन) + लॉग (एम)) जहां मीटर है टी 1 में नोड्स की संख्या (बड़ा पेड़) और टी 2 में नोड्स के एन संख्या।
मेरे लिए, यह प्रतीत होता है समाधान है, क्योंकि "सबट्री" समारोह लॉग (एन) पुनरावर्ती कॉल है हे (लॉग (एम) * लॉग (एन)) अंतरिक्ष जटिलता है और प्रत्येक पुनरावर्ती कॉल निष्पादित करता है "matchTree कि "फ़ंक्शन जो लॉग (एम) रिकर्सिव कॉल को ट्रिगर करता है।
क्यों इस समाधान हे (लॉग (एन) + लॉग (एम)) जटिलता है?
हाय दान, मास्टर प्रमेय से परामर्श करके matchTree() के लिए, हम कह सकते हैं कि matchtree ए = 1 के लिए एटी (एन/2) + एन के साथ व्यवहार करता है, 1. = मास्टर प्रमेय कहता है कि यदि <2 , फिर टी (एन) = ओ (एन)। इस प्रकार के पुनरावृत्ति के लिए सबूत https://math.dartmouth.edu/archive/m19w03/public_html/Section5-2.pdf पर पाया जा सकता है इसके अलावा गणितीय विश्लेषण के बिना, हमेशा एक सकारात्मकता है कि बाइनरी पेड़ संतुलित नहीं है और सभी तत्व "linline" हैं .. ओ (एन) –
के सबसे बुरे केस परिदृश्य के लिए आपके उत्तर के लिए बहुत बहुत धन्यवाद। अब, मैं एक और समान समस्या की अंतरिक्ष जटिलता की गणना करने के लिए अपने समझाया तर्क लागू करने की कोशिश कर रहा हूं और मैं अभी भी उस उत्तर में पहुंच रहा हूं जो पुस्तक के समाधान से अलग है। क्या आप निम्न समस्या को देख सकते हैं और समझा सकते हैं कि मैं क्या गलत कर रहा हूं? पहले ही, आपका बहुत धन्यवाद। – jjwest
@ जुआन ज़ैमोरा 'मैच ट्री() '* एटी (एन/2) + एन * का पुनरावृत्ति संबंध नहीं है, क्योंकि' matchTree() 'की स्टैक स्पेस एक स्थिर निरंतर है, न कि * n * के एकाधिक। आप सही हैं कि यह * ओ (एन) * बन जाता है यदि पेड़ संतुलित नहीं है। चूंकि jjwest और पुस्तक के लेखक दोनों ने इसे * ओ (लॉग (एन)) * माना है, * मैं कहता हूं कि पुस्तक में कहीं भी "पेड़ संतुलित हैं" और jjwest बस इसे लिखना भूल गया? StackOverflow पर –