সংঘর্ষের সাথে হ্যাশ টেবিলগুলি কীভাবে মোকাবেলা করবে?


101

আমি আমার ডিগ্রি ক্লাসে শুনেছি যে HashTableনতুন কী এন্ট্রির সাথে অন্যটির সাথে সংঘর্ষ ঘটলে একটি 'পরের উপলভ্য' বালতিতে একটি নতুন এন্ট্রি রাখবে।

HashTableসংঘর্ষের চাবির সাহায্যে পিছনে ডেকে এই সংঘর্ষ ঘটলে কীভাবে এখনও সঠিক মানটি ফিরিয়ে আনতে পারে?

আমি অভিমানী করছি যে Keysহয় Stringটাইপ করুন এবং hashCode()আয় ডিফল্ট বলে জাভা দ্বারা উত্পন্ন।

যদি আমি আমার নিজস্ব হ্যাশিং ফাংশন বাস্তবায়ন করি এবং এটি একটি সন্ধানের টেবিলের অংশ হিসাবে (যেমন একটি HashMapবা Dictionary) ব্যবহার করি তবে সংঘর্ষের সাথে মোকাবিলা করার জন্য কোন কৌশল বিদ্যমান?

আমি এমনকি প্রাথমিক সংখ্যা সম্পর্কিত নোট দেখেছি! গুগল অনুসন্ধান থেকে তথ্য এতটা পরিষ্কার নয়।

উত্তর:


95

হ্যাশ টেবিল দুটির মধ্যে একটির সাথে সংঘর্ষের মোকাবেলা করে।

বিকল্প 1: প্রতিটি বালতিতে সেই বালতিতে হ্যাশ করা উপাদানগুলির একটি লিঙ্কযুক্ত তালিকা থাকে। এই কারণেই একটি খারাপ হ্যাশ ফাংশন হ্যাশ টেবিলগুলিতে খুব ধীর গতিতে লুকআপ করতে পারে।

বিকল্প 2: যদি হ্যাশ টেবিলের এন্ট্রিগুলি সম্পূর্ণ থাকে তবে হ্যাশ টেবিলটি তার যে বালতিগুলির সংখ্যা বাড়িয়ে দিতে পারে এবং তারপরে সারণীর সমস্ত উপাদান পুনরায় বিতরণ করতে পারে। হ্যাশ ফাংশনটি একটি পূর্ণসংখ্যা দেয় এবং হ্যাশ টেবিলটিকে হ্যাশ ফাংশনের ফলাফল গ্রহণ করতে হবে এবং টেবিলের আকারের বিপরীতে এটিকে Mod করতে হবে এটি নিশ্চিত হতে পারে যে এটি বালতিতে আসবে। সুতরাং আকার বাড়িয়ে, এটি পুনরায় ভাগ করবে এবং মডুলো গণনাগুলি চালাবে যা আপনি ভাগ্যবান হলে হয়তো বিভিন্ন বালতিতে জিনিসগুলি প্রেরণ করতে পারেন।

জাভা তার হ্যাশ টেবিল বাস্তবায়নে 1 এবং 2 বিকল্প দুটি ব্যবহার করে।


4
প্রথম বিকল্পের ক্ষেত্রে, অ্যারে বা এমনকি বাইনারি অনুসন্ধান গাছের পরিবর্তে কোনও যুক্ত লিঙ্ক ব্যবহার করার কোনও কারণ আছে কি?

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

4
যদি শৃঙ্খলা ব্যবহার করা হয়, যখন কোনও কী দেওয়া হয়, তবে আমরা কীভাবে জানব কোন জিনিসটি ফিরে আসবে?
চাওএসএক্সডিমন

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

4
@ এ্যামস: কোনটি পছন্দ? হ্যাশের সংঘর্ষের কি কোনও সীমা আছে, যার পরে জাভা দ্বারা দ্বিতীয় পয়েন্ট কার্যকর করা হয়?
শশাঙ্ক বিবেক

79

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


সংঘর্ষের সমাধানের জন্য হ্যাশ টেবিলের জন্য বেশ কয়েকটি কৌশল রয়েছে।

প্রথম ধরণের বড় পদ্ধতিটির সাথে সম্পর্কিত মানগুলির সাথে একসাথে কীগুলি (বা তাদের নির্দেশক) টেবিলের মধ্যে সংরক্ষণ করা দরকার, যার মধ্যে আরও রয়েছে:

  • চেইন আলাদা করুন

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

  • খোলা ঠিকানা

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

  • কোলেসড হ্যাশিং
  • কোকিল হ্যাশিং
  • রবিন হুড হ্যাশিং
  • 2-পছন্দ হ্যাশিং
  • হপস্কোচ হ্যাশিং

