হ্যাশসেট <টি> এবং তালিকা <টি> এর মধ্যে পার্থক্য কী?


156

নেট নেট HashSet<T>এবং এর List<T>মধ্যে পার্থক্য কী তা ব্যাখ্যা করতে পারেন ?

কোন কোন মামলার HashSet<T>বিরুদ্ধে অগ্রাধিকার দেওয়া উচিত বলে আপনি উদাহরণ দিয়ে ব্যাখ্যা করতে পারেন List<T>?



আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি এন.ইউইকিপিডিয়া.আর.উইকি / হ্যাশ_ট্যাবলী এবং এন.ইউইকিপিডিয়া . org / উইকি / ডায়নামিক_আরে উইকিপিডিয়া নিবন্ধগুলির সাথে পরামর্শ করুন ।
এমকিপিপি

পারফরম্যান্স সম্পর্কিত সম্পর্কিত জন্য, হ্যাশसेट-বনাম-তালিকা-পারফরম্যান্স দেখুন
নওফাল

উত্তর:


213

একটি লিস্টের বিপরীতে <> ...

  1. একটি হ্যাশসেট এমন একটি তালিকা যাঁর সদৃশ সদস্য নেই।

  2. যেহেতু একটি হ্যাশসেটটি কেবল অনন্য এন্ট্রি ধারণ করতে বাধ্য, তাই অভ্যন্তরীণ কাঠামোটি অনুসন্ধানের জন্য অনুকূলিত করা হয়েছে (তালিকার সাথে তুলনা করে) - এটি যথেষ্ট দ্রুত

  3. হ্যাশসেটে যুক্ত করা একটি বুলিয়ান দেয় - সেটটিতে ইতিমধ্যে বিদ্যমান থাকার কারণে সংযোজন ব্যর্থ হলে মিথ্যা

  4. কোনও সেটের বিপরীতে গাণিতিক সেট ক্রিয়াকলাপ সম্পাদন করতে পারে: ইউনিয়ন / ছেদ / ইসসুবসটঅফ ইত্যাদি

  5. হ্যাশসেট কেবলমাত্র আইকোলিকেশন আইলিস্ট প্রয়োগ করে না

  6. আপনি কোনও হ্যাশসেটের সাথে সূচকগুলি ব্যবহার করতে পারবেন না, কেবল গণনাকারী।

হ্যাশসেট ব্যবহারের মূল কারণটি যদি আপনি সেট ক্রিয়াকলাপ সম্পাদন করতে আগ্রহী হন।

2 সেট দেওয়া হয়েছে: হ্যাশসেট 1 এবং হ্যাশসেট 2

 //returns a list of distinct items in both sets
 HashSet set3 = set1.Union( set2 );

লিনকিউ ব্যবহার করে সমতুল্য অপারেশনের তুলনায় উড়ে যায় এটা লেখার চেয়েও সুন্দর!


আইডিকে, আমার Unionপদ্ধতিতে সমস্যা ছিল । আমি UnionWithপরিবর্তে ব্যবহার করেছিলাম ।
ব্যবহারকারী

2
"1 টি হ্যাশডসেট ব্যবহারের মূল কারণটি যদি আপনি সেট ক্রিয়াকলাপ সম্পাদন করতে আগ্রহী হন be"
এলসিজে

12
প্রকৃতপক্ষে, আমি উত্তরটি পছন্দ করি যা নির্দেশ করে যে হ্যাশশিটগুলি আপনার সংগ্রহে "ব্যাগ আইটেম" হিসাবে বিবেচনা করতে পারে সে ক্ষেত্রে উপযুক্ত। কনটেন্ট চেক হিসাবে সেট অপারেশনগুলি এত ঘন ঘন হয় না। যে কোনও সময়ে আপনার কাছে অনন্য আইটেমগুলির একটি সেট রয়েছে (উদাহরণস্বরূপ কোড) এবং আপনার পাত্রে যাচাই করা দরকার, একটি হ্যাশসেট কার্যকর y
থান্ডারগ্রি

