8

मुझे पता है कि सबसे अच्छा क्या है: ऐरे या बाइनरी सर्च पेड़ (डालें, हटाएं, अधिकतम और मिनट ढूंढें) और मैं दोनों को कैसे सुधार सकता हूं?दक्षता में ऐरे और बाइनरी खोज पेड़ के बीच क्या अंतर है?

+0

आप की कोशिश की इस जानकारी की खोज कर रहे हैं? यह खोजना आसान होना चाहिए। – Howard

+0

क्या आपका मतलब सार डेटा संरचना [लिंक की गई सूची] (http://en.wikipedia.org/wiki/Linked_list) और [बाइनरी खोज पेड़] (http://en.wikipedia.org/wiki/Binary_search_tree) है? – Gumbo

+0

किस तरह से सुधार? क्या के लिए सबसे अच्छा है? वे पूरी तरह से अलग डेटा संरचनाएं हैं, और उनमें से प्रत्येक एक निश्चित अनुप्रयोग के लिए 'सर्वश्रेष्ठ' हो सकता है। – amit

उत्तर

13

एक सरणीrandom access इसमें प्रत्येक तत्व के लिए अनुमति देता है। इसलिए आप O(1) में एक विशिष्ट तत्व डालें, हटाएं और देखें, और अधिकतम/मिनट, O(n) में हटाएं। [आप अधिकतम/न्यूनतम O(1) भी बना सकते हैं और इसके बजाय O(n) हटा सकते हैं]। यदि आप अपनी सरणी को सॉर्ट कर रहे हैं, तो यह O(n) होने के लिए डालने/हटाएगा, लेकिन आपको O(logn) मिल जाएगा, और O(1) न्यूनतम/अधिकतम।

एक BST परिभाषा के अनुसार क्रमबद्ध किया जाता है, और एक नियमित [असंतुलित] BST के लिए, आप O(n) सबसे खराब स्थिति व्यवहार मिलता है। संतुलित बीएसटी के लिए, आपको O(logn) डालें/हटाएं/ढूंढें। आप O(1) मिनट/अधिकतम दोनों के लिए कैसे प्राप्त कर सकते हैं।

एरे आमतौर पर iterate [पुनरावृत्ति का मानना ​​महत्वपूर्ण नहीं है] के लिए तीर भी अधिक तेज़ होते हैं क्योंकि आप बेहतर cache प्रदर्शन प्राप्त करते हैं। इसके अलावा, बीएसटी के विपरीत - जिसमें प्रकृति द्वारा असंबद्ध आकार है, एक सरणी को पुनर्वितरण की आवश्यकता होती है और जब आपकी सरणी पूरी होती है तो डेटा की प्रतिलिपि बनाना आवश्यक होता है। AVL या red-black-trees तरह -

एक BST में सुधार यह balanced बनाकर किया जा सकता है।

कौन सा बेहतर है? यह आवेदन पर निर्भर करता है। आम तौर पर जब आप डेटा डालने और इसे क्रमबद्ध रखने की योजना बना रहे हैं, तो बीएसटी को प्राथमिकता दी जाएगी। यदि यादृच्छिक अभिगम या पुनरावृत्ति मुख्य उद्देश्य है: आप आमतौर पर एक सरणी का उपयोग करते हैं।

+0

एक संतुलित बीएसटी के लिए 'findMin/findMax' निरंतर संचालन' ओ (1) 'क्यों है? – Cratylus

+0

@ user384706: जब भी आप एक संतुलित बीएसटी से तत्व डालते/हटाते हैं, तो यह गैर संतुलित बीएसटी के लिए 'ओ (लॉगन)' और 'ओ (एन) 'है। आप अतिरिक्त पॉइंटर्स 'min' और' max' को बनाए रख सकते हैं, जो केवल तब संशोधित किए जाएंगे जब आप बीएसटी से तत्वों को सम्मिलित/हटा दें। संतुलित अधिकतम बीएसटी और 'ओ (एन) 'के लिए नया अधिकतम/न्यूनतम' ओ (लॉग) 'ढूंढना गैर संतुलित के लिए है - इस प्रकार इस ऑपरेशन में कोई प्रदर्शन हानि [बड़ी ओ शर्तें] नहीं है, और बड़े ओ के संदर्भ में, आप इन पॉइंटर्स को "फ्री" – amit

+1

आह के लिए बनाए रख सकते हैं, इसलिए आपका मतलब अतिरिक्त पॉइंटर्स का उपयोग करना है। लेकिन इस मामले में, यह एक अनुकूलन है जो सीधे बीएसटी एल्गोरिदम से संबंधित नहीं है। इसलिए यह तुलना में दावा करने के लिए कुछ हद तक असंगत/भ्रामक नहीं है एक और डेटा संरचना (इस मामले में एक सरणी) कि 'अधिकतम/मिनट'' ओ (1) 'है क्योंकि यह डिफ़ॉल्ट रूप से नहीं है? इसे इसे लागू करना होगा जैसे कि यह – Cratylus

11

प्रदर्शन Arrays और द्विआधारी खोज पेड़ों की तुलना:

    Array      Binary search tree 
      Unsorted Sorted   Average   Worst case 
Space  O(n)  O(n)    O(n)    O(n) 
Search  O(n)  O(log n) *  O(log n)   O(n) 
Max/Min O(n)  O(1)    O(1) **   O(1) ** 
Insert  O(1)  O(n)    O(log n)   O(n) 
Delete  O(1)  O(n)    O(log n)   O(n) 

* संभालने द्विआधारी खोज

** न्यूनतम और अधिकतम करने के लिए अतिरिक्त संकेत की आवश्यकता है, अन्यथा यह हे है (लॉग एन)

+0

'ओ (1) 'बीएसटी का अधिकतम/न्यूनतम क्यों है? – Cratylus

+0

अब आप पूछते हैं, मुझे यकीन नहीं है कि यह सही है या नहीं। बाइनरी सर्च पेड़ परिभाषा के अनुसार क्रमबद्ध हैं, लेकिन (कार्यान्वयन के आधार पर?) ओ (1) में न्यूनतम/अधिकतम प्राप्त करना संभव नहीं हो सकता है। उस स्थिति में यह ओ (लॉग एन) के बजाय होगा। – Peladao

+1

यह 'ओ (1)' नहीं है जब तक कि आपका कार्यान्वयन 'min' और 'max' मानों पर सूचक नहीं रखता है। अमित – Cratylus

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