पाइथन तानाशाही लागू करने के लिए हैश टेबल का इस्तेमाल क्यों करता है, लेकिन रेड-ब्लैक ट्री का नहीं? [बन्द है]


11

पाइथन तानाशाही लागू करने के लिए हैश टेबल का इस्तेमाल क्यों करता है, लेकिन रेड-ब्लैक ट्री का नहीं?

कुंजी क्या है? प्रदर्शन?


2
अपने शोध को साझा करना हर किसी की मदद करता है । हमें बताएं कि आपने क्या प्रयास किया है और यह आपकी आवश्यकताओं को पूरा क्यों नहीं करता है। यह दर्शाता है कि आपने खुद को मदद करने का प्रयास करने के लिए समय लिया है, यह हमें स्पष्ट उत्तरों को दोहराने से बचाता है, और सबसे अधिक यह आपको अधिक विशिष्ट और प्रासंगिक उत्तर प्राप्त करने में मदद करता है। यह भी देखें कि कैसे पूछें
gnat

जवाबों:


16

यह एक सामान्य, गैर-पायथन-विशिष्ट उत्तर है।

एल्गोरिथम जटिलता तुलना

       | Hash Table  |   Red-Black Tree    |
-------+-------------+---------------------+
Space  | O(n) : O(n) | O(n)     : O(n)     |
Insert | O(1) : O(n) | O(log n) : O(log n) |
Fetch  | O(1) : O(n) | O(log n) : O(log n) |
Delete | O(1) : O(n) | O(log n) : O(log n) |
       | avg  :worst | average  : worst    |

हैश टेबल के साथ समस्या यह है कि हैश टकरा सकता है। टक्करों को हल करने के लिए विभिन्न तंत्र हैं, जैसे खुले पते या अलग-अलग जंजीर। पूर्ण रूप से सबसे खराब स्थिति यह है कि सभी कुंजी में समान हैश कोड होता है, उस स्थिति में एक हैश तालिका एक लिंक की गई सूची में नीचा हो जाएगी।

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

आरबी-पेड़ स्व-संतुलन हैं और सबसे खराब स्थिति में उनकी एल्गोरिथ्म जटिलता को नहीं बदलते हैं। हालांकि, उन्हें लागू करना अधिक कठिन है। उनकी औसत जटिलताएँ हैश तालिका से भी बदतर हैं।

कुंजी पर प्रतिबंध

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

आरबी-ट्री में कीज़ का कुल ऑर्डर होना चाहिए: प्रत्येक कुंजी को किसी भी अन्य कुंजी के साथ तुलनीय होना चाहिए, और दोनों कुंजी को या तो छोटे, बड़े या बराबर की तुलना करनी चाहिए। यह क्रमबद्ध समानता शब्दार्थिक समानता के बराबर होनी चाहिए। यह पूर्णांकों और अन्य नंबरों के लिए सीधा है, स्ट्रिंग्स के लिए भी काफी आसान है (ऑर्डर केवल सुसंगत होना चाहिए और बाहरी रूप से अवलोकन योग्य नहीं है, इसलिए ऑर्डर को स्थानों [1] पर विचार करने की आवश्यकता नहीं है , लेकिन अन्य प्रकारों के लिए मुश्किल है जो उनके अंतर्निहित आदेश नहीं हैं) । जब तक उनके बीच कुछ तुलना संभव नहीं होती, तब तक विभिन्न प्रकार की चाबियां रखना बिल्कुल असंभव है।

[१]: असल में, मैं यहाँ गलत हूँ। दो तार बाइट-बराबर नहीं हो सकते हैं, लेकिन फिर भी कुछ भाषा के नियमों के अनुसार समान हो सकते हैं। उदाहरण के लिए यूनिकोड सामान्यीकरण को एक उदाहरण के लिए देखें जहां दो समान तार अलग-अलग एन्कोड किए गए हैं। यूनिकोड वर्ण संरचना आपके हैश कुंजी के लिए मायने रखती है या नहीं, एक हैश तालिका कार्यान्वयन कुछ भी नहीं जान सकता है।

कोई सोच सकता है कि आरबी-ट्री कीज के लिए एक सस्ता समाधान पहले समानता के लिए परीक्षण करना होगा, फिर पहचान की तुलना करें (यानी पॉइंटर्स की तुलना करें)। हालाँकि, यह आदेश सकर्मक नहीं होगा: यदि a == bऔर id(a) > id(c), तो उसे भी इसका पालन करना चाहिए id(b) > id(c), जिसकी यहाँ कोई गारंटी नहीं है। इसलिए इसके बजाय, हम लुकअप कुंजियों के रूप में हैश कोड का उपयोग कर सकते हैं। यहां, ऑर्डर सही तरीके से काम करता है, लेकिन हम एक ही हैश कोड के साथ कई अलग-अलग कुंजी के साथ समाप्त हो सकते हैं, जो आरबी पेड़ में एक ही नोड को सौंपा जाएगा। इन हैश टक्करों को हल करने के लिए हम हैश टेबल्स की तरह ही अलग-अलग चैनिंग का उपयोग कर सकते हैं, लेकिन यह हैश टेबल्स के लिए सबसे खराब स्थिति व्यवहार - दोनों दुनिया के सबसे खराब भी हैं।

