সি # তে হ্যাশটেবলের চেয়ে অভিধানকে কেন পছন্দ করা হয়?


1395

বেশিরভাগ প্রোগ্রামিং ভাষায় অভিধান হ্যাশ টেবিলের চেয়ে বেশি পছন্দ করা হয়। এর পেছনের কারণ কী?


21
> এটি অগত্যা সত্য নয়। একটি হ্যাশ টেবিল অভিধানের একটি বাস্তবায়ন। এটিতে একটি সাধারণ একটি, এবং এটি নেট থেকে ডিফল্ট হতে পারে, তবে এটি সংজ্ঞা অনুসারে একমাত্র নয়। আমি নিশ্চিত নই যে এটি ইসিএমএ স্ট্যান্ডার্ডের দ্বারা আবশ্যক, তবে এমএসডিএন ডকুমেন্টেশন খুব স্পষ্টভাবে এটিকে হ্যাশটেবল হিসাবে বাস্তবায়িত বলে আখ্যায়িত করেছে। এমনকি বিকল্প হিসাবে আরও যুক্তিসঙ্গত হলে তারা এমনকি বাছাই করা তালিকা ক্লাস সরবরাহ করে।
Promit

15
@ প্রমিট আমি সর্বদা ভাবতাম যে Dictionaryএটি একটি বাস্তবায়ন Hashtable
b1nary.atr0phy

2
আমি মনে করি কারণটি হ'ল, একটি অভিধানে আপনি কী এবং আপনার সেল্ফের জন্য মানটি নির্ধারণ করতে পারেন। হ্যাশটেবল কেবলমাত্র বস্তু নিতে পারে এবং হ্যাশের উপর ভিত্তি করে জোড়াগুলি সংরক্ষণ করতে পারে (অবজেক্ট.গেটহ্যাশকোড () থেকে)।
রেডিনেটর

2
@ ড্যান আপনার দাবীটি বেশ ভুল হয়েছে ... একটি হ্যাশ টেবিলটিতে কেবল প্রতিটি কীগুলির একটির উদাহরণ রয়েছে এবং অনুসন্ধানে কখনও একাধিক এন্ট্রি পাওয়া যায় না; আপনি যদি প্রতিটি কী এর সাথে একাধিক মান সংযুক্ত করতে চান তবে হ্যাশ টেবিলকে মানগুলির একটি তালিকা তৈরি করুন। "একটি অভিধান" এর মতো কোনও ডেটা কাঠামো নেই ... অভিধানটি হ'ল নাম যা কিছু লাইব্রেরি তাদের হ্যাশ টেবিলের জন্য ব্যবহার করে। যেমন, সি # এর নন-জেনেরিক হ্যাশ টেবিলকে বলা হয় HashTable। যখন তারা ভাষা থেকে জেনেরিক্স যোগ, তারা জেনেরিক সংস্করণ বলা Dictionary। দুটিই হ্যাশ টেবিল।
জিম বাল্টার

3
@ ড্যান আপনার দাবিটি ভুল হয়েছে ... একটি হ্যাশ টেবিল ( en.wikedia.org/wiki/Hash_table ) হ'ল একটি অভিধানের একটি বিশেষ প্রয়োগ, যা ওরফে এসোসিয়েটিভ অ্যারে ( en.wikedia.org/wiki/Associative_array ), এবং হচ্ছে একটি অভিধানে কেবল প্রতিটি কী এর একটি করে উদাহরণ রয়েছে এবং অনুসন্ধানে কখনও একাধিক এন্ট্রি পাওয়া যায় না; আপনি যদি প্রতিটি কী এর সাথে একাধিক মান সংযুক্ত করতে চান তবে হ্যাশ টেবিলকে মানগুলির একটি তালিকা তৈরি করুন। এবং .NET অভিধান এবং হ্যাশটেবল ক্লাস দুটি হ্যাশ টেবিল।
জিম বাল্টার

উত্তর:


1568

যার মূল্য রয়েছে তার জন্য একটি অভিধান হ'ল (ধারণামূলকভাবে) একটি হ্যাশ টেবিল।