ভাল উত্তর. আমি পাশাপাশি কয়েকটি পারফরম্যান্স বৈশিষ্ট্যগত পার্থক্য যুক্ত করতে প্ররোচিত হই।
নওফাল

1
প্রশ্ন: ডুপ্লিকেট আইটেম না রাখার নির্দিষ্টতা না থাকার মূল কারণ?
Andrea Scarafoni

54

আরও সুনির্দিষ্ট হতে উদাহরণস্বরূপ প্রদর্শন করতে দেয়,

আপনি নীচের উদাহরণে হ্যাশসেট ব্যবহার করতে পারবেন না।

HashSet<string> hashSet1 = new HashSet<string>(){"1","2","3"};
for (int i = 0; i < hashSet1.Count; i++)
    Console.WriteLine(hashSet1[i]);

hashSet1[i] একটি ত্রুটি উত্পাদন করতে হবে:

'সিস্টেম.কলেশন.জেনারিক.হ্যাশসেট' টাইপের অভিব্যক্তিতে [] এর সাথে সূচীকরণ প্রয়োগ করতে পারে না

আপনি ভবিষ্যদ্বাণী বিবৃতি ব্যবহার করতে পারেন:

foreach (var item in hashSet1)
    Console.WriteLine(item);

তালিকাগুলি আপনাকে এটি করতে দেয় এবং আপনি হ্যাশসেটে কোনও আইটেম যুক্ত করার সময়, আপনি আইটেমটি অন্তর্ভুক্ত করেন কি না তা পরীক্ষা করতে পারবেন এবং আপনি হ্যাশসেটে নকল আইটেমগুলি যুক্ত করতে পারবেন না।

HashSet<string> hashSet1 = new HashSet<string>(){"1","2","3"};
if (hashSet1.Add("1"))
   Console.WriteLine("'1' is successfully added to hashSet1!");
else
   Console.WriteLine("'1' could not be added to hashSet1, because it contains '1'");

HashSet মত কিছু দরকারী ফাংশন আছে IntersectWith, UnionWith, IsProperSubsetOf, ExceptWith, SymmetricExceptWithইত্যাদি

IsProperSubsetOf:

HashSet<string> hashSet1 = new HashSet<string>() { "1", "2", "3", "4" };
HashSet<string> hashSet2 = new HashSet<string>() { "2", "4", "6", "8" };
HashSet<string> hashSet3 = new HashSet<string>() { "1", "2", "3", "4", "5" };
if (hashSet1.IsProperSubsetOf(hashSet3))
    Console.WriteLine("hashSet3 contains all elements of hashSet1.");
if (!hashSet1.IsProperSubsetOf(hashSet2))
    Console.WriteLine("hashSet2 does not contains all elements of hashSet1.");

UnionWith:

HashSet<string> hashSet1 = new HashSet<string>() { "3", "4" };
HashSet<string> hashSet2 = new HashSet<string>() { "2", "4", "6", "8" };
hashSet1.UnionWith(hashSet2); //hashSet1 -> 3, 2, 4, 6, 8

IntersectWith:

HashSet<string> hashSet1 = new HashSet<string>() { "3", "4", "8" };
HashSet<string> hashSet2 = new HashSet<string>() { "2", "4", "6", "8" }
hashSet1.IntersectWith(hashSet2);//hashSet1 -> 4, 8

ExceptWith :

 HashSet<string> hashSet1 = new HashSet<string>() { "1", "2", "3", "5", "6" };
 HashSet<string> hashSet2 = new HashSet<string>() { "1", "2", "3", "4" };
 hashSet1.ExceptWith(hashSet2);//hashSet1 -> 5, 6

SymmetricExceptWith :

 HashSet<string> hashSet1 = new HashSet<string>() { "1", "2", "3", "5", "6" };
 HashSet<string> hashSet2 = new HashSet<string>() { "1", "2", "3", "4" };
 hashSet1.SymmetricExceptWith(hashSet2);//hashSet1 -> 4, 5, 6