সংঘর্ষ পরিচালনার জন্য আরেকটি গুরুত্বপূর্ণ পদ্ধতি হ'ল ডায়নামিক পুনরায় আকার দেওয়া , যার আরও কয়েকটি উপায় রয়েছে:

  • সমস্ত এন্ট্রি অনুলিপি করে আকার পরিবর্তন
  • বর্ধিত আকার পরিবর্তন
  • একঘেয়ে চাবি

সম্পাদনা করুন : উপরেরগুলি উইকি_হ্যাশ_সামগ্রী থেকে ধার করা হয়েছে , যেখানে আরও তথ্যের জন্য আপনার নজর রাখা উচিত।


4
"[...] সম্পর্কিত মানগুলির সাথে কীগুলি (বা তাদের নির্দেশক) সারণীতে সঞ্চিত রাখতে হবে"। ধন্যবাদ, এটি সেই বিষয় যা মানগুলি সংরক্ষণের জন্য প্রক্রিয়াগুলি পড়ার সাথে সাথে সবসময় তাত্ক্ষণিকভাবে পরিষ্কার হয় না।
এমটোন

27

সংঘর্ষ পরিচালনা করতে একাধিক কৌশল উপলব্ধ। আমি তাদের কিছু ব্যাখ্যা করব

শিকল: চেইনে আমরা মানগুলি সঞ্চয় করতে অ্যারে সূচকগুলি ব্যবহার করি। যদি দ্বিতীয় মানের হ্যাশ কোডও একই সূচককে নির্দেশ করে তবে আমরা সেই সূচকটি একটি সংযুক্ত তালিকার সাথে প্রতিস্থাপন করি এবং সেই সূচককে নির্দেশিত সমস্ত মান সংযুক্ত তালিকার মধ্যে সংরক্ষণ করা হয় এবং লিঙ্কিত তালিকার শীর্ষে প্রকৃত অ্যারে সূচক পয়েন্ট থাকে। কিন্তু যদি অ্যারে সূচককে নির্দেশ করে শুধুমাত্র একটি হ্যাশ কোড থাকে তবে মানটি সরাসরি সেই সূচীতে সঞ্চিত থাকে। মানগুলি পুনরুদ্ধার করার সময় একই যুক্তি প্রয়োগ করা হয়। এটি জাভা হ্যাশম্যাপ / হ্যাশটেবলে সংঘর্ষ এড়াতে ব্যবহৃত হয়।

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

index = h(k) 

while( val(index) is occupied) 

index = (index+1) mod n

ডাবল হ্যাশিং কৌশল: এই কৌশলটিতে আমরা দুটি হ্যাশিং ফাংশন এইচ 1 (কে) এবং এইচ 2 (কে) ব্যবহার করি। যদি এইচ 1 (কে) এর স্লটটি দখল করা থাকে তবে দ্বিতীয় হ্যাশিং ফাংশন এইচ 2 (কে) সূচককে বাড়ানোর জন্য ব্যবহৃত হত। সিউডো কোডটি দেখতে এমন দেখাচ্ছে:

index = h1(k)

while( val(index) is occupied)

index = (index + h2(k)) mod n

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

আরও তথ্যের জন্য এই সাইট দেখুন


18

আমি হ্যাকারনিউজে সম্প্রতি প্রকাশিত এই ব্লগ পোস্টটি পড়ার জন্য দৃ strongly়ভাবে পরামর্শ দিচ্ছি: হ্যাশম্যাপ জাভাতে কীভাবে কাজ করে

সংক্ষেপে, উত্তরটি হল

দুটি পৃথক হ্যাশম্যাপ কী বস্তুর যদি একই হ্যাশকোড থাকে তবে কী হবে?

এগুলি একই বালতিতে সংরক্ষণ করা হবে তবে লিঙ্কযুক্ত তালিকার পরবর্তী নোড নেই। এবং কী সমান () পদ্ধতিটি হ্যাশম্যাপে সঠিক কী মানটি সনাক্ত করতে ব্যবহৃত হবে।


4
হ্যাশম্যাপগুলি খুব আকর্ষণীয় এবং সেগুলি গভীর হয়! :)
অ্যালেক্স