যদি আপনি বোঝাতে চেয়েছিলেন "আমরা Dictionary<TKey, TValue>ক্লাসের পরিবর্তে ক্লাসটি ব্যবহার করব কেন Hashtable?", তবে এটির একটি সহজ উত্তর: Dictionary<TKey, TValue>জেনেরিক ধরণের, Hashtableএটি নয়। এর অর্থ আপনি এর সাথে সুরক্ষা পাবেন Dictionary<TKey, TValue>, কারণ আপনি এটিতে কোনও এলোমেলো বস্তু sertোকাতে পারবেন না এবং আপনাকে যে মূল্যবোধগুলি গ্রহণ করেছেন তা আপনাকে কাস্ট করতে হবে না।

মজার বিষয় হল, Dictionary<TKey, TValue>.NET ফ্রেমওয়ার্ক বাস্তবায়নটি এর উপর ভিত্তি করে তৈরি করা হয়েছে Hashtable, যেমন আপনি তার উত্স কোডটিতে এই মন্তব্যটি থেকে বলতে পারেন:

জেনেরিক অভিধানটি হ্যাশটেবলের উত্স থেকে অনুলিপি করা হয়েছিল

সূত্র


393
বক্সিং / আনবক্সিং না থাকায় জেনেরিক সংগ্রহগুলিও অনেক দ্রুত
ক্রিস এস

6
উপরের বিবৃতি সহ কোনও হ্যাশটেবল সম্পর্কে নিশ্চিত নয়, তবে অ্যারেলিস্ট বনাম তালিকার জন্য <t> এটি সত্য
ক্রিস এস

36
হ্যাশটেবল জিনিসগুলি অভ্যন্তরীণভাবে ধরে রাখার জন্য অবজেক্ট ব্যবহার করে (এটি করার জন্য কেবলমাত্র জেনারিক উপায় নয়) তাই এটিতে বাক্স / আনবক্সও করতে হবে।
গুভান্তে

16
@ ব্রায়ানজে: একটি "হ্যাশ টেবিল" (দুটি শব্দ) এই ধরণের কাঠামোর জন্য কম্পিউটার বিজ্ঞানের শব্দ; অভিধান একটি নির্দিষ্ট বাস্তবায়ন। একটি হ্যাশ টেবিল একটি অভিধান << অবজেক্ট, অবজেক্ট> (যদিও কিছুটা ভিন্ন ইন্টারফেস সহ) এর সাথে মোটামুটি মিলিয়ে যায় তবে উভয়ই হ্যাশ টেবিল ধারণার বাস্তবায়ন। এবং অবশ্যই বিষয়গুলি আরও বিভ্রান্ত করার জন্য কিছু ভাষাগুলি তাদের হ্যাশ টেবিলগুলিকে "অভিধান" (উদাহরণস্বরূপ পাইথন) বলে call তবে সঠিক সিএস শব্দটি এখনও হ্যাশ টেবিল।
মাইকেল ম্যাডসেন

32
@BrianJ: উভয় HashTable(ক্লাস) এবং Dictionary(ক্লাস) হ্যাশ টেবিল (ধারণা), কিন্তু একটি HashTableনয় হয় Dictionary, কিংবা একটি হল Dictionaryএকটি HashTable। এগুলি খুব অনুরূপ ফ্যাশনে ব্যবহৃত হয় এবং Dictionary<Object,Object>একই রকম টাইপযুক্ত পদ্ধতিতে কাজ করতে পারে যা একটি HashTableকরে তবে তারা সরাসরি কোনও কোড ভাগ করে না (যদিও অংশগুলি খুব অনুরূপ ফ্যাশনে প্রয়োগ হওয়ার সম্ভাবনা রয়েছে)।
মাইকেল ম্যাডসেন

625

Dictionary<<< >>> Hashtableপার্থক্য:

  • জেনেরিক <<< >>> অ জেনেরিক
  • প্রয়োজন নিজের থ্রেড সিঙ্ক্রোনাইজেশন <<< >>> অফার শংকা মুক্ত মাধ্যমে সংস্করণ Synchronized()পদ্ধতি
  • গণিত আইটেম: KeyValuePair<<< >>> গণিত আইটেম:DictionaryEntry
  • আরও নবীনতর (> .NET 2.0 ) <<< >>> পুরানো (। নেট 1.0 থেকে )
  • হয় System.Collections.Generic <<< >>> হয় System.Collections
  • অ-বিদ্যমান কী নিক্ষেপ করার ব্যর্থতার জন্য অনুরোধ <<< >>> অ-বিদ্যমান কী-র রিটার্নটি বাতিল করুন
  • মান ধরণের জন্য সম্ভাব্য কিছুটা দ্রুত <<< >>> মান ধরণের জন্য কিছুটা ধীর (বক্সিং / আনবক্সিং প্রয়োজন)

