2012-10-23 11 views
10

एक अधिकतम ढेर पेड़ बनाने के लिए, हम या तो siftDown या siftUp कर सकते हैं, हम रूट से शुरू करते हैं और इसे अपने दो बच्चों से तुलना करते हैं, फिर हम दोनों बच्चों के बड़े तत्व के साथ प्रतिस्थापित करते हैं, अगर दोनों बच्चे छोटे होते हैं तो हम रुकते हैं, अन्यथा हम तब तक उस तत्व को तब तक छोड़ते रहते हैं जब तक हम एक पत्ता नोड तक पहुंच जाते हैं (या फिर, जब तक कि उसके तत्व दोनों बड़े नहीं होते हैं)।siftDown siftUp से बेहतर क्यों है?

अब हम केवल, कि n/2 बार करने की आवश्यकता होगी क्योंकि पत्तियों की संख्या n/2 है, और पत्ते ढेर संपत्ति जब पिछली बार हमने पहले स्तर पर पिछले तत्व heapifying समाप्त संतुष्ट करेगा (पत्तियों से पहले) - तो हम n/2 तत्वों को ढेर करने के लिए छोड़ देंगे।

अब अगर हम siftUp का उपयोग करते हैं, तो हम पत्तियों से शुरू करेंगे, और अंततः हमें सभी n तत्वों को तेज़ करने की आवश्यकता होगी।

मेरा प्रश्न है: जब हम siftDown का उपयोग करते हैं, तो हम मूल रूप से siftUp का उपयोग करते समय केवल एक तुलना की तुलना में दो तुलना (मूल रूप से अपने बच्चों को तुलना करना) नहीं कर रहे हैं, क्योंकि हम केवल उस तत्व की तुलना अपने माता-पिता से करते हैं ? यदि हां, तो इसका मतलब यह नहीं होगा कि हम जटिलता को दोगुना कर रहे हैं और वास्तव में एक ही सटीक जटिलता के साथ समाप्त हो रहे हैं? जबकि siftUp के बार-बार कॉल के साथ यह निर्माण O(nlogn) की एक जटिलता है

+0

मुझे लगता है कि इस प्रश्न का उत्तर लागू होता है। शायद एक डुप्लिकेट। https://stackoverflow.com/questions/9755721/how-can-building-a-heap-be-on-time-complexity –

उत्तर

17

वास्तव में, siftDown के बार-बार कॉल के साथ एक ढेर के निर्माण O(n) की एक जटिलता है।

इस तथ्य को जब आप siftDown उपयोग करते हैं, समय प्रत्येक कॉल द्वारा उठाए गए कम हो जाती है कि नोड की गहराई के साथ क्योंकि इन नोड्स पत्तियों के करीब हैं के कारण है। जब आप siftUp का उपयोग करते हैं, तो स्वैप की संख्या नोड की गहराई के साथ बढ़ जाती है क्योंकि यदि आप पूरी गहराई से हैं, तो आपको रूट पर सभी तरह से स्वैप करना पड़ सकता है। चूंकि पेड़ की गहराई के साथ नोड्स की संख्या तेजी से बढ़ती है, siftUp का उपयोग करके अधिक महंगा एल्गोरिदम मिलता है।

इसके अलावा, यदि आप कुछ प्रकार के सॉर्टिंग करने के लिए मैक्स-हीप का उपयोग कर रहे हैं जहां आप ढेर के अधिकतम तत्व को पॉप करते हैं और फिर इसे फिर से साबित करते हैं, तो siftDown का उपयोग कर ऐसा करना आसान है। आप अधिकतम तत्व को पॉप करके O(logn) समय में फिर से भर सकते हैं, अंतिम तत्व को रूट नोड (जो खाली था क्योंकि आपने इसे पॉप किया था) पर डाला था और फिर इसे अपने सही स्थान पर वापस ले जाया था।

+0

आप सिफ्टडाउन और जटिलता ओ (एन) के साथ एक ढेर कैसे बना सकते हैं? –

+0

यहां जांचें: http://stackoverflow.com/questions/9755721/how-can-building-a-heap-be-on-time-complexity – sha1

+0

मैं गलत हो सकता हूं, लेकिन ऐसा लगता है कि किसी को औसत के बीच अंतर करना चाहिए जटिलता और सबसे खराब मामला जटिलता। चूंकि एक ढेर में तत्व डालने की औसत जटिलता ओ (1) है, ऐसा लगता है कि 'siftUp' की औसत जटिलता' siftDown' के समान है। ऐसा लगता है कि अंतर सबसे बुरी स्थिति में है: 'siftUp' ओ (nlogn) होगा जबकि 'siftDown' केवल ओ (एन) होगा। क्या आप इसकी पुष्टि कर सकते हैं ? –

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