मैं प्रस्तावित उत्तर प्रदर्शन पर ध्यान केंद्रित कर देख सकता हूं। नीचे दिया गया लेख प्रदर्शन के संबंध में कुछ भी नया प्रदान नहीं करता है, लेकिन यह अंतर्निहित तंत्र की व्याख्या करता है। यह भी ध्यान दें कि यह Collection
प्रश्न में वर्णित तीन प्रकारों पर ध्यान केंद्रित नहीं करता है , लेकिन सभी प्रकार के System.Collections.Generic
नामस्थानों को संबोधित करता है।
http://geekswithblogs.net/BlackRabbitCoder/archive/2011/06/16/c.net-fundamentals-choosing-the-right-collection-class.aspx
अर्क:
शब्दकोश <>
डिक्शनरी संभवतः सबसे अधिक इस्तेमाल किया जाने वाला सहयोगी कंटेनर वर्ग है। डिक्शनरी एसोसिएटिव लुक्स / इंसर्ट / डिलीट के लिए सबसे तेज़ क्लास है क्योंकि इसमें कवर्स के नीचे हैश टेबल का इस्तेमाल किया गया है । चूँकि कुंजियाँ हैशेड हैं, इसलिए कुंजी प्रकार को सही ढंग से गेटहैशकोड () और इक्वल्स () को सही तरीके से लागू करना चाहिए या आपको निर्माण के शब्दकोश में एक बाहरी IEqualityComparer प्रदान करना चाहिए। डिक्शनरी में आइटमों का इन्सर्ट / डिलीट / लुकअप टाइम एमॉर्टाइज़्ड कंटिन्यू टाइम - O (1) है - जिसका मतलब है कि डिक्शनरी कितनी भी बड़ी क्यों न हो, किसी चीज़ को खोजने में लगने वाला समय अपेक्षाकृत स्थिर बना रहता है। यह उच्च गति वाले लुकअप के लिए अत्यधिक वांछनीय है। केवल नकारात्मक पक्ष यह है कि एक हैश तालिका का उपयोग करने की प्रकृति से शब्दकोष अनियंत्रित है, इसलिएआप आसानी से किसी शब्दकोश में आइटम को क्रम में नहीं निकाल सकते ।
SortedDictionary <>
सॉर्टेडवर्क उपयोग में शब्दकोश के समान है लेकिन कार्यान्वयन में बहुत भिन्न है। SortedDictionary कुंजी द्वारा क्रम में आइटम बनाए रखने के लिए कवर के तहत एक द्विआधारी पेड़ का उपयोग करता है । छंटाई के परिणामस्वरूप, कुंजी के लिए उपयोग किए जाने वाले प्रकार को IComparable को सही ढंग से लागू करना चाहिए ताकि कुंजियों को सही ढंग से सॉर्ट किया जा सके। क्रमबद्ध शब्दकोश वस्तुओं को बनाए रखने की क्षमता के लिए थोड़े समय के लुकअप समय को ट्रेड करता है, इस प्रकार सॉर्ट किए गए डिक्शनरी में सम्मिलित / डिलीट / लुकअप समय लॉगरिदमिक होते हैं - ओ (लॉग एन)। आम तौर पर, लघुगणक समय के साथ, आप संग्रह के आकार को दोगुना कर सकते हैं और इसे केवल आइटम खोजने के लिए एक अतिरिक्त तुलना करना होगा। जब आप तेज़ लुकअप चाहते हैं, तो क्रमबद्धता का उपयोग करें, लेकिन कुंजी द्वारा क्रम में संग्रह बनाए रखने में सक्षम होना चाहते हैं।
SortedList <>
SortedList जेनेरिक कंटेनरों में अन्य सॉर्टेड सहयोगी कंटेनर वर्ग है। एक बार फिर से SortedList, SortedDictionary की तरह, कुंजी-मूल्य जोड़े को सॉर्ट करने के लिए एक कुंजी का उपयोग करता है । SortedDictionary के विपरीत, हालांकि, SortedList में आइटम को सॉर्ट की गई सरणी के रूप में संग्रहीत किया जाता है। इसका मतलब है कि सम्मिलन और विलोपन रैखिक हैं - O (n) - क्योंकि किसी आइटम को हटाने या जोड़ने से सूची में सभी आइटम को ऊपर या नीचे स्थानांतरित करना शामिल हो सकता है। लुकअप समय, हालांकि O (लॉग एन) है क्योंकि SortedList अपनी कुंजी द्वारा सूची में किसी भी आइटम को खोजने के लिए एक द्विआधारी खोज का उपयोग कर सकता है। तो आप कभी ऐसा क्यों करना चाहेंगे? खैर, जवाब यह है कि अगर आप SortedList को अप-फ्रंट लोड करने जा रहे हैं, तो इंसुलेशन धीमा हो जाएगा, लेकिन क्योंकि सरणी अनुक्रमण ऑब्जेक्ट लिंक का अनुसरण करने की तुलना में तेज़ है, तो लुकअप थोड़े से एक SortedDictionary की तुलना में तेज़ होते हैं। एक बार फिर मैं इसका उपयोग उन स्थितियों में करूँगा जहाँ आप तेज़ लुकअप चाहते हैं और कुंजी द्वारा क्रम में संग्रह बनाए रखना चाहते हैं, और जहाँ सम्मिलन और विलोपन दुर्लभ हैं।
अंतर्निहित प्रक्रियाओं का टेंटेटिव सारांश
प्रतिक्रिया बहुत स्वागत है क्योंकि मुझे यकीन है कि मुझे सब कुछ ठीक नहीं मिला।
- सभी सरणियाँ आकार की हैं
n
।
- गैर-सॉर्ट किया गया सरणी = .Add / .Remove O (1) है, लेकिन .Item (i) O (n) है।
- सॉर्ट किया गया सरणी = .Add / .Remove O (n) है, लेकिन .Item (i) O (लॉग एन) है।
शब्दकोश
स्मृति
KeyArray(n) -> non-sorted array<pointer>
ItemArray(n) -> non-sorted array<pointer>
HashArray(n) -> sorted array<hashvalue>
जोड़ना
HashArray(n) = Key.GetHash
# O (1) जोड़ें
KeyArray(n) = PointerToKey
# O (1) जोड़ें
ItemArray(n) = PointerToItem
# O (1) जोड़ें
हटाना
For i = 0 to n
, i
जहां HashArray(i) = Key.GetHash
# O (लॉग एन) (सॉर्ट किया गया सरणी) खोजें
HashArray(i)
# O (n) (सॉर्ट किया गया सरणी) निकालें
KeyArray(i)
# O (1) निकालें
ItemArray(i)
# O (1) निकालें
वस्तु ले आओ
For i = 0 to n
, i
जहां HashArray(i) = Key.GetHash
# O (लॉग एन) (सॉर्ट किया गया सरणी) खोजें
- वापसी
ItemArray(i)
फन्दा बनाना
For i = 0 to n
, वापसी ItemArray(i)
SortedDictionary
स्मृति
KeyArray(n) = non-sorted array<pointer>
ItemArray(n) = non-sorted array<pointer>
OrderArray(n) = sorted array<pointer>
जोड़ना
KeyArray(n) = PointerToKey
# O (1) जोड़ें
ItemArray(n) = PointerToItem
# O (1) जोड़ें
For i = 0 to n
, i
जहां KeyArray(i-1) < Key < KeyArray(i)
( ICompare
#) का उपयोग करके खोजें
- जोड़े
OrderArray(i) = n
# हे (एन) (क्रमबद्ध सरणी)
हटाना
For i = 0 to n
, i
जहां KeyArray(i).GetHash = Key.GetHash
# O (n) खोजें
KeyArray(SortArray(i))
# O (n) निकालें
ItemArray(SortArray(i))
# O (n) निकालें
OrderArray(i)
# O (n) (सॉर्ट किया गया सरणी) निकालें
वस्तु ले आओ
For i = 0 to n
, i
जहां KeyArray(i).GetHash = Key.GetHash
# O (n) खोजें
- वापसी
ItemArray(i)
फन्दा बनाना
For i = 0 to n
, वापसी ItemArray(OrderArray(i))
SortedList
स्मृति
KeyArray(n) = sorted array<pointer>
ItemArray(n) = sorted array<pointer>
जोड़ना
For i = 0 to n
, i
जहां KeyArray(i-1) < Key < KeyArray(i)
( ICompare
#) का उपयोग करके खोजें (लॉग एन)
KeyArray(i) = PointerToKey
# O (n) जोड़ें
ItemArray(i) = PointerToItem
# O (n) जोड़ें
हटाना
For i = 0 to n
, i
जहां KeyArray(i).GetHash = Key.GetHash
# O (लॉग एन) खोजें
KeyArray(i)
# O (n) निकालें
ItemArray(i)
# O (n) निकालें
वस्तु ले आओ
For i = 0 to n
, i
जहां KeyArray(i).GetHash = Key.GetHash
# O (लॉग एन) खोजें
- वापसी
ItemArray(i)
फन्दा बनाना
For i = 0 to n
, वापसी ItemArray(i)