Dictionary/ Hashtableমিল:

  • উভয়ই অভ্যন্তরীণভাবে হ্যাশ টেবিলগুলি == কী অনুসারে বহু আইটেমের ডেটাতে দ্রুত অ্যাক্সেস
  • উভয় অপরিবর্তনীয় এবং অনন্য কী প্রয়োজন
  • উভয়ের কীগুলির নিজস্ব GetHashCode()পদ্ধতি প্রয়োজন

অনুরূপ। নেট সংগ্রহ (অভিধান এবং হ্যাশটেবলের পরিবর্তে প্রার্থীরা ব্যবহার করতে পারেন):

  • ConcurrentDictionary- থ্রেড নিরাপদ (এক সাথে বিভিন্ন থ্রেড থেকে নিরাপদে অ্যাক্সেস করা যেতে পারে)
  • HybridDictionary- অনুকূলিত কর্মক্ষমতা (কয়েকটি আইটেম এবং এছাড়াও অনেক আইটেম জন্য)
  • OrderedDictionary- মান সূচকের মাধ্যমে অ্যাক্সেস করা যায় (ক্রম অনুসারে আইটেমগুলি যুক্ত করা হয়েছিল)
  • SortedDictionary- আইটেমগুলি স্বয়ংক্রিয়ভাবে সাজানো হয়েছে
  • StringDictionary- দৃ strongly়ভাবে টাইপ করা হয়েছে এবং স্ট্রিংগুলির জন্য অনুকূলিত

11
@ Guillaume86, এই তুমি কেন TryGetValue পরিবর্তে ব্যবহার msdn.microsoft.com/en-us/library/bb347013.aspx
ত্রিশূল ডি গাও

2
+1 এর জন্য StringDictionary... বিটিডব্লিউ আপনি যখন ডিফল্ট কনস্ট্রাক্টর ব্যবহার করেন ঠিক তেমনটি StringDictionaryহয় না Dictionary<string, string>
চেং চেন

প্যারালাল এক্সটেনশানসেক্সট্রা @ কোড. msdn.microsoft.com/windowsdesktop/… এ একটি পর্যবেক্ষণযোগ্য কনক্র্যান্ট ডিকোরিয়াস রয়েছে যা দুর্দান্ত দৃ fir় এবং বাধ্যতামূলক is
ভোটকফি

3
দুর্দান্ত ব্যাখ্যা, আপনি মনে মনে যে প্রশ্ন আসতে পারে সেগুলি হ্রাস করার জন্য আপনি মিলগুলি তালিকাভুক্ত করেছেন এটি সত্যিই দুর্দান্ত
এমকেবি


178

কারণ Dictionaryএকটি জেনেরিক শ্রেণি ( Dictionary<TKey, TValue>), যাতে এর সামগ্রীতে অ্যাক্সেস করা টাইপ-সেফ থাকে (যেমন Objectআপনার সাথে যেমন করা হয় তেমন আপনার প্রয়োজন হয় না Hashtable)।

তুলনা করা

var customers = new Dictionary<string, Customer>();
...
Customer customer = customers["Ali G"];

প্রতি

var customers = new Hashtable();
...
Customer customer = customers["Ali G"] as Customer;

তবে Dictionaryঅভ্যন্তরীণভাবে হ্যাশ টেবিল হিসাবে প্রয়োগ করা হয়, তাই প্রযুক্তিগতভাবে এটি একইভাবে কাজ করে।


88

এফওয়াইআই: নেট। ইন, Hashtableএকাধিক পাঠক থ্রেড এবং একটি একক লেখার থ্রেড দ্বারা ব্যবহারের জন্য থ্রেড নিরাপদ, যখন Dictionaryপাবলিক স্ট্যাটিক সদস্যগুলিতে থ্রেড নিরাপদ থাকে তবে কোনও ক্ষেত্রে সদস্যদের থ্রেড নিরাপদ হওয়ার গ্যারান্টি নেই।

আমাদের Hashtableএই কারণে আমাদের সমস্ত ডিকশনারিকে পরিবর্তন করতে হয়েছিল ।


