.NET হ্যাশটেবল বনাম অভিধান - অভিধানটি তত দ্রুত হতে পারে?


276

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

তবে আমি এটিও পড়েছি ডিকশনারিটি সর্বদা বস্তুগুলি যেভাবে সন্নিবেশ করা হয় সেটিকে তার ক্রম অনুসারে ফিরিয়ে দেয় না thing যেখানে হ্যাশ টেবিল হবে। যেহেতু আমি এটি বুঝতে পারি এটি হ্যাশ টেবিল কিছু পরিস্থিতির জন্য আরও দ্রুতগতির দিকে পরিচালিত করে।

আমার প্রশ্ন সত্যিই, এই পরিস্থিতিতে কি হতে পারে? আমি কি কেবল আমার উপরের অনুমানগুলিতে ভুল করছি? একের পরেরটি বেছে নিতে আপনি কী পরিস্থিতিতে ব্যবহার করতে পারেন, (হ্যাঁ শেষটিটি কিছুটা দ্বিধাদ্বন্দ্বপূর্ণ)।


5
আমি এটিকে উজ্জীবিত করতে চাই না, তবে আপনার কর্মফলটি ,,77 the the এবং আমি আপনার পক্ষে যে গণ্ডগোল পোষণ করি তা হতে চাই না।
ক্যাপ্টেনমারভেল

উত্তর:


298

System.Collections.Generic.Dictionary<TKey, TValue>এবং System.Collections.Hashtableক্লাস উভয় অভ্যন্তরীণভাবে একটি হ্যাশ টেবিল ডেটা কাঠামো বজায় রাখে। এগুলির মধ্যে কোনও আইটেমের ক্রম সংরক্ষণের গ্যারান্টি দেয় না।

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

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

Hashtableআপনি নেট নেট ফ্রেমওয়ার্ক ২.০+ এর জন্য লক্ষ্য করে থাকলে শ্রেণিটি ব্যবহারের খুব সুবিধা নেই । এটি কার্যকরভাবে দ্বারা অপ্রচলিত রেন্ডার Dictionary<TKey, TValue>


21
@ Jon- chaining এবং rehashing এখানে- গভীরতা আলোচনা করা হয় msdn.microsoft.com/en-us/library/ms379571(VS.80).aspx
RichardOD

দুজন কেই ধন্যবাদ. রিচার্ড এটি পোস্ট করার সাথে সাথে সবেমাত্র সেই পৃষ্ঠাটি খুঁজে পেয়েছিল ... চেইনিং সম্পর্কে জিজ্ঞাসা করছিল তবে এমএসডিএন সাইটটি আসলে সহায়ক!
জন

6
@ মেহরদাদ - সংঘর্ষগুলি কীভাবে সমাধান করা হয় সে সম্পর্কে আমার কাছে যা স্পষ্ট নয় তা হ'ল: যদি একাধিক কী একই হ্যাশের ফলস্বরূপ হতে পারে তবে আপনি কীভাবে নিশ্চিত হন যে আপনি লকআপগুলিতে সঠিক মান পেয়ে যাচ্ছেন, অর্থাৎ ফাংশনটি কীভাবে জানতে পারে যে কোন উপাদানটি ফিরে আসতে? ইন msdn.microsoft.com/en-us/library/ms379571%28VS.80%29.aspx এটা একটি সংঘর্ষের ঘটনা reprobing চেয়ে বলে, "বরং, হিসাবে, অভিধান কেবল চেইন কোনো দুর্ঘটনায় hashtable বর্গ সঙ্গে সম্পন্ন করা হয় বালতির তালিকায়। এর অর্থ কি এই যে অভিধানটি ব্যবহার করার সময় সংঘর্ষগুলি বিকাশকারীকে উদ্বিগ্ন হওয়ার মতো কিছু নয়?
হাওইক্যাম্প

6
@ হাওইচ্যাম্প: এটি আসলে এর চেয়ে আলাদা নয় Hashtable। হ্যাশ টেবিলগুলি একটি এন্ট্রিতে 3 টি টুকরো তথ্য সংরক্ষণ করে: কী হ্যাশ, কী নিজেই এবং মান। সমান হ্যাশযুক্ত আইটেমগুলির জন্য, এটি সমান কী সহ আইটেমটি সন্ধান করতে এবং তার মানটি ফিরিয়ে দিতে তালিকাটি অতিক্রম করতে হবে। Hashtableএটিও বেশ সত্য । Dictionaryসাধারণত একজন বিকাশকারী হিসাবে সাধারণত ব্যবহার করে , আপনার এটি নিয়ে চিন্তা করার দরকার নেই।
মেহেরদাদ আফশারি

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

111

