क्या अलग-अलग चेनिंग के लिए बाइनरी सर्च ट्री का उपयोग करके हैश टेबल को गति देना संभव है?


11

मैं ओ (एन) (ओ (लॉग एन) का उपयोग करके (बीएसटी का उपयोग करके) से अलग चेंजिंग प्रक्रिया में खोज जटिलता को कम करने के लिए बाइनरी सर्च ट्रीज़ का उपयोग करके एक हैश टेबल को लागू करना चाहता हूं। क्या यह किया जा सकता है, और यदि हाँ तो कैसे? यह समझना आसान होगा कि क्या समाधान कदम से कदम है, तर्क का कार्यान्वयन।

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


4
हैश टेबल और बाइनरी सर्च ट्री अलग - अलग कंटेनर हैं। इसलिए आप वह नहीं कर सकते जो आप सुझाते हैं (या आप एक शब्दावली में गलती कर रहे हैं)।
बेसिल स्टारीनेविच 11

मुझे लगता है कि आप एक पेड़ में प्रत्येक नोड में हैश / वैल्यू पेयर लगा सकते हैं ... लेकिन यह एक खराब हैश टेबल या एक खराब बाइनरी ट्री होगा। कुछ स्पष्टीकरण के बिना आप ऐसा क्यों करना चाहते हैं और आप क्या चाहते हैं कि अंतिम परिणाम सक्षम हो, मुझे यकीन नहीं है कि यह वास्तव में संभव है।
Ixrec

1
@AK_: जैसा कि आपने कहा, उस तरह से कुछ यूप करें। मैं बाइनरी खोज ट्री का उपयोग करके टकरावों को संभालना चाहता हूं। मैंने अपने प्रश्न को स्पष्ट करने के लिए इसे थोड़ा ठीक किया।
अविरल

1
ध्यान दें कि हर प्रविष्टि के लिए O (n लॉग एन) के दंड के साथ आता है । सामान्य तौर पर, जब आपके पास एक हैश तालिका होती है जो बहुत अधिक भरी होने लगती है (और आपके पास सहन करने की अपेक्षा लंबी श्रृंखलाएं होती हैं), तो आप हैश का पुनर्निर्माण करते हैं। यदि आप नियमित रूप से 3 या 4 से अधिक लंबी श्रृंखला का सामना करते हैं, तो कुछ गलत है।

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

जवाबों:


11

आप जो मांग रहे हैं, वह आपकी बाधाओं को देखते हुए संभव है।

विश्लेषण

हैश टेबल की ताकत इसकी तेज लुक और इंसर्शन स्पीड है। उस गति को प्राप्त करने के लिए, किसी को तालिका में क्रम के किसी भी भाग को छोड़ देना चाहिए: यानी प्रविष्टियां सभी को गड़बड़ कर रही हैं। एक सूची तालिका प्रविष्टि के रूप में उपयोग करने के लिए स्वीकार्य है क्योंकि जब ट्रैवर्सल हे (n) है, तो सूचियों को शॉर्ट हैश तालिका मानने के लिए पर्याप्त रूप से बड़ी है और तालिका में संग्रहीत वस्तुओं को अच्छी गुणवत्ता वाले हैशिंग एल्गोरिथ्म का उपयोग करके हैशेड किया जाता है।

बाइनरी सर्च ट्री (BST) में O (लॉग 2 एन) पर तेजी से सम्मिलन और लुकअप होता है । यह उन तत्वों पर भी प्रतिबंध लगाता है जो इसे संग्रहीत करता है: तत्वों को ऑर्डर करने के लिए कुछ तरीका होना चाहिए। पेड़ में संग्रहीत दो तत्वों और बी को देखते हुए , यह निर्धारित करना संभव होगा कि क्या बी से पहले आता है या यदि उनके पास समान क्रम है।

एक हैश तालिका ऐसी कोई प्रतिबंध नहीं लगाती है: हैश तालिका में तत्वों में दो गुण होने चाहिए। पहले, यह निर्धारित करने का एक तरीका होना चाहिए कि क्या वे समकक्ष हैं; दूसरा, नियतात्मक हैश कोड की गणना करने का एक तरीका होना चाहिए। आदेश एक आवश्यकता नहीं है।

यदि आपके हैश टेबल तत्वों में एक आदेश है, तो आप उसी हैश कोड (टकराव) के साथ वस्तुओं को रखने के लिए एक हैश तालिका प्रविष्टि के रूप में एक BST का उपयोग कर सकते हैं। हालांकि, एक BST O (लॉग 2 एन) लुकअप और सम्मिलन होने के कारण, इसका मतलब है कि पूरे ढांचे (हैश टेबल प्लस बीएसटी) के लिए सबसे खराब स्थिति तकनीकी रूप से तालिका प्रविष्टि के रूप में सूची का उपयोग करने से बेहतर है। BST कार्यान्वयन के आधार पर इसे एक सूची की तुलना में अधिक भंडारण की आवश्यकता होगी, लेकिन संभवतः अधिक नहीं।

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

कार्यान्वयन

मैं यहां कोड नहीं डालने जा रहा हूं क्योंकि ईमानदारी से यह वास्तव में आवश्यक नहीं है और आपने वैसे भी एक भाषा नहीं दी।

मैं जो भी करूँगा बस कॉपी करूँगा जो भी मानक हैश टेबल है आपकी भाषा के मानक पुस्तकालय में एक नया वर्ग है, फिर एक सूची से पेड़ पर टेबल बाल्टी प्रकार बदलें। भाषा और उसके मानक पुस्तकालय के आधार पर यह बहुत ही मामूली बात हो सकती है।

आम तौर पर मैं इस तरह से कोडिंग की कॉपी और पेस्ट करने की वकालत नहीं करता। हालांकि, यह एक बहुत ही आसान तरीका है कि युद्ध-परीक्षण डेटा संरचना को बहुत जल्दी प्राप्त किया जा सके।


स्पर्शोन्मुख शब्दों में, टकराव से निपटने के लिए बाइनरी ट्री का उपयोग करने से हैश टेबल के अपेक्षित प्रदर्शन में बदलाव नहीं होता है, बशर्ते कि हैश तालिका ने पहले से ही आम तौर पर O (1) प्रदर्शन को प्राप्त करने के लिए सामान्य चालें चलें। अच्छे प्रदर्शन को सुनिश्चित करने के लिए हैशटेबल का आकार बदलने का अर्थ है कि प्रति बाल्टी (बाइनरी पेड़ों का आकार) अपेक्षित आइटम छोटे भी होने की उम्मीद है, इसलिए आप उसी तरह से अपेक्षित ओ (1) के साथ समाप्त हो जाते हैं। यहां तक ​​कि सबसे खराब स्थिति के लिए - किसी भी संतुलन में बाधा के बिना, एक द्विआधारी पेड़ के लिए सबसे खराब मामला प्रदर्शन यह है कि यह वैसे भी एक लिंक की गई सूची की तरह व्यवहार करता है।
स्टीव 314

@ स्टीव 314 ध्यान रखें कि समस्या बहुत अधिक टकराव की है, इसलिए वह उम्मीद करता है कि एक बाल्टी में हैश तालिका की तुलना में अधिक सामान होना चाहिए।

अच्छा बिंदु - उदाहरण के लिए एक निरंतर आकार की हैश तालिका के साथ अनबाउंड डेटा के साथ, हैश तालिका का स्पर्शोन्मुख प्रदर्शन टकराव से निपटने के स्पर्शोन्मुख प्रदर्शन के समान है - हैश तालिका केवल निरंतर कारकों को बदलती है।
स्टीव 314

@ स्टीव 314 सही, अनिवार्य रूप से अगर हैश तालिका प्रभावी रूप से प्रत्येक बाल्टी में तत्वों की संख्या को सीमित नहीं कर सकती है, तो जो भी उप-डेटा संरचना प्रत्येक बाल्टी में उपयोग की जाती है उसमें एसिम्प्टोटिक प्रदर्शन कम हो जाता है। मैंने इसे स्पष्ट करने के लिए अपने उत्तर में एक अनुच्छेद जोड़ा।

7

एक हैश तालिका में टकराव से निपटने के लिए एक द्विआधारी पेड़ का उपयोग करना संभव नहीं है - यह किया गया है।

वाल्टर ब्राइट को सबसे अच्छी तरह से डी प्रोग्रामिंग भाषा के आविष्कारक के रूप में जाना जाता है , लेकिन उन्होंने DMMcript नामक एक ECMAScript संस्करण भी लिखा है । अतीत में, DMDScript (या संभवतः पूर्वज - मुझे DScript नाम याद है) का एक हेडलाइन दावा किया गया था कि इसके हैशटेबल्स ने बहुत सी समान भाषाओं में उन लोगों को पछाड़ने की कोशिश की थी। कारण - बाइनरी पेड़ों का उपयोग करके टकराव से निपटने।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.