10
মজাদার। অভিধান <টি> উত্স কোডটি অনেক বেশি পরিষ্কার এবং দ্রুত দেখায়। অভিধান ব্যবহার করা এবং নিজের সিঙ্ক্রোনাইজেশন প্রয়োগ করা আরও ভাল। অভিধান পড়ার ক্ষেত্রে যদি একেবারে বর্তমানের প্রয়োজন হয়, তবে আপনাকে অভিধানের পড়ার / লেখার পদ্ধতিগুলিতে অ্যাক্সেসকে সিঙ্ক্রোনাইজ করতে হবে। এটি অনেকটা লকিং হবে তবে এটি সঠিক হবে।
ট্রায়ঙ্কো

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

38
.NET 4.0 ConcurrentDictionaryক্লাস যুক্ত করেছে যা থ্রেড-সেফ হতে সমস্ত সরকারী / সুরক্ষিত পদ্ধতি প্রয়োগ করেছে। যদি আপনাকে লিগ্যাসি প্ল্যাটফর্মগুলি সমর্থন করার প্রয়োজন না হয় তবে এটি আপনাকে Hashtableমাল্টিথ্রেডেড কোডে প্রতিস্থাপন করতে দেবে : এমএসডিএন.মাইক্রোসফট /en-us/library/dd287191.aspx
ড্যান ইজ ফিডলিং ফায়ারলাইট

বেনামে উদ্ধার দুর্দান্ত উত্তর।
আনকুলঙ্কুলু

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

68

.NET সালে মধ্যে পার্থক্য Dictionary<,>এবং HashTableপ্রাথমিকভাবে যে সাবেক, একটি জেনেরিক টাইপ, তাই আপনি স্ট্যাটিক টাইপ পরীক্ষণ (এবং হ্রাস বক্সিং পরিপ্রেক্ষিতে জেনেরিক্স সব সুবিধা পেতে, কিন্তু মানুষ মনে করে এই বড় হিসাবে নয় পারফরম্যান্সের শর্তাবলী - যদিও বক্সিংয়ের একটি নির্দিষ্ট মেমোরি খরচ রয়েছে)।


34

লোকেরা বলছে যে একটি অভিধান হ্যাশ টেবিলের সমান।

এটি অগত্যা সত্য নয়। অভিধান প্রয়োগ করার জন্য হ্যাশ টেবিল হ'ল এক উপায় । এটিতে আদর্শ একটি, এবং এটি Dictionaryক্লাসে নেট। নেট এ ডিফল্ট হতে পারে তবে এটি সংজ্ঞা অনুসারে একমাত্র নয়।

আপনি একটি লিঙ্কযুক্ত তালিকা বা অনুসন্ধান ট্রি ব্যবহার করে একটি অভিধান সমানভাবে কার্যকর করতে পারেন, এটি কেবল দক্ষ হবে না (দক্ষতার কিছু মেট্রিকের জন্য)।


4
এমএস ডকস বলছেন: "মানটি কী ব্যবহার করে পুনরুদ্ধার করা খুব দ্রুত, ও (1) এর কাছাকাছি, কারণ অভিধান <(অফ <(টিকি, টিভিয়াল>>>)) ক্লাসটি হ্যাশ টেবিল হিসাবে প্রয়োগ করা হয়েছে।" - সুতরাং যখন আপনার সাথে ডিল করার সময় একটি হ্যাশটেবল গ্যারান্টিযুক্ত করা উচিত Dictionary<K,V>IDictionary<K,V>
যাইহোক

13
@ rix0rrr - আমি মনে করি আপনি এটি পিছনে পেয়েছেন, অভিধান অভিধান হ্যাশ টেবিল ব্যবহার করে না হ্যাশ টেবিল একটি অভিধান ব্যবহার করে।
জোসেফ হ্যামিল্টন

8
@JosephHamilton - rix0rrr এটা ঠিক: "একজন হ্যাশ টেবিল হয় একটি একটি বাস্তবায়ন অভিধান ।" তার অর্থ ধারণাটি "অভিধান", ক্লাস নয় (ছোট ক্ষেত্রে নোট করুন)। ধারণামূলকভাবে, একটি হ্যাশ টেবিল একটি অভিধান ইন্টারফেস প্রয়োগ করে। .NET- এ, অভিধান অভিধান আইডোরিয়ালিটি প্রয়োগ করতে একটি হ্যাশ টেবিল ব্যবহার করে। এটি অগোছালো;)
রবার্ট হেন্সিং

আমি নেট থেকে কথা বলছিলাম, যেহেতু তিনি তার প্রতিক্রিয়ায় উল্লেখ করেছেন।
জোসেফ হ্যামিল্টন