4
আমার মনে হয় প্রশ্ন হ্যাশ টেবিল সম্পর্কিত যা হ্যাশম্যাপ নয়
প্রশান্ত

10

আমি আমার ডিগ্রি ক্লাসে শুনেছি যে নতুন কী এন্ট্রির সাথে অন্যটির সাথে সংঘর্ষ ঘটলে একটি হ্যাশ টেবিল 'পরবর্তী উপলভ্য' বালতিতে একটি নতুন এন্ট্রি রাখবে।

এটি আসলে সত্য ওরাকল JDK জন্য অন্তত (তা না হয়, হয় একটি বাস্তবায়ন বিস্তারিত যে API- এর বিভিন্ন বাস্তবায়নের মধ্যে তারতম্য পারে)। পরিবর্তে, প্রতিটি বালতিতে জাভা 8 এর পূর্বে প্রবেশের একটি লিঙ্কযুক্ত তালিকা এবং জাভা 8 বা তদূর্ধের ভারসাম্যযুক্ত গাছ রয়েছে।

তাহলে হ্যাশ টেবিল কীভাবে সঠিক মানটি ফিরিয়ে দিতে পারে যদি সংঘর্ষের চাবি দিয়ে পিছনে ডেকে এই সংঘর্ষ ঘটে?

এটি equals()প্রকৃতপক্ষে মিলিত এন্ট্রিটি সন্ধান করতে ব্যবহার করে ।

যদি আমি আমার নিজস্ব হ্যাশিং ফাংশন বাস্তবায়ন করি এবং এটি দেখার জন্য টেবিলের (যেমন একটি হ্যাশম্যাপ বা অভিধান) অংশ হিসাবে ব্যবহার করি তবে সংঘর্ষের সাথে মোকাবিলা করার জন্য কোন কৌশল বিদ্যমান?

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


এটি উভয়ের পক্ষে Hashtableএবং HashMapসান / ওরাকল দ্বারা jdk 1.6.0_22 এ সত্য ।
নিকিতা রাইবাক

@ নিকিতা: হ্যাশটেবল সম্পর্কে নিশ্চিত নয়, এবং এখনই উত্সগুলিতে আমার অ্যাক্সেস নেই, তবে আমি 100% নির্দিষ্ট হ্যাশম্যাপ চেইনিং ব্যবহার করি এবং আমার ডিবাগের সাথে দেখা প্রতিটি সংস্করণে রৈখিক অনুসন্ধান নয়।
মাইকেল বর্গওয়ার্ট

@ মিশেল ওয়েল, আমি public V get(Object key)এখনই হাশম্যাপের উত্সটি খুঁজছি (উপরে বর্ণিত সংস্করণ) যদি আপনি সেই লিঙ্কযুক্ত তালিকাগুলি প্রদর্শিত হয় যেখানে সুনির্দিষ্ট সংস্করণটি খুঁজে পান, আমি জানতে আগ্রহী।
নিকিতা রাইবাক

@ নিকি: আমি এখন একই পদ্ধতিটি দেখছি, এবং আমি এটি দেখতে পাচ্ছি লুপের জন্য Entryঅবজেক্টগুলির লিঙ্কযুক্ত তালিকার মাধ্যমে পুনরাবৃত্তি করতে:localEntry = localEntry.next
মাইকেল বর্গওয়ার্ট

@ মিশেল দুঃখিত, এটি আমার ভুল। আমি কোডটি ভুল উপায়ে ব্যাখ্যা করেছি। স্বাভাবিকভাবে, e = e.nextনা ++index। +1
নিকিতা রাইবাক

7

জাভা 8 এর পরে আপডেট করুন: জাভা 8 সংঘর্ষ-পরিচালনার জন্য একটি স্ব-ভারসাম্য গাছ ব্যবহার করে, অনুসন্ধানের জন্য ও (এন) থেকে ও (লগ এন) এর সবচেয়ে খারাপ ক্ষেত্রে উন্নতি করে। শৃঙ্খলাবদ্ধকরণ (জাভা until অবধি ব্যবহৃত) এর উন্নতি হিসাবে জাভা ৮-এ একটি স্ব-ভারসাম্য গাছের ব্যবহার প্রবর্তন করা হয়েছিল, যা লিঙ্কযুক্ত তালিকা ব্যবহার করে এবং ও (এন) এর জন্য সবচেয়ে খারাপ পরিস্থিতি রয়েছে যা দেখার জন্য রয়েছে (যেমন এটি পাশ কাটা দরকার) ক্রমতালিকা)

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

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

