সাজানো তালিকা <>, সাজানো অভিধান <> এবং অভিধান <>


102

আমি এটি খুঁজে পাই SortedList<TKey, TValue> SortedDictionary<TKey, TValue>এবং Dictionary<TKey, TValue>একই ইন্টারফেস প্রয়োগ করি।

  1. আমাদের কখন SortedListএবং SortedDictionaryতার চেয়ে বেশি বেছে নেওয়া উচিত Dictionary?
  2. আবেদনের ক্ষেত্রে SortedListএবং এর SortedDictionaryমধ্যে পার্থক্য কী ?

উত্তর:


102
  1. দুটির যে কোনও একটিতে উপাদানগুলির উপর পুনরাবৃত্তি করার সময়, উপাদানগুলি বাছাই করা হবে। তাই না Dictionary<T,V>

  2. এমএসডিএন এর মধ্যে SortedList<T,V>এবং SortedDictionary<T,V>:

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

SortList (TKey, TValue) সোর্টার্ডডোরিয়ান (টি কে, টিভিয়াল) এর চেয়ে কম মেমরি ব্যবহার করে।

সোর্টার্ডডিকোরিয়েন্সি (টিকি, টিভিয়ালিউ) এর অরসোর্টড ডেটার জন্য দ্রুত সন্নিবেশ এবং অপসারণের ক্রিয়াকলাপ রয়েছে: ও (লগ এন) বাছাই করা তালিকার (টি), টিভিলিউয়ের জন্য ও (এন) এর বিপরীতে।

যদি তালিকাটি সাজানো ডেটা থেকে একবারে পপুলেট করা থাকে তবে সোর্টার্ডলিস্ট (টিকি, টিভিয়াল্য) সোর্টার্ডডোরিও (টি কে, টিভিয়ালু) এর চেয়ে দ্রুত।


21
আর একটি ব্যবহারিক পার্থক্য, যা SortedListআপনার সূচকে পুনরুদ্ধার করতে পারে (কী দ্বারা পুনরুদ্ধারের বিরোধিতা হিসাবে) এবং আপনি তা SortedDictionaryকরতে পারবেন না।
অ্যান্ড্রু সাভিনিখ

67

এখানে চিত্র বর্ণনা লিখুন

আমি অভিধানের মধ্যে পার্থক্য উল্লেখ করব।

চিত্রের উপরে চিত্রগুলি এনালগের Dictionary<K,V>তুলনায় প্রতিটি ক্ষেত্রে সমান বা দ্রুততর দেখায় Sorted, তবে যদি উপাদানগুলির ক্রম প্রয়োজন হয়, উদাহরণস্বরূপ সেগুলি মুদ্রণের জন্য Sortedএকটি বেছে নেওয়া হয়েছে।

এসসিআর: http://people.cs.aau.dk/~normark/oop-csharp/html/notes/collections-note-time-complexity-dorses.html


4
দুর্দান্ত ওভারভিউ। মূল প্রশ্নে না থাকলেও, এটি লক্ষ্য করা উচিত যে আপনি যদি এই Immutableঅভিধানগুলির সংস্করণগুলির মধ্যে চয়ন করেন তবে Sortedসংস্করণগুলি প্রায়শই প্রায় 40-50% দ্বারা অ-বাছাই করা অংশগুলির তুলনায় দ্রুত হয় (এখনও O(log(n)), তবে প্রতি অপারেটিং হিসাবে লক্ষণীয়ভাবে দ্রুত) । ইনপুটটি কীভাবে সাজানো হয়েছে তার উপর নির্ভর করে সময়গুলি পৃথক হতে পারে। দেখুন stackoverflow.com/a/30638592/111575
আবেল

22

পারফরম্যান্স টেস্টের ফলাফলগুলির সংক্ষিপ্তসার হিসাবে - সোর্টার্ডলিস্ট বনাম সোর্টড অভিধান অভিধান বনাম হ্যাশটেবল , বিভিন্ন পরিস্থিতিতে সবচেয়ে ভাল থেকে খারাপের ফলাফল:

স্মৃতি এর ব্যবহার:

SortedList<T,T>
Hashtable
SortedDictionary<T,T>
Dictionary<T,T>

সন্নিবেশ:

Dictionary<T,T>
Hashtable
SortedDictionary<T,T>
SortedList<T,T>

অনুসন্ধান অপারেশন:

Hashtable
Dictionary<T,T>
SortedList<T,T>
SortedDictionary<T,T>

foreach লুপ অপারেশন

SortedList<T,T>
Dictionary<T,T>
Hashtable
SortedDictionary<T,T>