2
@JosephHamilton: কার্যকরী (অথবা বাস্তবায়ন ) এমনকি দূরবর্তী অবস্থান থেকে একই জিনিস মানে এই নয় ব্যবহারসমূহ । পুরোপুরি বিপরীত. সম্ভবত এটি পরিষ্কার হয়ে যেত যদি তিনি এটিকে কিছুটা আলাদাভাবে বলেছিলেন (তবে একই অর্থ সহ): "হ্যাশ টেবিল অভিধানের প্রয়োগের জন্য একটি উপায়"। এটি হ'ল যদি আপনি কোনও অভিধানের কার্যকারিতা চান তবে এটি করার একটি উপায় ( অভিধানটি বাস্তবায়নের জন্য) হ্যাশ টেবিল ব্যবহার করা।
নির্মাতা স্টিভ

21

Collectionsএবং Genericsবিভিন্ন গ্রুপ অবজেক্ট পরিচালনা করার জন্য দরকারী। .NET- এ, সমস্ত সংগ্রহের বিষয়বস্তু ইন্টারফেসের আওতায় আসে IEnumerable, যার পরিবর্তে ArrayList(Index-Value))& থাকে HashTable(Key-Value)। .NET Framework 2.0 পরে, ArrayList& HashTableসঙ্গে প্রতিস্থাপিত হয়েছে List& Dictionary। এখন, Arraylist& HashTableআজকালকার প্রকল্পগুলিতে আর ব্যবহার হয় না।

মধ্যে পার্থক্য আসছে HashTable& Dictionary, Dictionaryযেখানে যেমন জেনেরিক হয় Hastableজেনেরিক নয়। আমরা এতে কোনও ধরণের অবজেক্ট যুক্ত করতে পারি HashTable, তবে পুনরুদ্ধার করার সময় আমাদের এটি প্রয়োজনীয় প্রকারে ফেলে দিতে হবে। সুতরাং, এটি নিরাপদ নয়। তবে dictionary, নিজেকে ঘোষণার সময় আমরা কী এবং মানের ধরণ নির্দিষ্ট করতে পারি, সুতরাং পুনরুদ্ধার করার সময় কাস্ট করার দরকার নেই।

আসুন একটি উদাহরণ তাকান:

হ্যাশ টেবিল

class HashTableProgram
{
    static void Main(string[] args)
    {
        Hashtable ht = new Hashtable();
        ht.Add(1, "One");
        ht.Add(2, "Two");
        ht.Add(3, "Three");
        foreach (DictionaryEntry de in ht)
        {
            int Key = (int)de.Key; //Casting
            string value = de.Value.ToString(); //Casting
            Console.WriteLine(Key + " " + value);
        }

    }
}

অভিধান,

class DictionaryProgram
{
    static void Main(string[] args)
    {
        Dictionary<int, string> dt = new Dictionary<int, string>();
        dt.Add(1, "One");
        dt.Add(2, "Two");
        dt.Add(3, "Three");
        foreach (KeyValuePair<int, String> kv in dt)
        {
            Console.WriteLine(kv.Key + " " + kv.Value);
        }
    }
}

2
কীভ্যালিউপায়ারের জন্য স্পষ্টভাবে ডেটাটাইপ বরাদ্দ করার পরিবর্তে, আমরা var ব্যবহার করতে পারি। সুতরাং, এটি টাইপিং হ্রাস করবে - foreach (var kv in dt) ... কেবলমাত্র একটি পরামর্শ।
রন

16

অভিধান:

  • এটি ব্যাতিক্রমটি ছুঁড়ে / ছুঁড়ে দেয় ব্যাতিক্রম যদি আমরা এমন কোনও কী খুঁজে পাওয়ার চেষ্টা করি যা বিদ্যমান নেই।

  • এটি কোনও হ্যাশটেবলের চেয়ে দ্রুততর কারণ কোনও বক্সিং এবং আনবক্সিং নেই।

  • কেবল সর্বজনীন স্থির সদস্যরা থ্রেড নিরাপদ are

  • অভিধান হ'ল জেনেরিক টাইপ যার অর্থ আমরা এটি যে কোনও ডেটা টাইপের সাথে ব্যবহার করতে পারি (তৈরি করার সময় অবশ্যই কী এবং মান উভয়ের জন্য ডেটা প্রকারগুলি নির্দিষ্ট করতে হবে)।

    উদাহরণ: Dictionary<string, string> <NameOfDictionaryVar> = new Dictionary<string, string>();

  • ডিকশনয়ে হ্যাশটেবলের একটি টাইপ-নিরাপদ বাস্তবায়ন, Keysএবং দৃ strongly়ভাবে Valuesটাইপ করা হয়।