কোলিশন-হ্যান্ডলিং শৃঙ্খলার জন্য ও (এন) এর কোনও সংঘাত-হ্যান্ডলিংয়ের ক্ষেত্রে (সংযুক্ত-তালিকাটি গৌণ ডেটাস্ট্রাকচার হিসাবে ব্যবহৃত হয়) এবং ও (লগ এন) -র সুনির্দিষ্ট ও সন্ধানের সবচেয়ে খারাপ পারফরম্যান্স নিয়ে আসে ( স্ব-ভারসাম্য গাছের জন্য।

তথ্যসূত্র:

জাভা 8 উচ্চ সংঘর্ষের ক্ষেত্রে হ্যাশম্যাপ অবজেক্টের নিম্নলিখিত উন্নতি / পরিবর্তন নিয়ে এসেছে।

  • জাভা 7 এ যুক্ত বিকল্প স্ট্রিং হ্যাশ ফাংশনটি সরানো হয়েছে।

  • বিপুল সংখ্যক সংঘর্ষের কী রয়েছে এমন বালতিগুলি নির্দিষ্ট প্রান্তিকতা পৌঁছানোর পরে লিঙ্কযুক্ত তালিকার পরিবর্তে ভারসাম্যযুক্ত গাছে তাদের এন্ট্রিগুলি সংরক্ষণ করবে।

উপরের পরিবর্তনগুলি খারাপ অবস্থার পরিস্থিতিতে ও (লগ (এন)) এর কার্যকারিতা নিশ্চিত করে ( https://www.nagarro.com/en/blog/post/24/performance-improvement-for-hashmap-in-java-8 )


আপনি কী ব্যাখ্যা করতে পারেন যে কোনও লিঙ্কযুক্ত তালিকার জন্য খুব খারাপ কেস সন্নিবেশ হ্যাশম্যাপ কেবল ও (1), এবং ও (এন) নয়? আমার কাছে মনে হচ্ছে যদি নন-নকল কীগুলির জন্য আপনার যদি 100% এর সংঘর্ষের হার থাকে তবে আপনি ল্যাশযুক্ত তালিকার শেষের সন্ধানের জন্য হ্যাশম্যাপে প্রতিটি বস্তুটি অতিক্রম করতে পারেন, তাই না? আমি কী মিস করছি?
এমবিএম 29414

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

4

কীটি উপস্থিত রয়েছে কিনা তা দেখতে এটি সমান পদ্ধতিটি ব্যবহার করবে এবং বিশেষত যদি একই বালতিতে একাধিক উপাদান থাকে।


4

যা আলগোরিদিম জাভার হ্যাশম্যাপ ব্যবহার করছে তা নিয়ে কিছুটা বিভ্রান্তি রয়েছে (সান / ওরাকল / ওপেনজেডিকে বাস্তবায়নে), এখানে উত্স সম্পর্কিত প্রাসঙ্গিক কোড স্নিপেটস (ওপেনজেডিকে, 1.6.0_20 থেকে):

/**
 * Returns the entry associated with the specified key in the
 * HashMap.  Returns null if the HashMap contains no mapping
 * for the key.
 */
final Entry<K,V> getEntry(Object key) {
    int hash = (key == null) ? 0 : hash(key.hashCode());
    for (Entry<K,V> e = table[indexFor(hash, table.length)];
         e != null;
         e = e.next) {
        Object k;
        if (e.hash == hash &&
            ((k = e.key) == key || (key != null && key.equals(k))))
            return e;
    }
    return null;
}

এই পদ্ধতিটি (উদাহরণস্বরূপ 355 থেকে 371 লাইন থেকে থাকে) টেবিলটিতে প্রবেশের সন্ধান করার সময় ডাকা হয়, উদাহরণস্বরূপ get(), containsKey()এবং অন্য কিছু থেকে । এখানে লুপটি এন্ট্রি অবজেক্ট দ্বারা গঠিত লিঙ্কযুক্ত তালিকার মধ্য দিয়ে যায়।

এন্ট্রি অবজেক্টগুলির জন্য কোড (লাইন 691-705 + 759):

static class Entry<K,V> implements Map.Entry<K,V> {
    final K key;
    V value;
    Entry<K,V> next;
    final int hash;

    /**
     * Creates new entry.
     */
    Entry(int h, K k, V v, Entry<K,V> n) {
        value = v;
        next = n;
        key = k;
        hash = h;
    }

  // (methods left away, they are straight-forward implementations of Map.Entry)

}

ঠিক এই পরে addEntry()পদ্ধতি আসে :

/**
 * Adds a new entry with the specified key, value and hash code to
 * the specified bucket.  It is the responsibility of this
 * method to resize the table if appropriate.
 *
 * Subclass overrides this to alter the behavior of put method.
 */
void addEntry(int hash, K key, V value, int bucketIndex) {
    Entry<K,V> e = table[bucketIndex];
    table[bucketIndex] = new Entry<K,V>(hash, key, value, e);
    if (size++ >= threshold)
        resize(2 * table.length);
}

এটি পুরাতন প্রথম প্রবেশের লিঙ্ক সহ বালতির সামনের নতুন এন্ট্রি যুক্ত করেছে (বা নাল, যদি না থাকে তবে)। একইভাবে, removeEntryForKey()পদ্ধতিটি তালিকার মধ্য দিয়ে যায় এবং কেবলমাত্র একটি প্রবেশিকা মুছে ফেলার জন্য যত্ন নেয়, তালিকার বাকি অংশটি অক্ষত রেখে দেয়।

সুতরাং, এখানে প্রতিটি বালতিটির জন্য একটি লিঙ্কযুক্ত এন্ট্রি তালিকা রয়েছে এবং আমি খুব সন্দেহ করি যে এটি থেকে পরিবর্তিত _20হয়েছে _22, যেহেতু এটি 1.2 থেকে শুরু হয়েছিল।

(এই কোডটি (সি) 1997-2007 সান মাইক্রোসিস্টেমস, এবং জিপিএল এর অধীনে উপলভ্য, তবে মূল ফাইলটি আরও ভালভাবে অনুলিপি করার জন্য, সান / ওরাকল থেকে প্রতিটি জেডিকে এসসিআর.জিপ অন্তর্ভুক্ত রয়েছে এবং ওপেনজেডিকেও রয়েছে।)


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

3

এখানে জাভাতে একটি খুব সাধারণ হ্যাশ টেবিল প্রয়োগকরণ। কেবলমাত্র প্রয়োগে put()এবং get()তবে আপনি যা খুশি তাই সহজেই যুক্ত করতে পারেন। এটি জাভা hashCode()পদ্ধতিতে নির্ভর করে যা সমস্ত বস্তুর দ্বারা প্রয়োগ করা হয়। আপনি সহজেই নিজের ইন্টারফেস তৈরি করতে পারেন,

interface Hashable {
  int getHash();
}

এবং আপনার পছন্দ হলে কীগুলি দ্বারা এটি প্রয়োগ করতে বাধ্য করুন force

public class Hashtable<K, V> {
    private static class Entry<K,V> {
        private final K key;
        private final V val;

        Entry(K key, V val) {
            this.key = key;
            this.val = val;
        }
    }

    private static int BUCKET_COUNT = 13;

    @SuppressWarnings("unchecked")
    private List<Entry>[] buckets = new List[BUCKET_COUNT];

    public Hashtable() {
        for (int i = 0, l = buckets.length; i < l; i++) {
            buckets[i] = new ArrayList<Entry<K,V>>();
        }
    }

    public V get(K key) {
        int b = key.hashCode() % BUCKET_COUNT;
        List<Entry> entries = buckets[b];
        for (Entry e: entries) {
            if (e.key.equals(key)) {
                return e.val;
            }
        }
        return null;
    }

    public void put(K key, V val) {
        int b = key.hashCode() % BUCKET_COUNT;
        List<Entry> entries = buckets[b];
        entries.add(new Entry<K,V>(key, val));
    }
}

2

সংঘর্ষের সমাধানের জন্য বিভিন্ন পদ্ধতি রয়েছে যার মধ্যে কয়েকটি হ'ল পৃথক চেইনিং, ওপেন অ্যাড্রেসিং, রবিন হুড হ্যাশিং, কোকিল হ্যাশিং ইত্যাদি are

জাভা হ্যাশ tables.Here মধ্যে দুর্ঘটনায় নিরসনের জন্য পৃথক chaining ব্যবহার কিভাবে এটি ঘটবে একটি চমৎকার লিঙ্ক: http://javapapers.com/core-java/java-hashtable/

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