সাজানো তালিকা এবং সাজানো অভিধানের মধ্যে পার্থক্য কী?


261

SortedList<TKey,TValue>এবং ক এর মধ্যে কোন বাস্তব ব্যবহারিক পার্থক্য আছে SortedDictionary<TKey,TValue>? এমন কোনও পরিস্থিতি রয়েছে যেখানে আপনি নির্দিষ্টভাবে অন্যটি ব্যবহার করবেন না?



13
আমি বিভ্রান্ত কেন সোর্টার্ডলিস্টে SortedList<TKey,TValue>একের চেয়ে দুটি ধরণের পরামিতি রয়েছে SortedList<T>? কেন এটি বাস্তবায়ন হয় না IList<T>?
কর্নেল আতঙ্ক ২

3
@ কলোনেলপ্যানিক কারণ কার্যকরীভাবে সাজানো তালিকা একটি মানচিত্র, লিনিয়ার সংগ্রহ নয়। নামটি আপনাকে বোকা বানাবে না। অভিধানের মতো আপনি কীতে পাস করুন, আপনি একটি মান ফিরে পাবেন। অভিধানটি আনর্ডার্ড না করা অবস্থায়, বাছাই করা তালিকাকে তার প্রাকৃতিক সাজানো ক্রমে অর্ডার দেওয়া হয়।
নওফাল

উত্তর:


294

হ্যাঁ - তাদের কর্মক্ষমতা বৈশিষ্ট্যগুলি উল্লেখযোগ্যভাবে পৃথক। তাদের কল করা সম্ভবত আরও ভাল হবে 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আসলে গাছ ব্যবহারের চেয়ে বরং বাছাই করা অ্যারে বজায় রাখে It এটি এখনও উপাদানগুলি সন্ধানের জন্য বাইনারি অনুসন্ধান ব্যবহার করে))


পয়েন্টারদের জন্য সবাইকে অনেক ধন্যবাদ। আমি অনুমান করি যে আমি আরটিএফএমের কাছে খুব অলস ... এসও-তে সুন্দর লোকদের জিজ্ঞাসা করা আরও সহজ ...;) আমি আপনাকে উভয়কে জবাব দিয়েছি; ট্রি ট্রিগারটিতে প্রথম হওয়ার জন্য উত্তর ক্রেডিট পান। :)
শৈল বেহর

2
আমি মনে করি সাজানো তালিকার সংজ্ঞাটি সংশোধন করা উচিত কারণ আমি বিশ্বাস করি না এটি বাইনারি অনুসন্ধানের ট্রি ...?
nchaud

1
আমি প্রতিফলক ব্যবহার করে দেখেছি এবং এটি বাইনারি অনুসন্ধান গাছ ব্যবহার করে নি।
ড্যানিয়েল ইমস

। আমি মনে করি Sorteddictionary একটি AVL-ট্রি বা লাল-Blacktree (সমস্ত অপারেশন খরচ হে (logn) এবং SortedList একটি বাইনারি-অনুসন্ধান ব্যবহার করে (ণ (ঢ) সবচেয়ে খারাপ ক্ষেত্রে সময়) ঠ খরচ
Ghoster

105

এখানে একটি সারণী দর্শনটি যদি সহায়তা করে ...

একটি পারফরম্যান্স দৃষ্টিকোণ থেকে:

+------------------+---------+----------+--------+----------+----------+---------+
| 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আরও ভাল ফিট করে। কোনটি কখন ব্যবহার করবেন সে সম্পর্কে আরও জানতে এই প্রশ্নটি দেখুন।

আপনি এখানে , এখানে , এখানে , এখানে এবং এখানে আরও পড়তে পারেন ।


মনে রাখবেন যে আপনি যদি ভাল পারফরম্যান্স এবং অপেক্ষাকৃত কম মেমরির ব্যবহার এবং BDictionary<Key,Value>সূচিযুক্ত পুনরুদ্ধার চান তবে লয়িকোরের পরিবর্তে বিবেচনা করুন SortedDictionary
কিওয়ারটি

1
হ্যাঁ, এই নিবন্ধটির নীচের অংশটি দেখুন । এটি দেখা যায় BDictionaryযে SortedDictionaryখুব বড় আকারের চেয়ে সাধারণত ধীর হয় তবে SortedList700 বা তার বেশি আইটেম থাকলে এটির চেয়ে দ্রুত । গাছের পাতায় অ্যারে ব্যবহারের কারণে মেমরির ব্যবহার SortedList( তুলনায় অনেক কম SortedDictionary) থেকে কিছুটা বেশি হওয়া উচিত ।
কিওয়ারটি

22

আমি এটি দেখার জন্য উন্মুক্ত রিফ্লেক্টরকে ক্র্যাক করেছি কারণ এটি সম্পর্কে কিছুটা বিভ্রান্তি আছে বলে মনে হচ্ছে SortedList। এটি বাস্তবে কোনও বাইনারি অনুসন্ধানের গাছ নয়, এটি মূল-মান জোড়ার সাজানো (কী দ্বারা) অ্যারে । এখানে একটি TKey[] keysভেরিয়েবল রয়েছে যা কী-মান জোড়ার সাথে সিঙ্কে বাছাই করা হয় এবং বাইনারি অনুসন্ধানে ব্যবহৃত হয়।

আমার দাবির ব্যাকআপ নেওয়ার জন্য এখানে কিছু উত্স (টার্গেট। নেট 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;

সাজানো তালিকাসমূহ (আইডোরিয়াম, আইকোম্পার)

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;
}

সাজানো তালিকা.এড (টি কে, টিভিয়াল): শূন্য v

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);
}