হ্যাশ টেবিল:

  • আমরা যদি এমন কোনও কী খুঁজে পাওয়ার চেষ্টা করি যা বিদ্যমান নেই n

  • এটি অভিধানের তুলনায় ধীর কারণ এটিতে বক্সিং এবং আনবক্সিং প্রয়োজন।

  • হ্যাশটেবলের সমস্ত সদস্য থ্রেড নিরাপদ,

  • হ্যাশটেবাল একটি জেনেরিক ধরণের নয়,

  • হ্যাশটেবলটি আলগাভাবে টাইপ করা ডেটা স্ট্রাকচার, আমরা কোনও ধরণের কী এবং মান যুক্ত করতে পারি।


"যদি আমরা কোনও কী নেই যা অস্তিত্বের সন্ধান করার চেষ্টা করি তবে এটি ব্যতিক্রমটিকে ফিরিয়ে দেয় / ছুঁড়ে দেয়" " আপনি যদি ব্যবহার করেন নাDictionary.TryGetValue
জিম বাল্টার

16

ডাটা স্ট্রাকচার ব্যাপক পরীক্ষায় সি # ব্যবহার দুটিই MSDN নিবন্ধ যুক্তরাষ্ট্রের রয়েছে যে মধ্যে একটি পার্থক্য সংঘর্ষের রেজল্যুশন কৌশল :

Hashtable বর্গ ব্যবহারসমূহ একটি কৌশল হিসাবে উল্লেখ করা rehashing

পুনঃস্থাপনটি নিম্নরূপে কাজ করে: হ্যাশ বিভিন্ন ফাংশনের একটি সেট রয়েছে, এইচ 1 ... এইচ এন , এবং হ্যাশ টেবিল থেকে কোনও আইটেম সন্নিবেশ করানো বা পুনরুদ্ধার করার সময়, প্রাথমিকভাবে এইচ 1 হ্যাশ ফাংশন ব্যবহৃত হয়। এটি যদি কোনও সংঘর্ষের দিকে পরিচালিত করে, পরিবর্তে এইচ 2 চেষ্টা করা হয়েছে এবং প্রয়োজনে H n পর্যন্ত প্রযোজ্য ।

অভিধানটিতে শাইনিং হিসাবে চিহ্নিত একটি কৌশল ব্যবহার করা হয়েছে ।

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


16

.NET ফ্রেমওয়ার্ক 3.5 যেহেতু এমন একটি রয়েছে HashSet<T>যা আপনার সমস্ত Dictionary<TKey, TValue>কী সরবরাহ করে যদি কোনও মান এবং কোন মান প্রয়োজন হয়।

সুতরাং আপনি যদি কোনও ব্যবহার করেন Dictionary<MyType, object>এবং সর্বদা nullনিরাপদ হ্যাশ টেবিলটি অনুকরণ করতে মান সেট করেন তবে আপনি সম্ভবত সেই স্যুইচটিতে স্যুইচ করার কথা বিবেচনা করুন HashSet<T>


14

Hashtableতাই আপনি কোনো ধরনের কী ও মান যোগ করতে পারেন, একটি ঢিলেঢালাভাবে-টাইপ ডাটা স্ট্রাকচার হয় HashtableDictionaryবর্গ একটি টাইপ-নিরাপদ Hashtableপ্রয়োগ, কী ও মান শক্তিশালী ভাবে টাইপ করা হয়। একটি Dictionaryউদাহরণ তৈরি করার সময় , আপনাকে কী এবং মান উভয়ের জন্য ডেটা প্রকারগুলি নির্দিষ্ট করতে হবে।


11

লক্ষ্য করুন যে এমএসডিএন বলেছে: "অভিধান <(অফ <(অফকি (টিকি, টিভিালু>)>) ক্লাসটি হ্যাশ টেবিল হিসাবে প্রয়োগ করা হয়েছে ", "অভিধান <(এর <(টি (কে, টেলিভিশন>)>)) হ্যাশ টেবিল হিসাবে প্রয়োগ করা হয়নি "

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

.NET 1.0 জেনারিকসের অস্তিত্ব ছিল না; এখানেই মূলত হ্যাশটেবল এবং অ্যারেলিস্ট শুরু হয়েছিল।


