पाइथन तानाशाही लागू करने के लिए हैश टेबल का इस्तेमाल क्यों करता है, लेकिन रेड-ब्लैक ट्री का नहीं?
कुंजी क्या है? प्रदर्शन?
पाइथन तानाशाही लागू करने के लिए हैश टेबल का इस्तेमाल क्यों करता है, लेकिन रेड-ब्लैक ट्री का नहीं?
कुंजी क्या है? प्रदर्शन?
जवाबों:
यह एक सामान्य, गैर-पायथन-विशिष्ट उत्तर है।
| 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)
प्रयास है)।
हैश टेबल स्वाभाविक रूप से उत्परिवर्तनीय होते हैं, जबकि एक आरबी-पेड़ को भी अपरिवर्तनीय तरीके से लागू किया जा सकता है। हालांकि, यह शायद ही कभी उपयोगी है।
कारणों की एक पूरी श्रृंखला है जो सच हो सकती है, लेकिन प्रमुख होने की संभावना है:
लिखने और बनाए रखने में आसान, और विशिष्ट उपयोग के मामलों में एक प्रदर्शन विजेता? कृपया मुझे साइन अप करें!