ढेर और BST में क्या अंतर है?
एक ढेर का उपयोग कब करें और एक बीएसटी का उपयोग कब करें?
यदि आप तत्वों को क्रमबद्ध तरीके से प्राप्त करना चाहते हैं, तो क्या BST हीप से बेहतर है?
ढेर और BST में क्या अंतर है?
एक ढेर का उपयोग कब करें और एक बीएसटी का उपयोग कब करें?
यदि आप तत्वों को क्रमबद्ध तरीके से प्राप्त करना चाहते हैं, तो क्या BST हीप से बेहतर है?
जवाबों:
सारांश
Type BST (*) Heap
Insert average log(n) 1
Insert worst log(n) log(n) or n (***)
Find any worst log(n) n
Find max worst 1 (**) 1
Create worst n log(n) n
Delete worst log(n) log(n)
इस तालिका में सभी औसत समय सम्मिलित करने के अलावा उनके सबसे खराब समय के समान हैं।
*
: इस उत्तर में हर जगह, BST == संतुलित BST, क्योंकि असंतुलित रूप से असमान रूप से चूसता है**
: इस उत्तर में समझाया गया एक मामूली संशोधन का उपयोग करना***
: log(n)
पॉइंटर ट्री हीप के लिए, n
डायनेमिक ऐरे हीप के लिएएक बीएसटी पर बाइनरी हीप के फायदे
बाइनरी हीप में औसत समय सम्मिलन O(1)
BST के लिए है O(log(n))
। यह ढेर की हत्यारा सुविधा है।
ऐसे अन्य ढेर भी हैं जो फाइबोनैचि हीप कीO(1)
तरह परिशोधित (मजबूत) तक पहुंचते हैं , और यहां तक कि सबसे खराब स्थिति, ब्रोडल कतार की तरह , हालांकि वे गैर- स्पर्शोन्मुख प्रदर्शन के कारण व्यावहारिक नहीं हो सकते हैं: क्या फाइबोनैचि हील या ब्रोडल कतार कहीं भी व्यवहार में उपयोग की जाती हैं?
बाइनरी हीप्स को या तो गतिशील सरणियों या पॉइंटर-आधारित पेड़ों के शीर्ष पर कार्यान्वित किया जा सकता है , बीएसटी केवल पॉइंटर-आधारित पेड़। तो ढेर के लिए हम अधिक स्थान कुशल सरणी कार्यान्वयन का चयन कर सकते हैं, अगर हम सामयिक आकार के अक्षांशों को वहन कर सकते हैं।
द्विआधारी ढेर निर्माण है O(n)
सबसे खराब स्थिति , O(n log(n))
BST के लिए।
बाइनरी हीप पर बीएसटी का लाभ
मनमाने तत्वों की तलाश है O(log(n))
। यह बीएसटी की हत्यारा विशेषता है।
ढेर के लिए, यह O(n)
सामान्य रूप से है, सबसे बड़े तत्व को छोड़कर O(1)
।
BST पर ढेर का "गलत" फायदा
ढेर को O(1)
अधिकतम, BST ढूंढना है O(log(n))
।
यह एक सामान्य गलत धारणा है, क्योंकि सबसे बड़े तत्व का ट्रैक रखने के लिए एक BST को संशोधित करना तुच्छ है, और जब भी उस तत्व को बदला जा सकता है, तो इसे अपडेट करें: एक बड़ा एक स्वैप के सम्मिलन पर, हटाने पर दूसरा सबसे बड़ा लगता है। क्या हम ढेर ऑपरेशन का अनुकरण करने के लिए बाइनरी सर्च ट्री का उपयोग कर सकते हैं? ( Yeo द्वारा उल्लिखित )।
वास्तव में, यह BSTs की तुलना में ढेर की एक सीमा है: केवल सबसे बड़ी तत्व के लिए कुशल खोज है।
औसत बाइनरी हीप इन्सर्ट है O(1)
सूत्रों का कहना है:
सहज तर्क:
एक बाइनरी हीप में, किसी दिए गए इंडेक्स पर मूल्य बढ़ाना भी O(1)
उसी कारण से है। लेकिन अगर आप ऐसा करना चाहते हैं, तो यह संभावना है कि आप ढेर के संचालन पर एक अतिरिक्त इंडेक्स अप-टू-डेट रखना चाहते हैं कि मिन-हीप आधारित प्राथमिकता कतार के लिए ओ (लॉगन) कमी-कुंजी संचालन कैसे लागू किया जाए? उदाहरण के लिए दिज्क्स्त्र। बिना किसी अतिरिक्त समय के खर्च संभव।
जीसीसी सी ++ मानक पुस्तकालय वास्तविक हार्डवेयर पर बेंचमार्क सम्मिलित करते हैं
मैंने C ++ std::set
( रेड-ब्लैक ट्री BST ) और std::priority_queue
( डायनेमिक ऐरे हीप ) को यह देखने के लिए सम्मिलित किया कि क्या मैं इन्सर्ट टाइम के बारे में सही था, और यही मुझे मिला:
तो स्पष्ट रूप से:
ढेर डालने का समय मूल रूप से स्थिर है।
हम स्पष्ट रूप से डायनामिक ऐरे रिसाइज़ पॉइंट्स देख सकते हैं। चूँकि हम हर 10k आवेषण पर औसत होते हैं , सिस्टम शोर के ऊपर कुछ भी देखने में सक्षम होने के लिए , उन चोटियों वास्तव में दिखाए गए की तुलना में 10k गुना बड़ा है!
ज़ूम किया गया ग्राफ़ अनिवार्य रूप से केवल सरणी आकार बिंदुओं को बाहर करता है, और दिखाता है कि लगभग सभी आवेषण 25 नैनोसेकंड के नीचे आते हैं।
BST लॉगरिदमिक है। सभी आवेषण औसत ढेर डालने की तुलना में बहुत धीमी हैं।
BST बनाम हैशमैप पर विस्तृत विश्लेषण: क्या डेटा संरचना std के अंदर :: C ++ में मैप है?
GCC C ++ मानक पुस्तकालय gem5 पर बेंचमार्क डालें
मणि 5 एक पूर्ण प्रणाली सिम्युलेटर है, और इसलिए इसके साथ एक असीम रूप से सटीक घड़ी प्रदान करता है m5 dumpstats
। इसलिए मैंने व्यक्तिगत आवेषण के लिए समय का अनुमान लगाने के लिए इसका उपयोग करने की कोशिश की।
व्याख्या:
ढेर अभी भी स्थिर है, लेकिन अब हम अधिक विस्तार से देखते हैं कि कुछ लाइनें हैं, और प्रत्येक उच्च रेखा अधिक विरल है।
यह उच्च और उच्च आवेषण के लिए मेमोरी एक्सेस लेटेंसी के अनुरूप होता है।
TODO मैं वास्तव में BST की पूरी तरह से व्याख्या नहीं कर सकता क्योंकि यह इतना लघुगणक और कुछ अधिक स्थिर नहीं दिखता है।
इस अधिक विस्तार के साथ हालांकि हम देख सकते हैं कि कुछ अलग रेखाएं भी देख सकते हैं, लेकिन मुझे यकीन नहीं है कि वे क्या प्रतिनिधित्व करते हैं: मैं उम्मीद करूंगा कि नीचे की रेखा पतली हो सकती है, क्योंकि हम शीर्ष नीचे सम्मिलित करते हैं?
अराजकता 64 HPI CPU पर इस बिल्डरोट सेटअप के साथ बेंचमार्क ।
BST को किसी एरे पर कुशलता से लागू नहीं किया जा सकता है
हीप संचालन को केवल एकल ट्री ब्रांच को ऊपर या नीचे करने की आवश्यकता होती है, इसलिए O(log(n))
सबसे खराब स्थिति स्वैप, O(1)
औसत।
BST को संतुलित रखने के लिए पेड़ के घुमावों की आवश्यकता होती है, जो एक और के लिए शीर्ष तत्व को बदल सकते हैं, और पूरे सरणी को चारों ओर घुमाने की आवश्यकता होगी ( O(n)
)।
हीप्स को एक एरे पर कुशलता से लागू किया जा सकता है
वर्तमान सूचकांक से माता-पिता और बच्चों के अनुक्रमित की गणना की जा सकती है जैसा कि यहां दिखाया गया है ।
BST की तरह कोई भी संतुलन कार्य नहीं कर रहे हैं।
Delete min सबसे चिंताजनक ऑपरेशन है क्योंकि इसे टॉप डाउन करना है। लेकिन यह हमेशा यहां बताए गए ढेर की एक भी शाखा "पेरकोलेटिंग डाउन" द्वारा किया जा सकता है । यह ओ (लॉग (एन)) सबसे खराब स्थिति की ओर जाता है, क्योंकि ढेर हमेशा अच्छी तरह से संतुलित होता है।
यदि आप अपने द्वारा हटाए गए प्रत्येक के लिए एक एकल नोड सम्मिलित कर रहे हैं, तो आप स्पर्शोन्मुख ओ (1) औसत आवेषण का लाभ खो देते हैं जो कि हटने पर हावी होते हैं, और आप बीएसटी का उपयोग कर सकते हैं। दिज्क्स्ट्रा हालांकि प्रत्येक हटाने के लिए कई बार नोड्स अपडेट करता है, इसलिए हम ठीक हैं।
डायनेमिक ऐरे ढेर बनाम पॉइंटर ट्री ढेर
हीप्स को पॉइंटर हीप्स के शीर्ष पर कुशलता से लागू किया जा सकता है: क्या कुशल पॉइंटर-आधारित बाइनरी हीप कार्यान्वयन करना संभव है?
गतिशील सरणी कार्यान्वयन अधिक स्थान कुशल है। मान लीजिए कि प्रत्येक ढेर तत्व में सिर्फ एक सूचक होता है struct
:
पेड़ के कार्यान्वयन को प्रत्येक तत्व के लिए तीन बिंदुओं को संचय करना चाहिए: माता-पिता, बाएं बच्चे और दाएं बच्चे। तो मेमोरी का उपयोग हमेशा होता है 4n
(3 ट्री पॉइंटर्स + 1 struct
पॉइंटर)।
ट्री बीएसटी को आगे भी संतुलन की जानकारी की आवश्यकता होगी, जैसे कि काले-लाल-नेस।
डायनामिक एरे का कार्यान्वयन 2n
एक दोहरीकरण के बाद आकार का हो सकता है । तो औसतन यह होने जा रहा है 1.5n
।
दूसरी ओर, पेड़ के ढेर में सबसे खराब स्थिति होती है, क्योंकि इसके आकार को दोगुना करने के लिए बैकिंग डायनामिक सरणी की नकल करना O(n)
सबसे खराब स्थिति होती है, जबकि पेड़ का ढेर प्रत्येक नोड के लिए नए छोटे आवंटन करता है।
फिर भी, बैकिंग सरणी दोहरीकरण को O(1)
परिशोधन किया जाता है, इसलिए यह अधिकतम विलंबता पर विचार करने के लिए नीचे आता है। यहाँ उल्लेख किया ।
दर्शन
BST एक माता-पिता और सभी वंशजों के बीच एक वैश्विक संपत्ति बनाए रखते हैं (बाएं छोटे, दाएं बड़े)।
BST का शीर्ष नोड मध्य तत्व है, जिसे बनाए रखने के लिए वैश्विक ज्ञान की आवश्यकता होती है (यह जानकर कि कितने छोटे और बड़े तत्व हैं)।
यह वैश्विक संपत्ति बनाए रखने के लिए अधिक महंगा है (लॉग एन डालें), लेकिन अधिक शक्तिशाली खोज (लॉग एन खोज) देता है।
माता-पिता माता-पिता और प्रत्यक्ष बच्चों (माता-पिता> बच्चों) के बीच एक स्थानीय संपत्ति बनाए रखते हैं।
एक ढेर का शीर्ष नोड बड़ा तत्व है, जिसे केवल आपके माता-पिता को जानने (बनाए रखने) के लिए स्थानीय ज्ञान की आवश्यकता होती है।
BST बनाम हीप बनाम हैशमैप की तुलना:
BST: या तो एक उचित हो सकता है:
ढेर: सिर्फ एक छँटाई मशीन है। एक कुशल अनियंत्रित सेट नहीं हो सकता, क्योंकि आप केवल सबसे छोटे / सबसे बड़े तत्व के लिए तेजी से जांच कर सकते हैं।
हैश मैप: केवल एक अनियंत्रित सेट हो सकता है, एक कुशल छँटाई मशीन नहीं, क्योंकि हैशिंग किसी भी क्रम को मिलाता है।
संदेह से जुड़ी सूची
एक दोगुनी लिंक की गई सूची को ढेर के सबसेट के रूप में देखा जा सकता है, जहां पहले आइटम की सबसे बड़ी प्राथमिकता होती है, तो आइए उनकी तुलना यहां भी करें:
O(1)
सबसे खराब स्थिति चूंकि हमारे पास आइटम के लिए संकेत हैं, और अपडेट वास्तव में सरल हैO(1)
औसत, इस प्रकार लिंक की गई सूची से भी बदतर। अधिक सामान्य सम्मिलन की स्थिति के लिए ट्रेडऑफ़।O(n)
दोनों के लिएइसके लिए एक उपयोग का मामला तब है जब ढेर की कुंजी वर्तमान टाइमस्टैम्प है: उस स्थिति में, नई प्रविष्टियां हमेशा सूची की शुरुआत में जाएंगी। तो हम भी सटीक टाइमस्टैम्प को पूरी तरह से भूल सकते हैं, और सूची में स्थिति को प्राथमिकता के रूप में रख सकते हैं।
इसका उपयोग LRU कैश को लागू करने के लिए किया जा सकता है । वैसे ही जैसे डिज्कस्ट्रा की तरह ढेर अनुप्रयोगों के लिए , आप सूची का इसी नोड के लिए कुंजी से एक अतिरिक्त hashmap रखने के लिए है, जो नोड जल्दी से अद्यतन करने के लिए खोजने के लिए चाहते हैं।
विभिन्न बैलेंस्ड BST की तुलना
हालांकि एसिम्प्टोटिक सम्मिलित हैं और सभी डेटा संरचनाओं के लिए बार-बार मिलते हैं जिन्हें आमतौर पर "संतुलित BSTs" के रूप में वर्गीकृत किया जाता है जो मैंने अब तक एक ही देखा है, अलग-अलग BBST में अलग-अलग ट्रेड-ऑफ़ हैं। मैंने अभी तक इसका पूरी तरह से अध्ययन नहीं किया है, लेकिन इन ट्रेड-ऑफ को संक्षेप में प्रस्तुत करना अच्छा होगा:
यह सभी देखें
CS पर समान प्रश्न: /cs/27860/whats-the-difference-between-a-binary-search-tree-and-a-binary-heap
हीप केवल इस बात की गारंटी देता है कि निचले स्तरों पर तत्वों की तुलना में उच्च स्तरों पर तत्व अधिक से अधिक (अधिकतम-ढेर के लिए) या छोटे (न्यूनतम-हीप के लिए) हैं, जबकि BST आदेश ("बाएं" से "दाएं") की गारंटी देता है। यदि आप सॉर्ट किए गए तत्व चाहते हैं, तो BST के साथ जाएं।
[1, 5, 9, 7, 15, 10, 11]
एक वैध न्यूनतम-ढेर का प्रतिनिधित्व करता है, लेकिन 7
स्तर 3 स्तर 2 से छोटा 9
है। एक दृश्य के लिए, उदाहरण के लिए 25
और ढेर के लिए नमूना विकिपीडिया छवि19
में तत्व देखें । (यह भी ध्यान दें कि तत्वों के बीच असमानता के संबंध सख्त नहीं हैं, क्योंकि तत्व आवश्यक रूप से अद्वितीय नहीं हैं।)
कब एक ढेर का उपयोग करें और कब एक BST का उपयोग करें
ढेर findMin / findMax (कम से बेहतर है O(1)
,), जबकि BST में अच्छा है सभी पाता ( O(logN)
)। सम्मिलित करना O(logN)
दोनों संरचनाओं के लिए है। यदि आप केवल findMin / findMax (जैसे प्राथमिकता-संबंधी) की परवाह करते हैं, तो ढेर के साथ जाएं। यदि आप सब कुछ हल करना चाहते हैं, तो BST के साथ जाएं।
पहले कुछ स्लाइड्स यहां से चीजों को बहुत स्पष्ट रूप से समझाते हैं।
जैसा कि दूसरों ने उल्लेख किया है, हीप O findMin
या findMax
(1) में कर सकता है, लेकिन दोनों एक ही डेटा संरचना में नहीं। हालांकि मैं असहमत हूं कि हीप फाइंडमिन / फाइंडमैक्स में बेहतर है। वास्तव में, एक मामूली संशोधन के साथ, BST O और (1) दोनों में कर सकता है ।findMin
findMax
इस संशोधित BST में, आप न्यूनतम नोड और अधिकतम नोड का ट्रैक रखते हैं जो आप एक ऑपरेशन करते हैं जो संभवतः डेटा संरचना को संशोधित कर सकता है। उदाहरण के लिए इन्सर्ट ऑपरेशन में आप जाँच सकते हैं कि क्या न्यूनतम मान नए सम्मिलित मूल्य से बड़ा है, फिर नए जोड़े गए नोड में न्यूनतम मान निर्दिष्ट करें। अधिकतम मूल्य पर एक ही तकनीक लागू की जा सकती है। इसलिए, इस BST में ये जानकारी है जो आप उन्हें O (1) में प्राप्त कर सकते हैं। (बाइनरी हीप के समान)
इस BST (बैलेंस्ड BST) में, जब आप pop min
या pop max
सौंपे जाने वाले अगले न्यूनतम मूल्य , मिनिमम नोड के उत्तराधिकारी होते हैं, जबकि सौंपा जाने वाला अगला अधिकतम मूल्य अधिकतम नोड का पूर्ववर्ती होता है। इस प्रकार यह O (1) में प्रदर्शन करता है। हालांकि हमें पेड़ को फिर से संतुलित करने की आवश्यकता है, इस प्रकार यह अभी भी ओ (लॉग एन) चलाएगा। (बाइनरी हीप के समान)
मुझे नीचे टिप्पणी में आपके विचार सुनने के लिए दिलचस्पी होगी। धन्यवाद :)
इसी तरह के प्रश्न के लिए क्रॉस संदर्भ क्या हम ढेर ऑपरेशन का अनुकरण करने के लिए बाइनरी सर्च ट्री का उपयोग कर सकते हैं? BST का उपयोग कर ढेर के अनुकरण पर अधिक चर्चा के लिए।
popMin
या popMax
यह ओ (1) नहीं है, लेकिन यह ओ (लॉग एन) है क्योंकि इसमें एक बैलेंस्ड बीएसटी होना चाहिए, जिसे हर डिलीट ऑपरेशन को रीबैलेंस करना होगा। इसलिए यह बाइनरी हीप के समान है popMin
या popMax
जो O (लॉग एन)
एक द्विआधारी खोज ट्री परिभाषा का उपयोग करता है: प्रत्येक नोड के लिए, इसके बाईं ओर के नोड में कम मूल्य (कुंजी) होता है और इसके दाईं ओर नोड का अधिक मूल्य (कुंजी) होता है।
जहां ढेर के रूप में, एक द्विआधारी पेड़ के कार्यान्वयन के रूप में निम्नलिखित परिभाषा का उपयोग किया जाता है:
यदि A और B नोड हैं, जहाँ B, A का बच्चा नोड है, तो A का मान (कुंजी) B.That के मान (कुंजी) से बड़ा या बराबर होना चाहिए, कुंजी (A) (कुंजी (B) )।
http://wiki.answers.com/Q/Difference_between_binary_search_tree_and_heap_tree
मैं अपनी परीक्षा के लिए आज उसी प्रश्न पर दौड़ा और मैंने इसे ठीक कर लिया। मुस्कुराओ ... :)
हीप पर BST का एक और उपयोग; एक महत्वपूर्ण अंतर के कारण:
ढेर पर BST का उपयोग : अब, हम कहते हैं कि हम उड़ानों के लैंडिंग समय को संग्रहीत करने के लिए एक डेटा संरचना का उपयोग करते हैं। यदि लैंडिंग समय में अंतर 'd' से कम है तो हम उड़ान भरने के लिए लैंड नहीं कर सकते हैं। और मान लें कि कई उड़ानें डेटा संरचना (BST या हीप) में उतरने के लिए निर्धारित की गई हैं।
अब, हम एक और फ़्लाइट शेड्यूल करना चाहते हैं जो टी पर उतरेगी । इसलिए, हमें इसके उत्तराधिकारी और पूर्ववर्ती (होना चाहिए> डी) के साथ टी के अंतर की गणना करने की आवश्यकता है । इस प्रकार, हम इस के लिए एक BST है, जो यह तेजी से करता है की आवश्यकता होगी यानी में ओ (logn) यदि संतुलित।
संपादित:
सॉर्टिंग क्रम में तत्वों को प्रिंट करने के लिए BST को O (n) समय लगता है (Inorder traversal), जबकि Heap इसे O (n logn) समय में कर सकता है। हीप मिनिमम एलीमेंट को निकालता है और ऐरे को री-हेप करता है, जिससे यह O (n logn) टाइम में सॉर्ट करता है।
from unsorted to sorted sequence. O(n) time for inorder traversal of a BST, which gives sorted sequence.
खैर, बिना अनुक्रम के BST से मैं O (n लोगन) समय से कम की तुलना के आधार पर एक विधि नहीं जानता, जो BST के अनुक्रम भाग पर हावी है। (जबकि वहाँ हे (एन) ढेर निर्माण है।)। मैं इसे उचित समझूंगा (यदि निरर्थक) राज्य ढेर को अनिश्चितता और बीएसटी सॉर्ट किए जाने के करीब है।
हीप गारंटी देता है कि उच्च स्तरों पर तत्व अधिक से अधिक हैं (अधिकतम-हीप के लिए) या छोटे (न्यूनतम-हीप के लिए) समान स्तर के तत्वों की तुलना में अधिक हैं
मुझे उपरोक्त उत्तर पसंद है और अपनी टिप्पणी मेरी आवश्यकता और उपयोग के लिए अधिक विशिष्ट है। मुझे प्रत्येक स्थान से विशिष्ट बिंदु कहना (0,0) की दूरी का पता लगाने के लिए n स्थान सूची प्राप्त करनी थी और फिर छोटी दूरी वाले स्थानों को वापस करना था। मैंने प्रायोरिटी क्यू का इस्तेमाल किया जो कि हीप है। दूरी खोजने और ढेर में डालने के लिए मुझे n (लॉग (n)) n- लोकेशन लॉग (n) प्रत्येक इंसर्शन मिला। फिर सबसे कम दूरी के साथ मी प्राप्त करने के लिए यह मी (लॉग (एन)) एम-लोकेशन लॉग (एन) को हटाने के लिए हटा रहा है।
अगर मुझे BST के साथ ऐसा करना होता है, तो यह मुझे n (n) सबसे खराब स्थिति में ले जाता है। (पहला मूल्य बहुत छोटा है और अन्य सभी क्रमिक रूप से लंबा और लंबा आता है और पेड़ केवल दाएं या बाएं बच्चे तक फैलता है छोटे और छोटे के मामले में। मंत्री को O (1) समय लगेगा, लेकिन फिर से मुझे संतुलन रखना होगा। इसलिए मेरी स्थिति और उपरोक्त सभी उत्तरों से जो मुझे मिला है, जब आप न्यूनतम या अधिकतम प्राथमिकता के आधार पर मूल्यों के बाद ही जाते हैं। ढेर के लिए।