क्या SortedList<TKey,TValue>
और SortedDictionary<TKey,TValue>
के बीच कोई वास्तविक व्यावहारिक अंतर है? क्या ऐसी कोई परिस्थितियां हैं जहां आप विशेष रूप से एक का उपयोग करेंगे, न कि दूसरे?सॉर्टेडलिस्ट और सॉर्टेड डिक्शनरी के बीच क्या अंतर है?
उत्तर
हां - उनकी प्रदर्शन विशेषताओं में काफी भिन्नता है। शायद उन्हें SortedList
और SortedTree
पर कॉल करना बेहतर होगा क्योंकि यह कार्यान्वयन को अधिक बारीकी से दर्शाता है।
विभिन्न बैठकों में विभिन्न संचालन के प्रदर्शन के विवरण के लिए उनमें से प्रत्येक के लिए एमएसडीएन दस्तावेज़ (SortedList
, SortedDictionary
) देखें। यहाँ एक अच्छा सारांश (SortedDictionary
डॉक्स से) है:
SortedDictionary<TKey, TValue>
सामान्य वर्ग हे (लॉग एन) पुनः प्राप्ति, जहां n शब्दकोश में तत्वों की संख्या है के साथ एक द्विआधारी खोज वृक्ष है। इसमें, यहSortedList<TKey, TValue>
जेनेरिक कक्षा के समान है। दोनों वर्गों में ऑब्जेक्ट मॉडल समान हैं, और दोनों में ओ (लॉग एन) पुनर्प्राप्ति है। कहाँ दो वर्गों अलग स्मृति उपयोग में है और प्रविष्टि की गति और हटाने:
SortedList<TKey, TValue>
SortedDictionary<TKey, TValue>
से कम स्मृति का उपयोग करता है।
SortedDictionary<TKey, TValue>
तेजी से प्रविष्टि और हटाने अवर्गीकृत डेटा के लिए कार्य किया है, हे (लॉग एन) रूपSortedList<TKey, TValue>
के लिए हे (एन) के लिए विरोध किया।सूची क्रमबद्ध डेटा से सभी को एक बार से भर जाता है, तो
SortedList<TKey, TValue>
तेजी सेSortedDictionary<TKey, TValue>
है।
(SortedList
वास्तव में नहीं बल्कि एक पेड़ का उपयोग करने से, एक क्रमबद्ध सरणी का कहना है यह अभी भी तत्व को खोजने के लिए द्विआधारी खोज का उपयोग करता है।।)
पॉइंटर्स के लिए सभी को धन्यवाद। मुझे लगता है कि मैं आरटीएफएम के लिए बहुत आलसी हूं ... SO पर अच्छे लोगों से पूछना बहुत आसान है ...;) मैंने आपको दोनों जवाबों के लिए वोट दिया; ट्रिगर पर पहले होने के लिए जॉन को जवाब क्रेडिट मिलता है। :) –
मुझे लगता है कि सॉर्टेडलिस्ट परिभाषा को सही किया जाना चाहिए क्योंकि मुझे विश्वास नहीं है कि यह एक बाइनरी खोज पेड़ है ...? – nchaud
मैंने परावर्तक का उपयोग करके देखा और पाया कि उसने बाइनरी खोज पेड़ का उपयोग नहीं किया है। –
बाहर चेक MSDN page for SortedList:
टिप्पणी अनुभाग से:
SortedList<(Of <(TKey, TValue>)>)
सामान्य वर्ग,O(log n)
पुनः प्राप्ति के साथ एक द्विआधारी खोज वृक्ष है जहांn
शब्दकोश में तत्वों की संख्या है। इसमें, यहSortedDictionary<(Of <(TKey, TValue>)>)
जेनेरिक वर्ग के समान है। दोनों वर्गों में समान ऑब्जेक्ट मॉडल होते हैं, और दोनों मेंO(log n)
पुनर्प्राप्ति होती है। कहाँ दो वर्गों अलग स्मृति का उपयोग करें और प्रविष्टि और हटाने की गति में है:
SortedList<(Of <(TKey, TValue>)>)
SortedDictionary<(Of <(TKey, TValue>)>)
से कम स्मृति का उपयोग करता है।
SortedDictionary<(Of <(TKey, TValue>)>)
के लिएO(n)
के विपरीत,O(log n)
के बिना निरंतर डेटा,O(log n)
के लिए तेजी से सम्मिलन और निष्कासन संचालन है।यदि सूची क्रमबद्ध डेटा से एक बार में पॉप्युलेट की जाती है, तो
SortedList<(Of <(TKey, TValue>)>)
SortedDictionary<(Of <(TKey, TValue>)>)
से तेज़ है।
उद्धृत पाठ गलत है (और एमएसडीएन पर अपडेट किया गया था): सॉर्टेडलिस्ट एक "बाइनरी सर्च ट्री" नहीं है, यह "कुंजी/मूल्य जोड़े की सरणी" है। –
मैं खुले परावर्तक फटा के रूप में वहाँ SortedList
के बारे में भ्रम का एक सा प्रतीत हो रहा है इस पर एक नज़र है करने के लिए। यह वास्तव में एक द्विआधारी खोज पेड़ नहीं है, यह कुंजी-मूल्य जोड़े की एक क्रमबद्ध (कुंजी द्वारा) सरणी है। TKey[] keys
वैरिएबल भी है जो कुंजी-मूल्य जोड़े के साथ सिंक में क्रमबद्ध है और बाइनरी खोज के लिए उपयोग किया जाता है।
यहाँ कुछ स्रोत मेरी दावों बैकअप के लिए (.NET 4.5 को लक्षित करना) है।
निजी सदस्यों
// Fields
private const int _defaultCapacity = 4;
private int _size;
[NonSerialized]
private object _syncRoot;
private IComparer<TKey> comparer;
private static TKey[] emptyKeys;
private static TValue[] emptyValues;
private KeyList<TKey, TValue> keyList;
private TKey[] keys;
private const int MaxArrayLength = 0x7fefffff;
private ValueList<TKey, TValue> valueList;
private TValue[] values;
private int version;
SortedList.ctor (IDictionary, IComparer)
public SortedList(IDictionary<TKey, TValue> dictionary, IComparer<TKey> comparer) : this((dictionary != null) ? dictionary.Count : 0, comparer)
{
if (dictionary == null)
{
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.dictionary);
}
dictionary.Keys.CopyTo(this.keys, 0);
dictionary.Values.CopyTo(this.values, 0);
Array.Sort<TKey, TValue>(this.keys, this.values, comparer);
this._size = dictionary.Count;
}
SortedList.Add (TKey, TValue): शून्य
public void Add(TKey key, TValue value)
{
if (key == null)
{
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.key);
}
int num = Array.BinarySearch<TKey>(this.keys, 0, this._size, key, this.comparer);
if (num >= 0)
{
ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_AddingDuplicate);
}
this.Insert(~num, key, value);
}
SortedList.RemoveAt (int): शून्य
public void RemoveAt(int index)
{
if ((index < 0) || (index >= this._size))
{
ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.index, ExceptionResource.ArgumentOutOfRange_Index);
}
this._size--;
if (index < this._size)
{
Array.Copy(this.keys, index + 1, this.keys, index, this._size - index);
Array.Copy(this.values, index + 1, this.values, index, this._size - index);
}
this.keys[this._size] = default(TKey);
this.values[this._size] = default(TValue);
this.version++;
}
यहाँ एक सारणीबद्ध दृश्य है अगर यह मदद करता है ...
एक प्रदर्शन परिप्रेक्ष्य से:
+------------------+---------+----------+--------+----------+----------+---------+
| Collection | Indexed | Keyed | Value | Addition | Removal | Memory |
| | lookup | lookup | lookup | | | |
+------------------+---------+----------+--------+----------+----------+---------+
| SortedList | O(1) | O(log n) | O(n) | O(n)* | O(n) | Lesser |
| SortedDictionary | n/a | O(log n) | O(n) | O(log n) | O(log n) | Greater |
+------------------+---------+----------+--------+----------+----------+---------+
* Insertion is O(1) for data that are already in sort order, so that each
element is added to the end of the list (assuming no resize is required).
एक से कार्यान्वयन परिप्रेक्ष्य:
+------------+---------------+----------+------------+------------+------------------+
| Underlying | Lookup | Ordering | Contiguous | Data | Exposes Key & |
| structure | strategy | | storage | access | Value collection |
+------------+---------------+----------+------------+------------+------------------+
| 2 arrays | Binary search | Sorted | Yes | Key, Index | Yes |
| BST | Binary search | Sorted | No | Key | Yes |
+------------+---------------+----------+------------+------------+------------------+
लगभग पैराफ्रेज, यदि आपको कच्चे प्रदर्शन की आवश्यकता है SortedDictionary
बेहतर विकल्प हो सकता है। यदि आपको कम मेमोरी ओवरहेड और अनुक्रमित पुनर्प्राप्ति की आवश्यकता है SortedList
बेहतर फिट बैठता है। See this question for more on when to use which.
ध्यान दें कि यदि आप अच्छे प्रदर्शन ** और ** अपेक्षाकृत कम मेमोरी उपयोग ** और ** अनुक्रमित पुनर्प्राप्ति चाहते हैं, तो लॉयकोर में ['BDictionary
@Qwertie क्या एक प्रदर्शन बेंचमार्क उपलब्ध है? – nawfal
हां, [इस आलेख] के निचले हिस्से को देखें (http://core.loyc.net/collections/alists-part3.html)। यह पता चला है कि 'BDictionary' आमतौर पर बहुत बड़े आकार को छोड़कर' सॉर्टेड डिक्शनरी 'से धीमा होता है, लेकिन यदि 700 से अधिक आइटम हैं तो यह' सॉर्टेडलिस्ट 'से तेज़ है। पेड़ की पत्तियों में सरणी के उपयोग के कारण मेमोरी का उपयोग 'सॉर्टेड लिस्ट' ('सॉर्टेड डिक्शनरी' से बहुत कम) से थोड़ा अधिक होना चाहिए। – Qwertie
यह कैसे प्रदर्शन दूसरे से तुलना के दृश्य प्रतिनिधित्व है।
सूचकांक एक्सेस (यहाँ उल्लेख) व्यावहारिक अंतर है। यदि आपको उत्तराधिकारी या पूर्ववर्ती तक पहुंचने की आवश्यकता है, तो आपको सॉर्टेडलिस्ट की आवश्यकता है। SortedDictionary ऐसा नहीं कर सकता है ताकि आप सॉर्टिंग (प्रथम/foreach) का उपयोग कैसे कर सकें।
पर्याप्त रूप से इस विषय पर पर्याप्त कहा जाता है, हालांकि इसे सरल रखना, यहां मेरा लेना है।
छाँटे शब्दकोश इस्तेमाल किया जाना चाहिए when-
- अधिक आवेषण और संचालन हटाना आवश्यक हैं।
- अन-आदेश में डेटा।
- कुंजी का उपयोग करने के लिए पर्याप्त है और सूचकांक का उपयोग की आवश्यकता नहीं है।
- मेमोरी अड़चन नहीं है।
दूसरी ओर, सॉर्ट की गई सूची इस्तेमाल किया जाना चाहिए when-
- अधिक लुकअप और कम आवेषण और संचालन हटाना आवश्यक हैं।
- डेटा पहले से ही (यदि सभी नहीं, सबसे) क्रमबद्ध किया जाता है।
- सूचकांक पहुंच आवश्यक है।
- मेमोरी एक ओवरहेड है।
आशा इस मदद करता है !!
- 1. सॉर्टेडलिस्ट बनाम सॉर्टेड डिक्शनरी बनाम सॉर्ट करें()
- 2. सॉर्टेड डिक्शनरी
- 3. सॉर्टेड डिक्शनरी
- 4. स्कीमा और डेटा डिक्शनरी के बीच क्या अंतर है?
- 5. हैशटेबल और डिक्शनरी के बीच क्या अंतर है?
- 6. किसी ऑब्जेक्ट और डिक्शनरी के बीच अंतर?
- 7. सॉर्टेड डिक्शनरी एक लाल-काला पेड़ है?
- 8. सॉर्टेड डिक्शनरी को इतना ऊपरी क्यों चाहिए?
- 9. सॉर्टेड डिक्शनरी के लिए कस्टम आईसीओएमपेयर का उपयोग कैसे करें?
- 10. क्या बीच का अंतर है परिवर्तनशील और अपरिवर्तनीय
- 11. # {} $ {} और% {} के बीच क्या अंतर है?
- 12. [अपरिभाषित] और [,] के बीच क्या अंतर है?
- 13. $ और $$ के बीच क्या अंतर है?
- 14. के बीच क्या अंतर है:। और: आर !?
- 15. भिन्नता और '-' के बीच क्या अंतर है?
- 16. "$^एन" और "$ +" के बीच क्या अंतर है?
- 17. अंतर बी/डब्ल्यू हैशटेबल, डिक्शनरी और कीवैल्यूपेयर क्या अंतर हैं?
- 18. के बीच क्या अंतर है?
- 19. डिक्शनरी और हैशटेबल
- 20. अंतर और कहां के बीच क्या अंतर है?
- 21. file_get_contents और fread बीच क्या अंतर है
- 22. क्या बीच का अंतर है :: और ::: स्काला
- 23. "। +" और "। +?" के बीच अंतर
- 24. ऑर्डर्ड डिक्शनरी, लिस्ट डिक्शनरी और हाइब्रिड डिक्शनरी
- 25. $ {} और # {} के बीच अंतर क्या हैं?
- 26. PHP के बीच क्या अंतर है और इसमें शामिल है?
- 27. अपवाद के .TOString() और मैसेज के बीच क्या अंतर है?
- 28. 7zip के 7z.sfx और 7zsd.sfx के बीच क्या अंतर है?
- 29. डीएल के फाइलवर्सन और उत्पादवर्जन के बीच क्या अंतर है?
- 30. UIImageView के फ्रेम और सीमाओं के बीच क्या अंतर है?
संबंधित: [सॉर्टेडलिस्ट या सॉर्टेड डिक्शनरी का उपयोग कब करें] (http://stackoverflow.com/questions/1376965/when-to-use-a-sortedlisttkey-tvalue-over-a-sorteddictionarytkey-tvalue) – Liam
I उलझन में हूँ क्यों SortedList दो प्रकार पैरामीटर 'SortedList' बल्कि एक 'SortedList ' से है? यह 'IList ' क्यों लागू नहीं करता है? –
@ कोलोनेलपैनिक क्योंकि कार्यात्मक रूप से सॉर्टेडलिस्ट एक नक्शा है, एक रैखिक संग्रह नहीं है। नाम को मूर्ख मत बनाओ। एक शब्दकोश की तरह, आप एक कुंजी में गुजरते हैं, आपको एक मूल्य वापस मिलता है। जबकि शब्दकोश अनियंत्रित है, सॉर्टेडलिस्ट को अपने प्राकृतिक क्रमबद्ध क्रम में आदेश दिया जाता है। – nawfal