4
এই পরীক্ষার ফলাফলগুলি পরীক্ষা করার সময়, কেউ सॉোর্টড ডিকোরিয়ানের রাইসন ডি'টার প্রশ্ন করতে পারে ।
বেওল্ফ

4
আপনার যদি Collectionপ্রয়োজন হয় sortedতবে আপনি সেগুলি সম্পর্কে ভুলে যেতে পারেন Hashtableএবং Dictionary: আপনি যদি একটি সংগ্রহের মাধ্যমে আপনার সংগ্রহকে জনবসতি করেন -> সাজানো তালিকার জন্য যান, তবে আপনি যদি ধারণা করেন তবে প্রায়শই আপনার প্রয়োজন .Addএবং .Removeআইটেমগুলি>> সোর্টার্ড ডিকোরিয়ানের জন্য যেতে হবে।
আমা

সম্ভবত এর sortedঅর্থ কী তা বোঝানোর দরকার আছে : আপনি যখন For Each MyItem in Collectionমূলত .Addআইটেমগুলি সম্পাদনা করার ক্রমে প্রক্রিয়াজাতকরণের পরিবর্তে sorted Collectionএকটি করেন, তখন Keyমানগুলি মানদণ্ডের সাথে মিল রেখে একটি ক্রমে তাদের প্রক্রিয়া করবে ( একটিতে সংজ্ঞায়িত IComparer)। উদাহরণস্বরূপ, যদি আপনার কীগুলি স্ট্রিং হয় তবে আপনার সংগ্রহটি আপনার কীগুলির বর্ণানুক্রমিক ক্রম অনুযায়ী ডিফল্টরূপে প্রক্রিয়া করা হবে তবে আপনি সর্বদা একটি পছন্দসই বাছাইয়ের নিয়মকে সংজ্ঞায়িত করতে পারেন।
আমা

10

আমি প্রস্তাবিত উত্তরগুলি পারফরম্যান্সে ফোকাস দেখতে পাচ্ছি। নীচে সরবরাহ করা নিবন্ধটি কার্য সম্পাদন সম্পর্কিত নতুন কিছু সরবরাহ করে না, তবে এটি অন্তর্নিহিত প্রক্রিয়াগুলি ব্যাখ্যা করে। এছাড়াও নোট করুন যে Collectionএটি প্রশ্নের মধ্যে উল্লিখিত তিন প্রকারের উপর দৃষ্টি নিবদ্ধ করে না , তবে নাম স্থানের সমস্ত প্রকারকে সম্বোধন করে System.Collections.Generic

http://geekswithblogs.net/BlackRabbitCoder/archive/2011/06/16/c.net-fundamentals-choosing-theright-colલેક્-class.aspx

নিষ্কাশন:

অভিধান <>

অভিধানটি সম্ভবত সর্বাধিক ব্যবহৃত এসোসিয়েটিভ ধারক শ্রেণি। অভিধানটি সাহচর্যমূলক অনুসন্ধান / সন্নিবেশ / মোছার জন্য দ্রুততম শ্রেণি কারণ এটি কভারগুলির নীচে একটি হ্যাশ টেবিল ব্যবহার করে । কীগুলি হ্যাশ হওয়ার কারণে, কী টাইপটি সঠিকভাবে গেটহ্যাশকোড () এবং সমতুল্য () প্রয়োগ ক্রমান্বিত উচিত বা আপনার নির্মাণের অভিধানে একটি বাহ্যিক আইকুয়ালিটি কম্প্যাকার সরবরাহ করা উচিত। অভিধানে আইটেমগুলির সন্নিবেশ / মোছা / দেখার সময়টি ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধরণের থাকে - ও (1) - যার অর্থ ডিকশনারিটি যত বড়ই হয় না, কিছু খুঁজে পেতে সময় লাগে তুলনামূলকভাবে স্থির থাকে। এটি উচ্চ-গতির জন্য দেখার জন্য অত্যন্ত প্রয়োজনীয়। একমাত্র ক্ষতিটি হ'ল অভিধান, হ্যাশ টেবিল ব্যবহারের প্রকৃতি অনুসারে আনর্ডারড হয়আপনি কোনও ডিকশনারে সহজেই ক্রমগুলি আইটেমগুলি অতিক্রম করতে পারবেন না

সাজানো অভিধান <>

