हैश तालिकाओं से अधिक द्विआधारी खोज के पेड़ के क्या लाभ हैं?
हैश तालिकाओं थीटा (1) समय में किसी भी तत्व को देख सकते हैं और यह बस के रूप में एक तत्व जोड़ना आसान है .... लेकिन मैं फायदे दूसरी तरह के आसपास जाने की यकीन नहीं है।
हैश तालिकाओं से अधिक द्विआधारी खोज के पेड़ के क्या लाभ हैं?
हैश तालिकाओं थीटा (1) समय में किसी भी तत्व को देख सकते हैं और यह बस के रूप में एक तत्व जोड़ना आसान है .... लेकिन मैं फायदे दूसरी तरह के आसपास जाने की यकीन नहीं है।
एक एक द्विआधारी पेड़ की "लाभ" है कि यह क्रम में सभी तत्वों को बंद सूची चल जा सकता है। यह एक हैश तालिका के साथ असंभव नहीं है, लेकिन एक टुकड़े किए गए संरचना में एक सामान्य ऑपरेशन एक डिजाइन नहीं है।
एक hashtable अधिक स्थान ले जाएगा जब वह पहली बार बनाई गई है - यह तत्व है कि अभी तक कर रहे हैं सम्मिलित करने के लिए के लिए उपलब्ध स्लॉट होगा (या नहीं, वे कभी भी डाला जाता है), एक द्विआधारी खोज वृक्ष के रूप में ही बड़ा के रूप में यह करने की जरूरत होगी हो। इसके अलावा, जब एक हैश तालिका अधिक कमरे की जरूरत है, एक और संरचना के विस्तार कर सकता है समय लेने वाली हो, लेकिन उस कार्यान्वयन पर निर्भर हो सकता है।
याद रखें कि द्विआधारी खोज पेड़ (संदर्भ-आधारित) स्मृति-कुशल हैं। वे और अधिक स्मृति को आरक्षित नहीं की तुलना में वे की जरूरत है।
उदाहरण के लिए, एक हैश समारोह एक श्रृंखला है, तो R(h) = 0...100, तो आपको 100 (संकेत करने) तत्वों की एक सरणी आवंटित करने के लिए, की जरूरत है, भले ही आप सिर्फ 20 तत्वों hashing कर रहे हैं। आप वही जानकारी स्टोर करने के लिए एक द्विआधारी खोज वृक्ष का उपयोग करने के लिए गए थे, तो आप केवल के रूप में ज्यादा स्थान के रूप में आप की जरूरत है, साथ ही लिंक के बारे में कुछ मेटाडेटा का आवंटन होगा।
एक द्विआधारी पेड़ खोज और में डालने के लिए धीमी है, लेकिन इन्फ़िक्स ट्रेवर्सल जो अनिवार्य रूप से मतलब है कि आप एक क्रमबद्ध क्रम में पेड़ के नोड्स के माध्यम पुनरावृति कर सकते हैं की बहुत अच्छी सुविधा है।
क्योंकि वे सब स्मृति में बिखरे हुए हैं एक हैश तालिका की प्रविष्टियों के माध्यम से पुनरावृत्ति सिर्फ भावना का एक बहुत नहीं है।
एक द्विआधारी खोज वृक्ष एक साथ लागू किया जा सकता लगातार इंटरफेस है, जहां एक नया पेड़ दिया जाता है लेकिन पुराने पेड़ का अस्तित्व बना हुआ है। ध्यान से लागू किया, पुराने और नए पेड़ शेयरों उनके नोड्स के सबसे। आप एक मानक हैश तालिका के साथ ऐसा नहीं कर सकते।
एक हैश मेज पर एक द्विआधारी पेड़ के मुख्य लाभ यह है कि द्विआधारी पेड़ एक हैश तालिका के साथ आप दो अतिरिक्त आपरेशन आप (आसानी से जल्दी से,) ऐसा नहीं कर सकते देता है
तत्व (जरूरी के बराबर नहीं) कुछ मनमाने ढंग से कुंजी मान (या निकटतम ऊपर / नीचे) के सबसे करीब लगता है
क्रमबद्ध क्रम में पेड़ की सामग्री के माध्यम से पुनरावृति
दो जुड़े हुए हैं - द्विआधारी पेड़, एक क्रमबद्ध क्रम में उसकी सामग्री रखता है, ताकि चीजें हैं जो कि क्रमबद्ध आदेश की आवश्यकता होती है करने के लिए आसान कर रहे हैं।
ए (संतुलित) द्विआधारी खोज वृक्ष भी लाभ यह है कि इसके asymptotic जटिलता वास्तव में एक ऊपरी बाध्य है, जबकि हैश तालिकाओं के लिए "निरंतर" कई बार परिशोधित समय है: आप एक अनुपयुक्त हैश समारोह है, तो आप रैखिक समय के लिए अपमानजनक हो सकते हैं , बल्कि निरंतर से।
यदि आप एक क्रमबद्ध ढंग से डेटा का उपयोग करना चाहते हैं, तो एक क्रमबद्ध सूची हैश तालिका के समानांतर में बनाए रखा जाना चाहिए। एक अच्छा उदाहरण नेट में शब्दकोश है। (देखें http://msdn.microsoft.com/en-us/library/3fcwy8h6.aspx )।
यह न केवल धीमा आवेषण के पक्ष प्रभाव है, लेकिन यह एक बी पेड़ से स्मृति की एक बड़ी राशि खपत करता है।
इसके अलावा, के बाद से एक बी-वृक्ष क्रमबद्ध हो जाता है, यह आसान परिणामों की सीमाओं को खोजने के लिए, या यूनियनों या मर्ज प्रदर्शन करने के लिए है।
अन्य सभी अच्छी टिप्पणियों के अलावा:
सामान्य रूप में हैश तालिकाओं बेहतर कैश व्यवहार एक द्विआधारी पेड़ की तुलना में कम स्मृति की आवश्यकता होती है पढ़ने की है। एक हैश तालिका के लिए आप सामान्य रूप से केवल एक ही पढ़ने वहन करेंगे और आपके लिए एक संदर्भ के लिए अपने डेटा धारण की पहुंच है। द्विआधारी पेड़, अगर यह एक संतुलित संस्करण है, के क्रम में कुछ की आवश्यकता है कश्मीर * एलजी (एन) स्मृति कुछ निरंतर कश्मीर के लिए पढ़ता है।
दूसरी ओर, एक दुश्मन अपने हैश समारोह जानता है दुश्मन टकराव बनाने के लिए, बहुत अपने प्रदर्शन में बाधा अपने हैश तालिका लागू कर सकते हैं। वैकल्पिक हल एक परिवार से बेतरतीब ढंग से हैश समारोह का चयन करने के लिए है, लेकिन एक BST इस नुकसान नहीं है। इसके अलावा, जब हैश तालिका दबाव बहुत ज्यादा बढ़ता है, तो आप अक्सर enlargen और हैश तालिका जो एक महंगी आपरेशन हो सकता है पुनः आवंटित करते हैं। BST सरल व्यवहार यहाँ है और अचानक काफी मात्रा में डेटा का आवंटन और एक rehashing आपरेशन करते नहीं है।
पेड़ परम औसत डेटा संरचना हो जाते हैं। वे सूची के रूप में कार्य कर सकते हैं, आसानी से समानांतर आपरेशन के लिए विभाजित किया जा सकता, तेजी से हटाने, प्रविष्टि और के आदेश पर देखने की है ओ (एलजी एन) । वे कुछ भी नहीं विशेष रूप से अच्छी तरह से है, लेकिन वे या तो किसी भी जरूरत से ज्यादा बुरा व्यवहार नहीं है।
अंत में, BSTs ज्यादा में लागू करने के लिए आसान कर रहे हैं (शुद्ध) कार्यात्मक भाषाओं हैश तालिकाओं की तुलना में और वे विनाशकारी अद्यतन लागू किया जाना (की आवश्यकता नहीं है दृढ़ता से ऊपर पास्कल द्वारा तर्क)।
हैश तालिका का मुख्य लाभ यह है कि यह लगभग सभी ऑप्स करता है ~ = हे (1)। और इसकी बहुत आसान समझते हैं और लागू करने के लिए। यह कई "साक्षात्कार समस्याओं" कुशलता से हल करता है। तो अगर यू एक कोडन साक्षात्कार दरार करना चाहते हैं, हैश तालिका के साथ सबसे अच्छा दोस्त बनाने ;-)
BSTs भी "findPredecessor" और "findSuccessor" परिचालन (अगले छोटी और अगला सबसे बड़ा तत्व को खोजने के लिए) ओ (logn) समय में, यह भी बहुत आसान आपरेशन हो सकता है प्रदान करते हैं। हैश तालिका उस समय दक्षता में प्रदान नहीं कर सकते।
यह भी उपयोग पर निर्भर करता, हैश सटीक मिलान का पता लगाने की अनुमति देता है। आप एक श्रृंखला के लिए क्वेरी करना चाहते हैं तो BST विकल्प है। मान लीजिए आप डेटा E1, E2, E3 ..... एन की एक बहुत है।
हैश तालिका के साथ आप लगातार समय में किसी भी तत्व का पता लगाने कर सकते हैं।
आप E41 से अधिक और e8 से भी कम समय सीमा मूल्यों को खोजने चाहते हैं, BST जल्दी है कि मिल सकता है।
मुख्य बात हैश एक टक्कर से बचने के लिए इस्तेमाल किया कार्य है। बेशक, हम पूरी तरह से एक टक्कर, जिस स्थिति में हम श्रृंखलन या अन्य तरीकों का सहारा से बचने नहीं कर सकते। यह सबसे खराब मामलों में पुनः प्राप्ति नहीं रह निरंतर समय बनाता है।
एक बार जब पूरा, हैश तालिका फिर से सभी तत्वों पर अपनी बाल्टी आकार में वृद्धि और कॉपी करने के लिए है। यह एक अतिरिक्त कीमत BST से अधिक मौजूद नहीं है।
एक लाभ यह है कि कोई अन्य व्यक्ति ने कहा है कि द्विआधारी खोज वृक्ष आप रेंज खोजें कुशलता से करने की अनुमति देता है।
आदेश मेरा विचार को वर्णन करने में, मैं किसी किसी मामले बनाना चाहते हैं। आप सभी तत्वों जिसका कुंजी 0 5000 को और वास्तव में के बीच हैं सिर्फ एक ही तरह के तत्व और 10000 अन्य तत्वों जिसका कुंजी श्रृंखला में नहीं हैं पाने के लिए चाहते हैं। क्योंकि यह एक सबट्री जो जवाब असंभव है खोज नहीं करता BST काफी कुशलतापूर्वक रेंज खोज कर सकते हैं।
जबकि, आप कैसे एक हैश तालिका में रेंज खोज कर सकते हैं? आप या तो हर बाल्टी अंतरिक्ष, जो है हे (एन) पुनरावृति करने की जरूरत है, या आप चाहे 1,2,3,4 में से प्रत्येक ... ऊपर 5000 के लिए मौजूद है देखने के लिए है। (क्या 0 और 5000 के बीच कुंजियों के बारे में एक अनंत सेट कर रहे हैं? उदाहरण कुंजी दशमलव हो सकता है के लिए)
एक हैश तालिका एक अव्यवस्थित डेटा संरचना है, जब एक सेल फोन को डिजाइन करने के लिए, आप आंकड़ा भंडारण के लिए जितनी संभव हो उतनी अधिक डेटा रखना चाहते हैं। एक हैश तालिका एक अव्यवस्थित डेटा संरचना है - जिसका अर्थ है कि यह किसी भी विशेष क्रम में उसके तत्वों नहीं रखता। इसलिए, यदि आप एक सेल फोन पता पुस्तिका के लिए एक हैश तालिका का उपयोग, तो आप अतिरिक्त मेमोरी मूल्यों सॉर्ट करने के लिए की आवश्यकता होगी क्योंकि आप निश्चित रूप से वर्णमाला के क्रम में मूल्यों को प्रदर्शित करने की आवश्यकता होगी - यह सब के बाद एक पता पुस्तिका है। तो, एक हैश तालिका का उपयोग करके आप तत्वों है कि अन्यथा भंडारण स्थान के रूप में इस्तेमाल किया जा है | सॉर्ट करने के लिए स्मृति अलग सेट करने के लिए है। लेकिन द्विआधारी खोज वृक्ष एक क्रमबद्ध डेटा structure.Because एक द्विआधारी खोज वृक्ष को पहले से ही क्रमबद्ध किया जाता है, एक सेल फोन में मेमोरी या प्रसंस्करण समय छँटाई रिकॉर्ड बर्बाद करने के लिए कोई जरूरत नहीं होगी। जैसा कि हम पहले उल्लेख किया है, एक द्विआधारी पेड़ पर एक देखने या एक डालने कर एक हैश तालिका के साथ यह कर की तुलना में धीमी है, लेकिन एक सेल फोन पता पुस्तिका में 5,000 से अधिक प्रविष्टियाँ लगभग कभी नहीं होगा। प्रविष्टियों की इतनी छोटी संख्या के साथ एक द्विआधारी खोज वृक्ष की हे (लॉग (एन)) निश्चित रूप से काफी तेजी से किया जाएगा। तो, यह सब जानकारी दी, एक द्विआधारी खोज वृक्ष डेटा संरचना है कि आप, इस परिदृश्य में इस्तेमाल करना चाहिए, क्योंकि यह एक हैश तालिका की तुलना में एक बेहतर विकल्प है।
हैश टेबल्स अनुक्रमण के लिए अच्छा नहीं है। आप एक सीमा के लिए खोज कर रहे हैं, BSTs बेहतर हैं। यही कारण है कि क्यों ज्यादातर डेटाबेस अनुक्रमित बी + के बजाय पेड़ हैश तालिकाओं का उपयोग
से कोडिंग साक्षात्कार क्रैकिंग, 6 संस्करण
हम एक संतुलित द्विआधारी खोज वृक्ष (बीएसटी) के साथ हैश तालिका लागू कर सकते हैं। यह हमें एक हे (लॉग एन) देता है समय देखने। इस का लाभ संभावित, कम जगह उपयोग कर रहा है के बाद से हम अब एक बड़ी सरणी का आवंटन। हम यह भी आदेश में कुंजी, जो कभी कभी उपयोगी हो सकता है के माध्यम से पुनरावृति कर सकते हैं।
कक्षाएं HashSet और टेबल अव्यवस्थित संग्रह हैं। यह इंटरफ़ेस से स्पष्ट नहीं है (और नहीं तो हो सकता है), लेकिन हैश तालिकाओं AVL पेड़ का उपयोग कर लागू किया गया है। इसका मतलब है कि हैश कोड एक सरणी (कम टकराव) के सापेक्ष से कम नहीं है और यह भी मतलब है किया जाना एक सरणी का कोई rehashing (चिकनी प्रदर्शन) नहीं है। तथ्य यह है कि वे बिना क्रम वाली संग्रह हैं इसका मतलब है कि आप केवल एक समारोह और एक hashCode समारोह के बराबर होती है आपूर्ति - नहीं पेड़ों के लिए के रूप में एक पूर्ण comparer। इसलिए चाहे आप एक हैश तालिका तालिका <कश्मीर, टी> या एक द्विआधारी पेड़ ट्री <कश्मीर, टी> वर्ग कश्मीर पर निर्भर करता है का उपयोग करें - चाहे वह पूरी तरह से तुलनीय या केवल समानता तुलनीय है।
कई बार कर रहे हैं जब डेटाप्रकार दोनों तुलनीय और समानता तुलनीय है - स्ट्रिंग की तरह। इसका मतलब है कि HashSet <string> और सेट <string> दोनों संभव हैं। तार का एक हैश सेट पर खोजों तार के एक आदेश दिया सेट पर खोजों की तुलना में लगभग 10 गुना तेजी से हो जाते हैं। यदि तुलनित्र महंगा है तो पेड़ hashtables की तुलना में धीमा। तुलनित्र तेज, (पूर्णांकों और तैरता के लिए) की तरह है, तो पेड़ हैश तालिकाओं की तुलना में तेजी चलेंगे।
एक hashmap एक सेट साहचर्य सरणी है। तो, इनपुट मानों के अपने सरणी बाल्टी में जमा हो जाता है। एक खुला को संबोधित योजना में, आप एक बाल्टी के लिए सूचक है, और हर बार जब आप एक बाल्टी में एक नया मान जोड़ने के लिए, आपको पता है, जहां बाल्टी में वहाँ मुक्त रिक्त स्थान हैं। वहाँ इस-आप बाल्टी की शुरुआत में शुरू करते हैं और सूचक हर बार बढ़ाने के और परीक्षण करते हैं कि अपने कब्जे में करने के लिए कुछ तरीके हैं। यह रेखीय जांच कहा जाता है। उसके बाद, आप ऐड, जहाँ आप दोगुना बाल्टी की शुरुआत और जहाँ आप नीचे हर बार जब आप एक रिक्त स्थान की तलाश कर रहे ऊपर दोगुना या पीछे के बीच अंतर की तरह एक द्विआधारी खोज कर सकते हैं। यह जांच द्विघात कहा जाता है। ठीक। अब इन दोनों तरीकों में समस्याओं है कि अगले बाल्टी में बाल्टी overflows अगर संबोधित है, तो आप हैं- जरूरत है
ठीक। लेकिन यदि आप एक linkedlist का उपयोग इस तरह के एक समस्या ठीक नहीं किया जाना चाहिए? हाँ, जुड़ा हुआ सूचियों में आप इस समस्या नहीं है। प्रत्येक बकेट को ध्यान में रखते एक लिंक्ड सूची के साथ शुरू हो, और यह linkedlist इसलिए List.add (तत्व ई) के अंत तक पहुँचने के लिए उन 100 तत्वों पार करने के लिए आवश्यक है कि आप अगर आप एक बाल्टी में 100 तत्व समय हैं- ले जाएगा
linkedlist कार्यान्वयन के लाभ यह है कि आप खुले को संबोधित कार्यान्वयन के मामले में स्मृति आवंटन संचालन और सभी बाल्टियों की हे (एन) स्थानांतरण / प्रति की जरूरत नहीं है।
तो, जिस तरह से हे (एन) आपरेशन कम करने के लिए जहां संचालन कर रहे हैं ओ (लॉग (एन)) और आप आधारित अपनी स्थिति में तत्व जोड़ यह मूल्य है पर मिल एक द्विआधारी खोज वृक्ष की है कि कार्यान्वयन कन्वर्ट करने के लिए है। एक BST का जोड़ा विशेषता है कि यह हल कर आता है!
द्विआधारी खोज के पेड़ शब्दकोश लागू करने के लिए करता है, तो कुंजी कुछ कुल आदेश (कुंजी तुलनीय हैं) उन पर परिभाषित किया गया है और आप आदेश की जानकारी सुरक्षित रखना चाहते हैं अच्छा विकल्प है।
BST आदेश की जानकारी को बरकरार रखता है, यह चार अतिरिक्त गतिशील सेट कार्य है कि नहीं किया जा सकता (कुशलता) हैश तालिकाओं का उपयोग प्रदान करता है। ये अभियान कर रहे हैं:
हर BST आपरेशन की तरह इन सभी आपरेशनों हे (एच) के समय जटिलता है। इसके अतिरिक्त सभी संग्रहीत चाबियाँ BST में सॉर्ट रहते इस प्रकार बस में-क्रम में पेड़ traversing द्वारा चाबियों का हल कर अनुक्रम प्राप्त करने के लिए आप सक्षम करने से।
सारांश में अगर सभी आप चाहते हैं संचालन, सम्मिलित हटाकर बाद में हटाने हैश तालिका अपराजेय है प्रदर्शन में (ज्यादातर समय) है। लेकिन अगर आप किसी एक या सभी यदि आप ऊपर सूचीबद्ध BST, अधिमानतः एक आत्म संतुलन BST का उपयोग करना चाहिए संचालन चाहते हैं।
द्विआधारी खोज के पेड़ तेजी से जब स्ट्रिंग कुंजी के साथ इस्तेमाल किया जा सकता है। खासकर जब तार लंबे होते हैं।
कम / अधिक से अधिक है, जिसके लिए तुलना का उपयोग कर बाइनरी खोज पेड़ तार के लिए तेजी से कर रहे हैं (जब वे बराबर नहीं हैं)। तो एक BST जल्दी से जवाब कर सकते हैं जब एक स्ट्रिंग नहीं मिला है। जब यह पाया है यह केवल एक पूर्ण तुलना करने की आवश्यकता होगी।
एक हैश तालिका में। आप स्ट्रिंग के हैश की गणना करनी है और यह आप हैश गणना करने के लिए कम से कम एक बार सभी बाइट्स के माध्यम से जाने की जरूरत का मतलब है। फिर, जब मेल खाने वाली प्रविष्टियां पाया जाता है।