ImmutableSreadDictionary कुंजी द्वारा गणन रेंज


11

मैं 'के बारे में सी # पढ़ रहा था एस ImmutableSortedDictionaryमें System.Collections.Immutableकैसे मेरे कार्यक्रम में इसे लागू करने के बारे में सोच और। मुझे C ++ का बहुत पसंद है lower_boundऔर upper_bound( यहाँ देखें ), और मैं रेंज लुकअप के लिए कुछ देखने की अपेक्षा कर रहा था। हालांकि, इसी तरह के तरीके प्रलेखन से अजीब तरह से अनुपस्थित प्रतीत होते हैं । क्या मैं कुछ भूल रहा हूँ? या क्या एमएस वास्तव में सॉर्ट की गई श्रेणियों तक कुशल पहुंच के बिना एक सॉर्ट किया गया शब्दकोश प्रदान करता है? यह बिल्कुल ऐसा नहीं लगता है कि कोई व्यक्ति IEnumerableकुंजियों पर कर सकता है जैसा कि एक विस्तार विधि कहती है, इसलिए मैं थोड़ा हैरान हूं कि मैं संग्रह द्वारा सीधे प्रदान की गई कुछ चीज़ नहीं देख रहा हूं।


एरिक लिपर्ट ने 2008 में एक अपरिवर्तनीय एवीएल वृक्ष कार्यान्वयन को साझा किया। टिप्पणियों से, मुझे नहीं लगता कि यह विशेष रूप से गति या दक्षता के लिए अभी तक अनुकूलित है, लेकिन IBinarySearchTree<K,V>यह लागू होता है कि मैं क्या उम्मीद करता हूं। मुझे आश्चर्य होता है कि क्या उसने कभी इस पर और तंज कसा?
J Trana

ImmutableList<T>वर्ग भी एक AVL पेड़ के रूप में कार्यान्वित किया जाता है। से स्रोत कोड :/// The root node of the AVL tree that stores this set.
थियोडोर Zoulias

क्या आप जानते हैं कि उनका मतलब यह है कि सूची अचलता को लागू करने के लिए एवीएल सच का उपयोग करती है या यदि एवीएल वृक्ष स्वयं अपरिवर्तनीय है? (शायद यह कोई फर्क नहीं पड़ता क्योंकि वे पेड़ को वैसे भी उजागर नहीं करते हैं)।
जे ट्राना

प्रलेखन के अनुसार, ( ImmutableList<T>एवीएल पेड़ द्वारा समर्थित) ImmutableArray<T>(एक सरणी द्वारा समर्थित ) से अधिक के फायदे यहां दिए गए हैं । अपरिवर्तनीय सूची का उपयोग करने के कारण: 1) डेटा को अपडेट करना आम है या तत्वों की संख्या छोटी होने की उम्मीद नहीं है। 2) सामग्री को अपडेट करने की तुलना में संग्रह को अपडेट करना अधिक प्रदर्शन महत्वपूर्ण है।
थियोडोर ज़ूलियास

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

जवाबों:


9

यह परेशान करने वाला है कि उपलब्ध बिल्ट-इन कलेक्शन सुविधाओं के एक पूरे सेट (जैसे SortedDictionaryकि एक BinarySearchविधि की कमी ) की पेशकश नहीं कर रहे हैं , हमें तीसरे पक्ष के समाधान (जैसे सी 5 लाइब्रेरी ) की खोज करने के लिए मजबूर कर रहे हैं ।

आपके मामले में आप के बजाय ImmutableSortedDictionaryशायद एक का उपयोग कर सकते हैं ImmutableSortedSet, कुंजी में मूल्यों को एम्बेड करना और एक उपयुक्त तुलनित्र का उपयोग करना। कम से कम इस वर्ग के एपीआई में गुण हैं Minऔर Max


2
एक साइड नोट के रूप में, एक अन्य अपरिवर्तनीय वर्ग, को एक पेड़ के रूप मेंImmutableList<T> आंतरिक रूप से लागू किया जाता है । तो यह 10 गुना धीमा है और एक से 12 गुना अधिक मेमोरी आवंटित करता है List<T>ImmutableArray<T>इसके बजाय उपयोग करें ।
थियोडोर जूलियास

1
हे, मैं पहले से ही C5 का उपयोग करता हूं, लेकिन यह देखने के लिए कि क्या अपरिवर्तनीय संग्रह (स्नैपशॉट से परे) के लिए उपलब्ध था। धन्यवाद! मैं उम्मीद करने जा रहा हूं कि किसी और ने इसे किसी तरह से आकार या रूप में हल किया है, लेकिन मैं ध्यान में ImmutableSortedSet
रखूंगा

@ TheodorZoulias SortedDictionary में जब BinarySearch विधि होने की बात है, तो TryGetValue विधि लॉग (N) में काम कर रही है? यहाँ देखें
गियोर्गी छिक्कवद्ज़े

2
@GiorgiChkhikvadze बाइनरीसर्च आपको अगला तत्व दे सकता है जो आपके द्वारा खोजे जा रहे आइटम से बड़ा है, यदि कोई सटीक मिलान नहीं मिला है।
थियोडोर जूलियास

1
@GiorgiChkhikvadze संभवतः यहाँ सबसे बड़ा अंतर यह है कि वापसी मूल्य संग्रह में केवल एक मूल्य नहीं है, बल्कि संग्रह में कुशलता से अनुक्रमित करने का एक तरीका है। बाइनरीसर्च विधि न केवल विशेष है क्योंकि यह मूल्य को कुशलता से ढूंढती है, बल्कि इसलिए कि यह एक इंडेक्स को मिस के मामले में भी इंडेक्स के रूप में इंगित करता है - जो कि एक सरणी में तेजी से पहुंच की अनुमति देता है। हालांकि एक पेड़ के मामले में, पूर्णांक सूचकांक संरचना तक पहुंचने के लिए एक कुशल तरीका नहीं हो सकता है; C ++ एक इट्रेटर ऑब्जेक्ट के उपयोग के माध्यम से इसे हल करता है (यद्यपि अपनी जटिलताओं के साथ)।
जे ट्राना
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.