আপনি কি এমএসডিএন উদ্ধৃতিটি ঠিক করতে পারবেন? কিছু অনুপস্থিত বা ভুল; এটি ব্যাকরণগত এবং কিছুটা বোধগম্য নয়।
পিটার মর্টেনসেন

10

হ্যাশ টেবিল:

হিপগুলিতে সংরক্ষণের সময় কী / মান কোনও অবজেক্ট (বক্সিং) টাইপে রূপান্তরিত হবে।

গাদা থেকে পড়ার সময় কী / মানটিকে পছন্দসই ধরণের রূপান্তর করা দরকার।

এই অপারেশনগুলি খুব ব্যয়বহুল। আমাদের যতটা সম্ভব বক্সিং / আনবক্সিং এড়ানো উচিত।

অভিধান: হ্যাশ টেবিলের জেনেরিক বৈকল্পিক।

কোনও বক্সিং / আনবক্সিং নেই। কোনও রূপান্তর প্রয়োজন।


8

একটি হ্যাশটেবল অবজেক্টে বালতি রয়েছে যা সংগ্রহের উপাদানগুলি ধারণ করে। বালতি হ্যাশটেবলের মধ্যে থাকা উপাদানগুলির একটি ভার্চুয়াল উপগোষ্ঠী যা বেশিরভাগ সংগ্রহের তুলনায় অনুসন্ধান এবং পুনরুদ্ধারকে সহজ এবং দ্রুততর করে তোলে

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

আরও পড়ার জন্য: হ্যাশটেবল এবং অভিধান সংগ্রহের প্রকার


7

আর একটি গুরুত্বপূর্ণ পার্থক্য হ্যাশটেবল থ্রেড নিরাপদ। হ্যাশটেবলে বিল্ট-ইন একাধিক পাঠক / একক লেখক (এমআর / এসডাব্লু) থ্রেড সুরক্ষা যার অর্থ হ্যাশটেবল এক লেখককে লকিং ছাড়াই একাধিক পাঠকের সাথে একত্রে অনুমতি দেয়।

অভিধানের ক্ষেত্রে থ্রেড সুরক্ষা নেই; আপনার যদি থ্রেড সুরক্ষা প্রয়োজন হয় আপনার নিজের সিঙ্ক্রোনাইজেশন প্রয়োগ করতে হবে।

আরও বিস্তারিত বলতে:

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

। নেট ফ্রেমওয়ার্ক ২.০ সংগ্রহের ক্লাস List<T>, Dictionary<TKey, TValue>ইত্যাদির মতো কোনও থ্রেড সিঙ্ক্রোনাইজেশন সরবরাহ করে না; আইটেমগুলি একযোগে একাধিক থ্রেডে যুক্ত করা বা অপসারণ করার সময় ব্যবহারকারী কোডকে সমস্ত সিঙ্ক্রোনাইজেশন সরবরাহ করতে হবে

আপনার যদি থ্রেড সুরক্ষা পাশাপাশি থ্রেড সুরক্ষা প্রয়োজন হয়, .NET ফ্রেমওয়ার্কে সমবর্তী সংগ্রহের ক্লাস ব্যবহার করুন। এখানে আরও পড়া ।

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


আমি যা বুঝি সেগুলি থেকে, মুছে ফেলার সাথে জড়িত না এমনHashset ব্যবহারের পরিস্থিতিতে এমআর / এসডাব্লু থ্রেড সুরক্ষার গ্যারান্টি দেয় । আমি মনে করি এটি পুরোপুরি এমআর / এসডাব্লু নিরাপদ হওয়ার উদ্দেশ্যে করা হয়েছিল, তবে মুছে ফেলাগুলি নিরাপদে পরিচালনা করা এমআর / এসডাব্লু সুরক্ষার ব্যয়কে ব্যাপকভাবে বৃদ্ধি করে। যদিও নকশাটি এমআর / এসডাব্লু সুরক্ষা নন-মোছার পরিস্থিতিতে ন্যূনতম ব্যয়ে সুরক্ষা দিতে পারে, আমি মনে করি এমএস নন-মোছার পরিস্থিতিগুলি "বিশেষ" হিসাবে বিবেচনা করা এড়াতে চেয়েছিল। Dictionary
ক্যাট

5

আরও একটি পার্থক্য যা আমি বুঝতে পারি তা হ'ল:

আমরা ওয়েব পরিষেবাগুলির সাথে অভিধান <কেটি, ভিটি> (জেনারিক) ব্যবহার করতে পারি না। কারণ কোনও ওয়েব পরিষেবা মান জেনেরিক মানকে সমর্থন করে না।


