2015-02-07 9 views
6

checkIfBalanced() पर कोड बनाने पर अंतरिक्ष जटिलता नीचे दिए गए कोड में विधि सही होती है यदि पेड़ संतुलित है और अन्यथा गलत है। हालांकि प्रत्येक रिकर्सन में यह ट्रीडाटा ऑब्जेक्ट बनाता है। मेरी राय में अंतरिक्ष जटिलता ओ (1) है क्योंकि प्रत्येक स्टैक फ्रेम पॉप-अप होने के बाद, उस स्टैक फ्रेम पर बनाए गए ऑब्जेक्ट का संदर्भ खो जाता है और कचरा एकत्र होता है। क्या मैं सही हूँ?रिकर्सन

कृपया ध्यान दें:

  1. मैं में सुधार/मेरे कोड को बदलने के लिए सुझाव के लिए नहीं देख रहा हूँ। कोड का निम्नलिखित उदाहरण मेरे प्रश्न पूछने के लिए तैयार है।

  2. इसके अलावा, please ignore space-complexity adding stack frames। मैं बनाई गई 'ट्रीडाटा' ऑब्जेक्ट्स की स्पेस जटिलता की तलाश में हूं। मुझे लगता है कि किसी भी समय केवल 3 वृक्षारोपण वस्तुएं होंगी। मैं क्या सत्यापित करना चाहता हूँ। धन्यवाद।

private static class TreeData { 
     private int height; 
     private boolean isBalanced; 

     TreeData(int height, boolean isBalanced) { 
      this.height = height; 
      this.isBalanced = isBalanced; 
     } 
    } 

    public boolean checkIfBalanced() { 
     if (root == null) { 
      throw new IllegalStateException(); 
     } 
     return checkBalanced(root).isBalanced; 
    } 

    public TreeData checkBalanced(TreeNode node) { 
     if (node == null) return new TreeData(-1, true); 

     TreeData tdLeft = checkBalanced(node.left); 
     TreeData tdRight = checkBalanced(node.right); 

     if (tdLeft.isBalanced && tdRight.isBalanced && Math.abs(tdLeft.height - tdRight.height) <= 1) { 
      return new TreeData(Math.max(tdLeft.height, tdRight.height) + 1, true); 
     } 

     return new TreeData(Math.max(tdLeft.height, tdRight.height) + 1, false); 
    } 

उत्तर

5

मेरी राय अंतरिक्ष जटिलता में हे (1) के रूप में के बाद प्रत्येक ढेर फ्रेम पॉप है, कि ढेर फ्रेम पर बनाया वस्तु के संदर्भ खो दिया है और कचरा एकत्र है। क्या मैं सही हू ?

नहीं, आप इसे मानने में गलत हैं। रे टोल ने बहुत खूबसूरती से यह समझाया है। रिकर्सन में किसी भी बिंदु पर, आपको उन सभी आंतरिक स्टैक फ्रेमों को गिनना होगा जिन्हें स्मृति में सहेजा जा रहा है, क्योंकि स्पेस-कॉम्प्लेक्सिटी इनपुट के साथ सभी सहायक स्थान (अतिरिक्त स्थान) को ध्यान में रखती है (यहां पर जोर नहीं दिया जाता है)।

इसके बाद,

मैं 'TreeData' वस्तुओं बनाई गई संख्या के अंतरिक्ष जटिलता के लिए देख रहा हूँ।

अधिकतम अंतरिक्ष एक पुनरावर्ती कार्यक्रम द्वारा खपत आनुपातिक प्रत्यावर्तन पेड़ फंसाया की अधिकतम गहराई को है। रिकर्सन पेड़ की अधिकतम गहराई को पेड़ में सबसे लंबे रास्ते की लंबाई के रूप में परिभाषित किया जाता है।

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

यह मुझे लगता है कि किसी भी समय केवल 3 TreeData ऑब्जेक्ट्स होंगे। यही वह है जिसे मैं सत्यापित करना चाहता हूं।