সাজানো অভিধান অভিধানে অভিধানের মতো তবে বাস্তবায়নে খুব আলাদা। SortedDictionary কী দ্বারা অনুক্রমে আইটেম বজায় রাখার জন্য কভার অধীনে একটি বাইনারি ট্রি ব্যবহার । বাছাইয়ের ফলস্বরূপ, কীটির জন্য ব্যবহৃত ধরণেরটি সঠিকভাবে আইকাম্পারেবল প্রয়োগ করতে হবে যাতে কীগুলি সঠিকভাবে বাছাই করা যায়। বাছাই করা অভিধানটি আইটেমগুলিকে যথাযথভাবে বজায় রাখার দক্ষতার জন্য কিছুটা অনুসন্ধানের সময়কে ব্যবসা করে, এইভাবে সাজানো অভিধানে সন্নিবেশ / মুছুন / দেখার সময় লোগারিদমিক - ও (লগ এন) হয়। সাধারণত লোগারিথমিক সময় সহ, আপনি সংগ্রহের আকার দ্বিগুণ করতে পারেন এবং আইটেমটি অনুসন্ধানের জন্য এটি কেবলমাত্র একটি অতিরিক্ত তুলনা করতে হবে। আপনি দ্রুত অনুসন্ধান করতে চাইলে সাজানো অভিধান ব্যবহার করুন তবে কী অনুসারে সংগ্রহটি বজায় রাখতে সক্ষম হতে চান।

সাজানো তালিকা <>

বাছাই করা তালিকা জেনেরিক ধারকগুলির মধ্যে সাজানো অন্যান্য সংযুক্ত কন্টেইনার শ্রেণি। সোর্টড ডিকোরিয়ানের মতো আবারও বাছাই করা তালিকা কী-মান জোড়াগুলি বাছাই করতে একটি কী ব্যবহার করে । সাজানো অভিধানের মতো নয় তবে বাছাই করা তালিকার আইটেমগুলি সাজানো অ্যারের আইটেম হিসাবে সংরক্ষণ করা হয়। এর অর্থ হ'ল সন্নিবেশ এবং মুছে ফেলা লিনিয়ার - ও (এন) - কারণ কোনও আইটেম মোছা বা যুক্ত করা সমস্ত আইটেমকে তালিকার উপরে বা নীচে স্থানান্তর করতে পারে। সন্ধানের সময়টি তবে ও (লগ এন) কারণ সোর্টলিস্ট তালিকাতে তার কী দ্বারা তালিকার কোনও আইটেম সন্ধান করতে বাইনারি অনুসন্ধান ব্যবহার করতে পারে। তাহলে আপনি কেন কখনও এটি করতে চান? ঠিক আছে, উত্তরটি হ'ল আপনি যদি সাজানো তালিকাটি আপ-ফ্রন্টটি লোড করতে যাচ্ছেন তবে সন্নিবেশগুলি ধীরে ধীরে হবে তবে অ্যারে ইনডেক্সিং নিম্নোক্ত অবজেক্টের লিঙ্কগুলির চেয়ে দ্রুত, কারণ অনুসন্ধানগুলি একটি সাজানো অভিধানের তুলনায় প্রান্তিকভাবে দ্রুত। আমি আবার এমন পরিস্থিতিতে ব্যবহার করেছি যেখানে আপনি দ্রুত অনুসন্ধান করতে চান এবং কী অনুসারে সংগ্রহটি বজায় রাখতে চান এবং যেখানে সন্নিবেশ এবং মুছে ফেলা খুব বিরল।


অন্তর্নিহিত পদ্ধতিগুলির সাময়িক সংক্ষিপ্তসার

মতামত অত্যন্ত স্বাগত জানায় যেহেতু আমি নিশ্চিত যে আমি সবকিছু ঠিকভাবে পাইনি।

  • সমস্ত অ্যারে আকারের হয় n
  • অ-বাছাই করা অ্যারে = .এড / / যোগ করুন ও (1) সরানো তবে আইটেম (i) হ'ল (এন)।
  • বাছাই করা অ্যারে = .এড / /। সরানো হয় ও (এন), তবে। আইটেম (i) হ'ল হে (লগ এন)।

অভিধান

স্মৃতি

KeyArray(n) -> non-sorted array<pointer>
ItemArray(n) -> non-sorted array<pointer>
HashArray(n) -> sorted array<hashvalue>

অ্যাড

  1. যোগ HashArray(n) = Key.GetHash# হে (1)
  2. যোগ KeyArray(n) = PointerToKey# হে (1)
  3. যোগ ItemArray(n) = PointerToItem# হে (1)

অপসারণ

  1. For i = 0 to n, iকোথায় HashArray(i) = Key.GetHash # ও (লগ এন) (সাজানো অ্যারে) সন্ধান করুন
  2. HashArray(i)# O (n) (সাজানো অ্যারে) সরান
  3. KeyArray(i)# O (1) সরান
  4. ItemArray(i)# O (1) সরান

আইটেম পান

  1. For i = 0 to n, iকোথায় HashArray(i) = Key.GetHash# ও (লগ এন) (সাজানো অ্যারে) সন্ধান করুন
  2. ফিরুন ItemArray(i)