আমরা সাবান ভিত্তিক ওয়েব পরিষেবাদিতে জেনেরিক তালিকা (তালিকা <স্ট্রিং>) ব্যবহার করতে পারি। তবে, আমরা ওয়েবসার্চিতে অভিধান (বা হ্যাশটেবল) ব্যবহার করতে পারি না। আমি মনে করি এর কারণ হ'ল। নেট এক্সএমএসসিরিয়ালার অভিধান অভিধানটি হ্যান্ডেল করতে পারে না।
সিদ্ধার্থ

5

Dictionary<> জেনেরিক টাইপ এবং তাই এটি টাইপ নিরাপদ।

আপনি হ্যাশটবেলে কোনও মান প্রকার সন্নিবেশ করতে পারেন এবং এটি কখনও কখনও ব্যতিক্রম ছুঁড়ে ফেলতে পারে। তবে Dictionary<int>কেবল পূর্ণসংখ্যার মানগুলি গ্রহণ করবে এবং একইভাবে Dictionary<string>কেবল স্ট্রিং গ্রহণ করবে।

সুতরাং, Dictionary<>পরিবর্তে এটি ব্যবহার করা ভাল HashTable


0

বেশিরভাগ প্রোগ্রামিং ভাষায় অভিধান হ্যাশ টেবিলের চেয়ে বেশি পছন্দ করা হয়

আমি মনে করি না যে এটি অগত্যা সত্য, বেশিরভাগ ভাষাগুলির একটি বা অন্য ভাষা রয়েছে যা তারা পছন্দ করে এমন পরিভাষার উপর নির্ভর করে ।

তবে সি # তে, আমার স্পষ্ট কারণ হ'ল সি # হ্যাশ টেবিল এবং সিস্টেমের অন্যান্য সদস্য। সংগ্রহের নেমস্পেসটি মূলত অপ্রচলিত। তারা সি # ভি 1.1 তে উপস্থিত ছিল। তাদের সি # ২.০ থেকে প্রতিস্থাপন করা হয়েছে সিস্টেম.জেকশন.জেনেরিক নেমস্পেসের জেনেরিক ক্লাস দ্বারা।


অভিধানে হ্যাশটেবলের একটি সুবিধা হ'ল যদি অভিধানে কোনও কী উপস্থিত না থাকে তবে এটি একটি ত্রুটি ছুঁড়ে দেবে। যদি কোনও হ্যাশটেবলে কোনও কী উপস্থিত না থাকে তবে এটি কেবল শূন্য হয়।
বিল নর্মান

সি # তে আমি এখনও সিস্টেম.কলেশনগুলি ব্যবহার করা এড়াতে চাই would হ্যাশটেবল কারণ তাদের জেনেরিকের সুবিধা নেই। আপনি কীটির অস্তিত্ব রাখবেন কিনা তা যদি আপনি না জানেন তবে আপনি অভিধানের ট্রাইগেটওয়ালু বা হাসকি ব্যবহার করতে পারেন।
ক্রিস্টিয়ানপ

ওফস, হাসকি নয়, এটি কনটেনস্কি হওয়া উচিত।
ক্রিস্টিয়ানপ

-3

নেট প্রতিফলক ব্যবহার করে আমি যা দেখছি তার অনুসারে :

[Serializable, ComVisible(true)]
public abstract class DictionaryBase : IDictionary, ICollection, IEnumerable
{
    // Fields
    private Hashtable hashtable;

    // Methods
    protected DictionaryBase();
    public void Clear();
.
.
.
}
Take note of these lines
// Fields
private Hashtable hashtable;

সুতরাং আমরা নিশ্চিত হতে পারি যে ডিকশনারিবেস অভ্যন্তরীণভাবে একটি হ্যাশ টেবিল ব্যবহার করে।


16
সিস্টেম.কলেশনস.জেনারিক.ডিকোরিয়াল <টি কে, টিভিয়াল> অভিধান অভিধান থেকে পাওয়া যায় না।
স্নেমার্চ

"সুতরাং আমরা নিশ্চিত হতে পারি যে ডিকশনারিবেস অভ্যন্তরীণভাবে একটি হ্যাশ টেবিল ব্যবহার করে।" - এটি দুর্দান্ত তবে প্রশ্নের সাথে এর কোনও যোগসূত্র নেই।
জিম বাল্টার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.