যাইহোক, আদেশটি হ্যাশসেটগুলিতে সংরক্ষিত নেই। উদাহরণস্বরূপ, আমরা উপাদানটি "2" শেষ যোগ করেছি তবে এটি দ্বিতীয় ক্রমে রয়েছে:

HashSet<string> hashSet1 = new HashSet<string>() { "3", "4", "8" };
hashSet1.Add("1");    // 3, 4, 8, 1
hashSet1.Remove("4"); // 3, 8, 1
hashSet1.Add("2");    // 3, 2 ,8, 1

51

HashSet<T>হ'ল একটি ক্লাস যা আপনাকে O(1)কন্টেন্টমেন্টের জন্য চেহারা দেওয়ার জন্য ডিজাইন করা হয়েছে (অর্থাত্ এই সংগ্রহে কোনও নির্দিষ্ট বিষয় রয়েছে এবং আমাকে দ্রুত উত্তরটি বলুন)।

List<T>হ'ল একটি শ্রেণি যা আপনাকে O(1)গতিময়ভাবে বাড়তে পারে তার চেয়ে এলোমেলো অ্যাক্সেস সহ একটি সংকলন দেওয়ার জন্য ডিজাইন করা হয়েছে (ভাবুন গতিশীল অ্যারে)। আপনি O(n)সময় মতো সংযোজন পরীক্ষা করতে পারেন ( তালিকাগুলি বাছাই না করা হলে আপনি O(log n)সময়মতো বাইনারি অনুসন্ধান করতে পারেন )।

কোন কোন মামলার HashSet<T>বিরুদ্ধে অগ্রাধিকার দেওয়া উচিত তার একটি উদাহরণ দিয়ে আপনি ব্যাখ্যা করতে পারেনList<T>

আপনি যখন কন্টেন্টটি পরীক্ষা করতে চান O(1)


তালিকাটি বাছাই করা থাকলে এটি ও (লগ এন) ব্যতীত; এটি, সর্বোপরি, একটি অচিরাচরিত তালিকায় দেখার চেয়ে দ্রুত।
আন্দ্রে

20

List<T>আপনি যখন চান একটি ব্যবহার করুন :

  • নির্দিষ্ট ক্রমে আইটেমের সংগ্রহ সঞ্চয় করুন।

আপনি যদি চান যে আইটেমটির সূচকটি জানেন (তবে আইটেমটির মানের চেয়ে) পুনরুদ্ধার O(1)। যদি আপনি সূচকটি জানেন না, আইটেমটি সন্ধানে O(n)একটি অরসেটেড সংগ্রহের জন্য আরও সময় লাগে ।

Hashset<T>আপনি যখন চান একটি ব্যবহার করুন :

  • কোনও সংগ্রহে কোনও নির্দিষ্ট অবজেক্ট রয়েছে কিনা তাড়াতাড়ি সন্ধান করুন।

আপনি যে জিনিসটি সন্ধান করতে চান তার নামটি যদি আপনি জানেন তবে লিকআপ হ'ল O(1)(এটি 'হ্যাশ' অংশ)। এটি করণের মতো অর্ডার বজায় রাখে List<T>না এবং আপনি সদৃশগুলি সংরক্ষণ করতে পারবেন না (ডুপ্লিকেট যুক্ত করার কোনও প্রভাব নেই, এটি 'সেট' অংশ)।

Hashset<T>স্ক্র্যাবলের কোনও খেলায় খেলে শব্দটি ইংরেজি (বা অন্য ভাষায়) একটি বৈধ শব্দ কিনা তা আপনি যদি জানতে চান তবে কখন এটি ব্যবহার করবেন তার একটি উদাহরণ। আরও ভাল যদি আপনি কোনও ওয়েব সার্ভিস যেমন কোনও গেমের অনলাইন সংস্করণে সমস্ত দৃষ্টান্ত ব্যবহার করে তৈরি করতে চান।

একজন List<T>খেলোয়াড় স্কোর ট্র্যাক করতে স্কোরবোর্ড তৈরি করার জন্য একটি ভাল ডাটা স্ট্রাকচার হবে।


15