সাজানো তালিকাগুলি সরানোআউট (ইনট): শূন্য

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++;
}

13

পরীক্ষা করে দেখুন SortedList জন্য দুটিই MSDN পৃষ্ঠা :

মন্তব্য বিভাগ থেকে:

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(log n)যেমন উল্টোদিকে O(n)জন্য SortedList<(Of <(TKey, TValue>)>)

  • যদি তালিকাটি সাজানো ডেটা থেকে একবারে SortedList<(Of <(TKey, TValue>)>)পপুলেটে করা হয় তবে তার চেয়ে দ্রুত SortedDictionary<(Of <(TKey, TValue>)>)


9
উদ্ধৃত পাঠ্যটি ভুল (এবং এমএসডিএন-তে আপডেট করা হয়েছিল): সোর্টডলিস্ট কোনও "বাইনারি অনুসন্ধান ট্রি" নয়, এটি "কী / মান জোড়ার অ্যারে"।
এল্ড্রিচ কনড্রাম

12

পারফরম্যান্স একে অপরের সাথে কীভাবে তুলনা করা হয় এটি এটির দর্শনের উপস্থাপনা।


আপনি কোথা থেকে এই তথ্য নিয়েছেন? এই স্কিম থেকে আমরা দেখতে পাচ্ছি যে ডিক্টিনারি কোনওভাবেই ভাল, তাই অন্যের অস্তিত্বের কোনও কারণ নেই।
অ্যালেক্স কোস্টিন

9

বিষয়টিকে ইতিমধ্যে যথেষ্ট বলা হয়েছে, তবে এটি সহজ রাখতে এখানে আমার গ্রহণ।

বাছাই করা অভিধানটি কখন ব্যবহার করা উচিত-

  • আরও সন্নিবেশ এবং মুছুন অপারেশন প্রয়োজন।
  • অ-অর্ডারযুক্ত ডেটা।
  • মূল অ্যাক্সেস যথেষ্ট এবং সূচী অ্যাক্সেসের প্রয়োজন নেই।
  • স্মৃতি কোনও বাধা নয়।

অন্যদিকে, বাছাই করা তালিকাটি কখন ব্যবহার করা উচিত-

  • আরও অনুসন্ধান এবং কম সন্নিবেশ এবং অপসারণ অপারেশন প্রয়োজন।
  • ডেটা ইতিমধ্যে বাছাই করা হয়েছে (সমস্ত না থাকলে, বেশিরভাগ)।
  • সূচকের অ্যাক্সেস প্রয়োজন।
  • স্মৃতি একটি ওভারহেড।

আশাকরি এটা সাহায্য করবে!!


1

সূচক অ্যাক্সেস (এখানে উল্লিখিত) ব্যবহারিক পার্থক্য। আপনার যদি উত্তরসূরি বা পূর্বসূরীর অ্যাক্সেসের প্রয়োজন হয় তবে আপনার সোর্টার্ডলিস্ট প্রয়োজন। সাজানো অভিধান এটি করতে পারে না তাই আপনি কীভাবে বাছাই করতে পারবেন তার সাথে মোটামুটি সীমাবদ্ধ (প্রথম / অগ্রণী)।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.