अन्य पहलू

  • मैं एक हैश टेबल से एक पेड़ की तुलना में बेहतर मेमोरी इलाके की उम्मीद करता हूं, क्योंकि एक हैश टेबल अनिवार्य रूप से सिर्फ एक सरणी है।

  • दोनों डेटा संरचनाओं में प्रविष्टियाँ काफी अधिक ओवरहेड हैं:

    • हैश तालिका: अलग-अलग चेनिंग के मामले में कुंजी, मूल्य और अगली प्रविष्टि सूचक। साथ ही हैश कोड को स्टोर करने से आकार बदलने में तेजी आ सकती है।
    • आरबी-ट्री: की, वैल्यू, कलर, लेफ्ट चाइल्ड पॉइंटर, राइट चाइल्ड पॉइंटर। ध्यान दें कि जब रंग एक बिट होता है, तो संरेखण मुद्दे का मतलब हो सकता है कि आप अभी भी लगभग पूरे पॉइंटर के लिए पर्याप्त जगह बर्बाद कर रहे हैं, या यहां तक ​​कि लगभग चार पॉइंटर्स भी हो सकते हैं जब केवल पावर-ऑफ-टू आकार मेमोरी ब्लॉक आवंटित किए जा सकते हैं। किसी भी स्थिति में, एक आरबी-ट्री प्रविष्टि हैश तालिका प्रविष्टि की तुलना में अधिक मेमोरी का उपभोग करती है।
  • एक RB- वृक्ष में सम्मिलन और विलोपन में पेड़ की परिक्रमा शामिल होती है। ये वास्तव में महंगे नहीं हैं, लेकिन एक उपरि शामिल करते हैं। एक हैश में, सम्मिलन और विलोपन एक साधारण पहुंच से अधिक महंगे नहीं हैं (हालांकि प्रविष्टि पर हैश तालिका का आकार बदलना एक O(n)प्रयास है)।

  • हैश टेबल स्वाभाविक रूप से उत्परिवर्तनीय होते हैं, जबकि एक आरबी-पेड़ को भी अपरिवर्तनीय तरीके से लागू किया जा सकता है। हालांकि, यह शायद ही कभी उपयोगी है।


क्या हमारे पास हैश की टक्कर के लिए थोड़ा आरबी-पेड़ों के साथ एक हैश टेबल हो सकती है?
arager

@aragaer आम तौर पर नहीं, लेकिन यह कुछ विशिष्ट मामलों में संभव होगा। हालांकि, आमतौर पर टक्करों को लिंक की गई सूचियों द्वारा नियंत्रित किया जाता है - लागू करने के लिए बहुत आसान, बहुत कम ओवरहेड, और आमतौर पर बहुत अधिक प्रदर्शन क्योंकि हम आम तौर पर केवल बहुत कम टकराव होते हैं। यदि हम कई टकरावों की उम्मीद करते हैं, तो हम हैश फ़ंक्शन को बदल सकते हैं, या एक सरल बी-ट्री का उपयोग कर सकते हैं। RB- वृक्षों की तरह स्व-संतुलन वाले पेड़ भयानक हैं, लेकिन ऐसे कई मामले हैं जहां वे केवल मूल्य नहीं जोड़ते हैं।
आमोन

पेड़ों को "<" समर्थन वाली वस्तुओं की आवश्यकता होती है। हैश टेबल को उन वस्तुओं की आवश्यकता होती है जो हैश + "=" का समर्थन करती हैं। इसलिए आरबी के पेड़ संभव नहीं हो सकते हैं। लेकिन वास्तव में अगर आपके हैश टेबल में टक्करों की कोई महत्वपूर्ण मात्रा है, तो आपको नए हैश फ़ंक्शन की आवश्यकता है, कुंजी टकराने के लिए वैकल्पिक एल्गोरिदम नहीं।
gnasher729

1

कारणों की एक पूरी श्रृंखला है जो सच हो सकती है, लेकिन प्रमुख होने की संभावना है:

  • हैश टेबल को पेड़ों की तुलना में लागू करना आसान होता है। न तो पूरी तरह से तुच्छ है, लेकिन हैश टेबल थोड़ा आसान है, और कानूनी कुंजी के डोमेन पर प्रभाव कम कठोर है क्योंकि आपको बस एक हैशिंग फ़ंक्शन और एक समानता फ़ंक्शन की आवश्यकता है; पेड़ों को कुल ऑर्डर फ़ंक्शन की आवश्यकता होती है, और यह लिखने के लिए बहुत कठिन है।
  • हैश टेबल (हो सकता है) का छोटे आकार में बेहतर प्रदर्शन हो। यह बहुत मायने रखता है क्योंकि काम का एक महत्वपूर्ण अंश केवल बड़े डेटासेट के साथ सैद्धांतिक रूप से संबंधित है; व्यवहार में, वास्तव में केवल दसियों या सैकड़ों कुंजी के साथ काम करता है, लाखों नहीं। छोटे पैमाने पर प्रदर्शन बहुत मायने रखता है, और आप क्या सबसे अच्छा है यह पता लगाने के लिए असममित विश्लेषण का उपयोग नहीं कर सकते; आपको वास्तव में लागू करना और मापना होगा।

लिखने और बनाए रखने में आसान, और विशिष्ट उपयोग के मामलों में एक प्रदर्शन विजेता? कृपया मुझे साइन अप करें!

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