আমার ধারণা এটি এখন আপনার কাছে কিছু বোঝায় না। তবে কেবল লোকেরা থামার জন্য রেফারেন্সের জন্য

পারফরম্যান্স টেস্ট - সোর্টার্ডলিস্ট বনাম সোর্টার্ড ডিকশনারি বনাম ডিকশনারি বনাম হ্যাশটেবল able

মেমরি বরাদ্দ:

স্মৃতি ব্যবহারের পারফরম্যান্স পরীক্ষা

প্রবেশের জন্য ব্যবহৃত সময়:

Timeোকানোর জন্য ব্যবহৃত সময়

কোনও আইটেম অনুসন্ধানের সময়:

একটি আইটেম অনুসন্ধানের জন্য সময়


বাছাই করা তালিকার হ্যাশটেবলের চেয়ে আরও দ্রুত লুক রয়েছে Very আমি ভেবেছিলাম হ্যাশটেবল হল ও (1) বনাম সাজানো তালিকা ও (লগইন)। দৃশ্যত হ্যাশটেবল চুষছে ks আমি কখনই এটি ব্যবহার করব না।
জন হেন্কেল

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

31

হ্যাশটেবল এবং অভিধানের মধ্যে পার্থক্য

অভিধান:

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

হ্যাশ টেবিল:

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

24

আর একটি গুরুত্বপূর্ণ পার্থক্য হ্যাশটেবল টাইপ লক-মুক্ত একাধিক পাঠক এবং একই সময়ে একক লেখককে সমর্থন করে, যদিও অভিধানটি তা করে না।


8
সমকালীন
অভিধানটি

1
আমি এই উত্তরটি বুঝতে পারি কিনা তা নিশ্চিত নই। এখানে খুঁজছি msdn.microsoft.com/en-us/library/... এটি ", কোন থ্রেড hashtable বস্তুর পড়া আছে উপলব্ধ বলছেন একাধিক লেখক hashtable সব অপারেশন মোড়কের সুসংগত পদ্ধতি দ্বারা ফিরে মাধ্যমে অবশ্যই করতে হবে সমর্থন। " এটি "লক-মুক্ত একাধিক পাঠক" বৈশিষ্ট্যটিকে বেশ অকার্যকর বলে মনে হচ্ছে, সুতরাং আমরা অভিধানের মতো হ্যাশটেবলে সমস্ত অ্যাক্সেস লক করে ফিরলাম।
রেনিপেট

16

এমএসডিএন আর্টিকেল: " Dictionary<TKey, TValue>ক্লাসটি ক্লাসের মতো একই কার্যকারিতা রাখে HashtableDictionary<TKey, TValue> একটি নির্দিষ্ট ধরণের একটি (অন্যান্য ব্যতীত Object) Hashtableমান ধরণের জন্য একটির চেয়ে ভাল পারফরম্যান্স থাকে কারণ উপাদানগুলি Hashtableধরণের হয় Objectএবং তাই, বক্সিং এবং আনবক্সিং সাধারণত স্টোর করা থাকলে বা একটি মান প্রকার পুনরুদ্ধার করা হচ্ছে "।

লিঙ্ক: http://msdn.microsoft.com/en-us/library/4yh14awz(v=vs.90).aspx


11

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


8

আর একটি গুরুত্বপূর্ণ পার্থক্য Hashtableহ'ল থ্রেড নিরাপদ। Hashtableএকাধিক পাঠক / একক লেখক (এমআর / এসডাব্লু) থ্রেড সুরক্ষা তৈরি করেছে যার অর্থ হ'ল Hashtableএক লেখককে লকিং ছাড়াই একাধিক পাঠকের সাথে একত্রে অনুমতি দেয়। Dictionaryকোনও থ্রেড সুরক্ষা না পাওয়া ক্ষেত্রে , আপনার যদি থ্রেড সুরক্ষা প্রয়োজন হয় তবে আপনাকে অবশ্যই নিজের সিঙ্ক্রোনাইজেশন প্রয়োগ করতে হবে।

আরও বিস্তারিত জানাতে:

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

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


3

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


1

আপনি যদি পড়ার বিষয়ে যত্নশীল হন যা সর্বদা বস্তুগুলিকে একটি অভিধানে areোকানো হয় সেভাবে তা সর্বদা ফিরিয়ে দেয়, আপনার নজর থাকতে পারে

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


0

অভিধান হ্যাশটেবলের চেয়ে দ্রুত কারণ অভিধান একটি জেনেরিক শক্তিশালী প্রকার। হ্যাশটেবলটি ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে তা হুড়োহুড় হয় যা ডেটা টাইপ করে যা বক্সিং এবং আনবক্সিংয়ের দিকে নিয়ে যায়।



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