লুপ মাধ্যমে

  1. For i = 0 to n, ফিরে ItemArray(i)

সাজানো অভিধান

স্মৃতি

KeyArray(n) = non-sorted array<pointer>
ItemArray(n) = non-sorted array<pointer>
OrderArray(n) = sorted array<pointer>

অ্যাড

  1. যোগ KeyArray(n) = PointerToKey# হে (1)
  2. যোগ ItemArray(n) = PointerToItem# হে (1)
  3. For i = 0 to n, iকোথায় KeyArray(i-1) < Key < KeyArray(i)(ব্যবহার ICompare) # ও (এন) সন্ধান করুন
  4. যোগ OrderArray(i) = n# হে (ঢ) (সাজানো অ্যারে)

অপসারণ

  1. For i = 0 to n, iকোথায় KeyArray(i).GetHash = Key.GetHash# ও (এন) সন্ধান করুন
  2. KeyArray(SortArray(i))# O (n) সরান
  3. ItemArray(SortArray(i))# O (n) সরান
  4. OrderArray(i)# O (n) (সাজানো অ্যারে) সরান

আইটেম পান

  1. For i = 0 to n, iকোথায় KeyArray(i).GetHash = Key.GetHash# ও (এন) সন্ধান করুন
  2. ফিরুন ItemArray(i)

লুপ মাধ্যমে

  1. For i = 0 to n, ফিরে ItemArray(OrderArray(i))

সাজানো তালিকা

স্মৃতি

KeyArray(n) = sorted array<pointer>
ItemArray(n) = sorted array<pointer>

অ্যাড

  1. For i = 0 to n, iকোথায় KeyArray(i-1) < Key < KeyArray(i)(ব্যবহার ICompare) # ও (লগ এন) সন্ধান করুন
  2. যোগ KeyArray(i) = PointerToKey# হে (ঢ)
  3. যোগ ItemArray(i) = PointerToItem# হে (ঢ)

অপসারণ

  1. For i = 0 to n, iকোথায় KeyArray(i).GetHash = Key.GetHash# ও (লগ এন) সন্ধান করুন
  2. KeyArray(i)# O (n) সরান
  3. ItemArray(i)# O (n) সরান

আইটেম পান

  1. For i = 0 to n, iকোথায় KeyArray(i).GetHash = Key.GetHash# ও (লগ এন) সন্ধান করুন
  2. ফিরুন ItemArray(i)

লুপ মাধ্যমে

  1. For i = 0 to n, ফিরে ItemArray(i)

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

  2. সাজানো তালিকা এবং সাজানো অভিধান অভিধান একই কাজটি করে তবে ভিন্নভাবে প্রয়োগ করা হয়, সুতরাং এখানে বিভিন্ন শক্তি এবং দুর্বলতা ব্যাখ্যা করা হয়েছে


0

@ লাইভ দ্বারা উপস্থাপিত প্রতিটি ক্ষেত্রে একটি পারফরম্যান্স স্কোর বরাদ্দ করার চেষ্টা করে আমি নিম্নলিখিত মানগুলি ব্যবহার করেছি:

  • ও (1) = 3
  • ও (লগ এন) = 2
  • ও (এন) = 1
  • ও (1) বা ও (এন) = 2
  • ও (লগ এন) বা ও (এন) = 1.5

ফলাফলগুলি (উচ্চতর = আরও ভাল):

Dictionary:       12.0 
SortedDictionary:  9.0 
SortedList:        6.5

অবশ্যই, প্রতিটি ব্যবহারের ক্ষেত্রে নির্দিষ্ট ক্রিয়াকলাপকে আরও বেশি ওজন দেওয়া হবে।


4
থাম্বের নিয়ম হিসাবে, হে (লগ এন) এর ওজন হ'ল লগ (এন) / লগ (2) (+1 প্রতি বার এন ডাবলস) হবে যখন ও (ও) এর ওজন হবে। সুতরাং আপনার ওজন 4 মাপের আকারের জন্য সঠিক হবে beyond এর বাইরে যে কোনও কিছুই আপনার 2: 1 অনুপাতটি দ্রুত বাড়তে দেখবে। উদাহরণস্বরূপ যদি এন = ১০০ হয় তবে আপনার ও (লগ এন) = ১৫ হওয়া উচিত। একটি একই চিন্তাধারার পরে আপনার ও (১) ওজন হবে 100 Con উপসংহার: ও (এন) মোটামুটি দ্রুত যুদ্ধকে হারাবে। যদি এটি না হয়, এর অর্থ আপনার অ্যারেটি ছোট, এবং তারপরে দক্ষতা কোনও উদ্বেগ নয়।
আমা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.