तेजी से अनुक्रमण, परिशिष्ट, पूर्वसर्ग, पुनरावृत्ति के साथ सरणी-जैसे अपरिवर्तनीय (लगातार) डेटा संरचना कार्यान्वयन


11

मैं सरणी (लेकिन अपरिवर्तनीय) के समान एक निरंतर डेटा संरचना की तलाश कर रहा हूं , जो तेजी से अनुक्रमण, एपेंड, प्रीपेन्ड और इटेरियन (अच्छे इलाके) संचालन के लिए अनुमति देता है।

क्लोजर लगातार वेक्टर प्रदान करता है, लेकिन यह केवल तेज एपेंड के लिए है। स्काला के वेक्टर में प्रभावी रूप से निरंतर-समय के एपेंड और प्रीपेन्ड हैं, लेकिन मैं इसे लागू नहीं कर सकता, क्योंकि यह एक ही डेटा संरचना (बिट-मैप्ड वेक्टर ट्राइ) पर आधारित है, जबकि क्लोजर वेक्टर, और, जैसा कि मैं समझता हूं, बिट-मैप वेक्टर वेक्टर कुछ तरकीबों के बिना तेज गति नहीं कर सकते।

मैं कार्यान्वयन का उपयोग करने के लिए तैयार नहीं हूं, लेकिन इस तरह के डेटा संरचना को स्वयं कैसे लागू किया जाए, इसके विवरण में हूं।

जवाबों:


13

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

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

मानक संदर्भ क्रिस ओकासाकी की 1998 की पुस्तक "विशुद्ध रूप से कार्यात्मक डेटा संरचनाएं" है।
यह सभी देखें


धन्यवाद। आरआरबी-पेड़ों की तरह लग रहा है कि अच्छे उम्मीदवार हैं, और उनके पास पहले से ही (पूर्ण नहीं) क्लोजर कार्यान्वयन है।
तवरोह

मुझे लगता है कि ओकासाकी हमें बताता है कि अपरिवर्तनीयता और दृढ़ता के तहत इन रनटाइम को कैसे प्राप्त किया जाए?
राफेल

1
@ राफेल, युप। मैंने यह बताने के लिए संदर्भ जोड़े हैं कि आप रनटाइम कैसे प्राप्त करते हैं (मेरे उत्तर की शुरुआत में)।
डीडब्ल्यू

4

मैंने अपने लेख में वृद्धिशील नियमित अभिव्यक्ति मिलान के बारे में इस तरह की डेटा संरचना के एक कार्यान्वयन का वर्णन किया है - देखें http://jkff.info/articles/ire/#ropes-strings-with-fast-concatenation और उस खंड के नीचे और ऊपर पाठ ।

यह एक निरंतर ऊंचाई वाले पेड़ (जैसे बी-पेड़ या 2-3 पेड़) की एक किस्म है। मूल रूप से यह एक (2,3) पेड़ है, जिसके पत्ते प्रति तत्व माथे से बचने के लिए (एन, 2 एन -1) सरणियाँ हैं। (A (N, 2N-1) सरणी एक ऐसा सरणी है जिसकी लंबाई N..2N-1 की सीमा में है।) बड़ा N आपको छोटे ओवरहेड देता है, लेकिन विभाजन और विभाजन की जटिलता को रैखिक रूप से बढ़ाता है। अनुक्रमण, विभाजन और संघनन जैसे ऑपरेशन 2-3 पेड़ों में काम करने के तरीके के समान होते हैं, जो पत्ती स्तर पर (एन, 2 एन -1) को सामान्य करते हैं।


कड़ियाँ टूटती हैं; कृपया एक उचित, मजबूत संदर्भ दें (जो लोगों को लिंक के बिना आपके पेपर को खोजने की अनुमति देता है)।
राफेल

मैंने अपनी व्यक्तिगत वेबसाइट पर केवल किसी भी पत्रिका में पेपर प्रकाशित नहीं किया। शायद यह Arxiv पर डाल दिया जाना चाहिए, हालांकि, अच्छा विचार है।
jkff

मैं ज्यादातर लेखक (एस), शीर्षक और वर्ष के बारे में सोच रहा था - जो आवश्यकता होने पर Googling को आसान बनाता है। इसे arXiv पर रखना और भी बेहतर होगा, सच!
राफेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.