नहीं है, किसी विशेष निष्पादन समय में, पहले सब छोड़ दिया subtrees सत्यापित कर रहे हैं और उसके बाद राइट-subtrees सत्यापित कर रहे हैं, तो स्मृति में TreeData की वस्तुओं की संख्या केवल 1. यह होगा हर बार की जांच होगी इसके लिए बाएं या दाएं बच्चे हैं। और, इसलिए, उन सभी (लॉग एन --- संतुलित वृक्ष के मामले में, या एन --- अपमानजनक पेड़ के मामले में) एक को छोड़कर नोड्स स्मृति में ढेर रहेंगे। समय के एक विशेष पल में, केवल 1 ट्रीडाटा ऑब्जेक्ट सक्रिय स्थिति में होगा, अन्य को स्मृति में रोका और स्टैक्ड किया जाएगा और उनकी बारी के लिए बाहर निकलने का इंतजार होगा।

+0

इसलिए स्मृति में ट्रीडाटा की ऑब्जेक्ट्स की संख्या केवल 1 होगी - इसलिए, यदि मैं "स्टैक स्पेस को अनदेखा करता हूं" , जटिलता ओ (1) होगी? यदि संदर्भ स्टैक से पॉप किए जाते हैं तो क्या वे वस्तुएं कचरा इकट्ठा होंगी? – JavaDeveloper

+0

@ जावा डेवलपर- 1. यदि आप स्टैक स्पेस को अनदेखा करते हैं, और केवल वर्तमान संदर्भ पर विचार करते हैं, तो केवल 1 सक्रिय TreeData ऑब्जेक्ट होगा। 2. *** शायद/शायद नहीं ***, जैसे ही स्टैक सभी नोड्स को पॉप आउट करता है, ऑब्जेक्ट्स कचरा इकट्ठा हो सकता है या नहीं, यह अनुमान लगाने के लिए जेवीएम पर निर्भर करता है कि क्या उन्हें फिर से उपयोग किया जा रहा है या नहीं भविष्य। सच्चाई के लिए, आपको उन ऑब्जेक्ट्स को 'नल' पर सेट करके मैन्युअल रूप से ऐसा करने की ज़रूरत है ताकि वे कचरा इकट्ठा कर सकें। जवाब पढ़ें (विशेष रूप से स्टीफन सी का जवाब) -> http://stackoverflow.com/questions/27781116/garbage -collection में जावा-साथ पुनरावर्ती-समारोह –

1

प्रत्येक प्रत्यावर्तन में हालांकि यह TreeData वस्तु बनाता है।

सत्य नहीं है। आप केवल अपने रिकर्सन के मूल मामले में नया TreeData ऑब्जेक्ट बनाते हैं। यदि आप इसके बारे में चिंतित हैं, तो आपके पास उस कक्षा में एक बार घोषित एक स्थिर अंतिम TreeData उदाहरण क्यों नहीं है जिसका आप उपयोग कर सकते हैं। आखिरकार, एकमात्र चीज जो आप इस नोड से वापस प्रचार कर रहे हैं वह isBalanced बूलियन मान है।

यदि आप बूलियन लौटने के लिए अपना विधि हस्ताक्षर बदलते हैं तो आप सीधे बूलियन वैल्यू को सीधे बैक अप भी कर सकते हैं।

2

आप यहां पूंछ रिकर्सन का उपयोग नहीं कर रहे हैं, और आप पेड़ की मरम्मत करते समय स्टैक फ्रेम बना रहे हैं। निष्पक्ष होने के लिए, उन ढेर फ्रेम गिनें। यदि आपका पेड़ संतुलित है तो आप रिकॉर्ड्स के रूप में लॉग एन स्टैक फ्रेम बनायेंगे। सबसे बुरे मामले में, पूरी तरह से अपमानजनक पेड़ के साथ, हो सकता है कि आपके पास फ्रेम ढेर हो।

+1

खूबसूरती से समझाया गया! काश मैं आपके बीच और बोनस प्वाइंट्स को विभाजित कर सकता हूं और Am_I_Helpful – JavaDeveloper

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