पुराने दिनों में, डेटा स्ट्रक्चर्स क्लास में हमने सीखा कि एवीएल पेड़ कैसे काम करते हैं । मुझे लगता है कि मेरी कक्षाओं में से एक में होगा, लेकिन प्रशिक्षक ने कहा "आप वास्तव में इसका उपयोग कभी नहीं करेंगे" और इसके बजाय हमने 2-3 पेड़ और बी * पेड़ सीखे। वे दिन थे जब स्मृति तंग थी और प्रक्रियाओं को एकल रूप से पिरोया गया था। जब आप एक लिंक्ड सूची बस के रूप में अच्छी तरह से काम करेगा एक छल का उपयोग नहीं किया।
स्किप की सूची आज बहुत अधिक सामान्य है जिसमें उपलब्ध मेमोरी और कंसिस्टेंसी एक मुद्दा है (आपको एवीएल ट्री के साथ सब कुछ की तुलना में एक स्किप सूची में एक लेखक के रूप में कार्य करते समय बहुत अधिक लॉक करने की आवश्यकता नहीं है)।
सच कहूँ तो, यह अब मेरा पसंदीदा डेटा स्ट्रक्चर है कि इसकी कुछ चीज़ों के बारे में मैं आसानी से बता सकता हूँ कि यह कैसे काम करता है और यह कहाँ उपयोग करने के लिए फायदेमंद या नुकसानदेह होगा।
आपको स्क्रैच से एक लिखने की आवश्यकता नहीं है (जब तक कि आप इसे साक्षात्कार प्रश्न के रूप में नहीं लेते हैं - लेकिन तब आपको एवीएल पेड़ को लागू करने की संभावना होगी)।
आप कर रहे हैं की जरूरत के लिए जा रहा समझने के लिए कि आप एक का चयन करना चाहते ConcurrentSkipListMap
बल्कि एक से जावा में HashMap
या TreeMap
या अन्य नक्शा कार्यान्वयन के किसी भी।
यह समझने के लिए कि यह कैसे काम करता है, आपको यह समझने की आवश्यकता है कि बाइनरी ट्री कैसे काम करता है। रुको, मुझे इसमें संशोधन करने दीजिए। आपको यह समझने की आवश्यकता है कि संतुलित बाइनरी ट्री कैसे काम करता है। एक द्विआधारी पेड़ को संतुलित किए बिना, आपको इसकी खोज के साथ कोई वास्तविक लाभ नहीं मिलता है।
आओ हम कहते हैं कि हमें यह पेड़ मिला है:
और हम इसमें एक '8' डालें। अब हमें मिल गया है:
और वह संतुलित नहीं है। तो, हम चलते हैं और कुछ कार्यान्वयन के माध्यम से इसे संतुलित करने का जादू करते हैं ...
और आपको फिर से एक संतुलित पेड़ मिला है। लेकिन वह बहुत जादू था मैंने अपना हाथ लहराया।
एक सूची छोड़ें देता है।
यह एक आदर्श के रूप में होता है। कुछ हैं, लेकिन यह संतुलित बाइनरी ट्री प्रकृति को दर्शाता है कि स्किपिस्ट आदर्श सन्निकट है।
अब, हम वहां 6 डालना चाहते हैं। यह एक लिंक्ड सूची की तरह इसे सम्मिलित कर रहा है। हालांकि, हम शीर्ष पर शुरू करते हैं और नीचे जाते हैं। 5. शीर्ष अंक 6> 5 है? हाँ। ठीक है, अब शीर्ष अंक अंत तक, इसलिए हम स्टैक नीचे जाते हैं (हम 5 पर हैं)। अगला है 7. क्या 6> 7? नहीं। इसलिए हम एक स्तर नीचे जाते हैं और हम आधार स्तर पर होते हैं इसलिए हम 6 को 5 के दाईं ओर सम्मिलित करते हैं।
हम एक सिक्का फ्लिप करते हैं - हम जो सिर बनाते हैं, हम टिक जाते हैं। पूंछ। ज्यादा कुछ करने की जरूरत नहीं है।
अब वह 8 डालें। 8> 5? हां। > 7? हां। और अब हम तीर और स्टैक का अनुसरण करने के बाद फिर से निचले स्तर पर हैं और हम 8> 11 का परीक्षण करते हैं? नहीं। इसलिए हम 7 के दाईं ओर 8 डालें।
हम एक सिक्का फ्लिप करते हैं - हम जो सिर बनाते हैं, हम टिक जाते हैं। पूंछ। ज्यादा कुछ करने की जरूरत नहीं है।
संतुलित वृक्ष में, हम सभी को पेड़ के बारे में काम करना होगा जो अब संतुलित नहीं है। लेकिन यह एक पेड़ नहीं है - इसकी एक स्किप सूची है। हम एक संतुलित वृक्ष का अनुमान लगाते हैं।
अब एक इन्सर्ट करते हैं। 10. मैं सभी तुलनाओं से बचूँगा।
हम एक सिक्का फ्लिप करते हैं - हम जो सिर बनाते हैं, हम टिक जाते हैं। प्रमुखों! और इसे फिर से फ्लिप करें, फिर से हेड! इसे फिर से फ्लिप करें, ठीक है, एक पूंछ है। आधार से जुड़ी सूची से दो स्तर ऊपर।
यहाँ लाभ यह है कि अब अगर हम 12 को सम्मिलित करने जा रहे हैं, तो हम उन सभी अन्य तुलनाओं को किए बिना 5 से 10 तक छोड़ सकते हैं । हम स्किप सूची के साथ उन पर छोड़ सकते हैं। और हमें संतुलित पेड़ के बारे में चिंता करने की ज़रूरत नहीं है - स्टैकिंग की संभावना प्रकृति हमारे लिए है।
यह इतना उपयोगी क्यों है? क्योंकि 10 डालने पर मैं पूरे ढांचे के बजाय 5 और 7 और 8 बिंदुओं पर लिखकर ताला लगा सकता हूं। और जब मैं ऐसा कर रहा हूं, तब भी पाठक असंगत अवस्था में न होते हुए भी स्किप सूची से गुजर सकते हैं। समवर्ती उपयोग के लिए, इसके तेजी से लॉक नहीं होना चाहिए। नीचे की परत पर पुनरावृत्ति के लिए, एक पेड़ की तुलना में इसकी तेजी (पेड़ नेविगेशन के लिए बीएफएस और डीएफएस एल्गोरिदम की खुशियाँ - आपको उनके बारे में चिंता करने की ज़रूरत नहीं है)।
क्या आप इसका सामना करेंगे? आप शायद इसे स्थानों में उपयोग में देखेंगे। और फिर आपको पता चल जाएगा कि लेखक ने संरचना के लिए या उसके बजाय उस कार्यान्वयन को क्यों चुना ।TreeMap
HashMap
इसका बहुत कुछ मेरे ब्लॉग पोस्ट: द स्किप लिस्ट से उधार लिया गया है