তালিকা একটি আদেশ তালিকা। এইটা

  • একটি পূর্ণসংখ্যার সূচক দ্বারা অ্যাক্সেস করা
  • নকল থাকতে পারে
  • একটি অনুমানযোগ্য আদেশ আছে

হ্যাশসেট একটি সেট। এটা তোলে:

  • সদৃশ আইটেমগুলি ব্লক করতে পারে ( অ্যাড (টি) দেখুন )
  • সেট মধ্যে আইটেম ক্রম গ্যারান্টি দেয় না
  • এমন কোনও অপারেশন রয়েছে যা আপনি কোনও সেটটিতে আশা করবেন, যেমন , ইন্টারসেকটভিথ, ইসপ্রোপারসুবসোফ, ইউনিয়নভিথ ith

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



3

একটি তালিকা হ'ল টাইপ টি-এর অবজেক্টগুলির অর্ডারযুক্ত সংগ্রহ যা কোনও অ্যারের থেকে আলাদা নয় আপনি এন্ট্রি যোগ এবং মুছে ফেলতে পারেন।

আপনি সদস্যদের রেফারেন্স করতে চান এমন একটি তালিকা আপনি ব্যবহার করবেন যেখানে আপনি সেগুলি সংরক্ষণ করেছেন এবং আপনি আইটেমের পরিবর্তে কোনও অবস্থানের দ্বারা সেগুলিতে অ্যাক্সেস করছেন।

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

আপনি কোনও হ্যাশসেট ব্যবহার করবেন যেখানে আপনি পরীক্ষা করতে চান যে কোনও বস্তু সংগ্রহে রয়েছে


1
স্পষ্ট করার জন্য, অন্য কেউ যদি প্রথম নজরে ভুলটি পড়েন - Listএকটি অর্ডার বজায় রাখে (যেমন জিনিসগুলি যুক্ত করার সময়), তবে স্বয়ংক্রিয়ভাবে আইটেমগুলি বাছাই করে না। আপনাকে কল করতে হবে .Sortবা একটি ব্যবহার করতে হবে SortedList
ড্রজাউস

1

আপনি যদি ডেটা-চালিত বিকাশের ক্ষেত্রে এই ডেটা স্ট্রাকচারকে প্রকৃত ব্যবহারের জন্য প্রয়োগ করার সিদ্ধান্ত নেন তবে ডেটা সাফাই এবং মাইগ্রেশনের জন্য একটি হ্যাশসেট ডেটা অ্যাডাপ্টারের উত্সগুলির বিরুদ্ধে প্রতিলিপি পরীক্ষা করতে খুব সহায়ক।

এছাড়াও, যদি ডাটাঅনোটেশন ক্লাস ব্যবহার করা হয় তবে শ্রেণীর বৈশিষ্ট্যগুলিতে মূল যুক্তি প্রয়োগ করা যেতে পারে এবং একটি হ্যাশসেটের সাহায্যে একটি প্রাকৃতিক সূচক (ক্লাস্টারড বা না) কার্যকরভাবে নিয়ন্ত্রণ করা যায়, যেখানে তালিকাগুলি বাস্তবায়নে এটি খুব কঠিন হবে।

একটি তালিকা ব্যবহারের জন্য একটি শক্তিশালী বিকল্প হ'ল মডেলটিতে একাধিক মাধ্যমের জন্য জেনেরিকগুলি প্রয়োগ করা, যেমন কোনও ড্রপডাউনলিস্ট সহায়তাকারীর জন্য এমভিসি ভিউতে ক্লাসগুলির তালিকা পাঠানো এবং ওয়েবএপি-র মাধ্যমে জেএসএন কনস্ট্রাক্ট হিসাবে প্রেরণের জন্য। তালিকাটি সাধারণ শ্রেণীর সংগ্রহের যুক্তিকে মঞ্জুরি দেয় এবং আরও একটি "ইন্টারফেস" এর মতো নমনীয়তা রাখে যেমন একক দর্শন মডেলকে বিভিন্ন মাধ্যমের সাথে গণনা করার পদ্ধতির approach

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