সাধারণ হ্যাশ টেবিলের ওভারভিউ
রিফ্রেশার হিসাবে, একটি হ্যাশ টেবিল একটি ডেটা স্ট্রাকচারে একটি নির্দিষ্ট কী এর অধীনে মান সংরক্ষণ করার একটি উপায়। উদাহরণস্বরূপ, আমি "a"
কীটির নীচে মান সঞ্চয় করতে পারি 1
এবং তারপরে 1
হ্যাশ টেবিলের কীটি অনুসন্ধান করে এটি পুনরুদ্ধার করতে পারি ।
হ্যাশ টেবিলের সহজতম উদাহরণ যা আমি আমার মাথার শীর্ষের দিক থেকে ভাবতে পারি তা হ্যাশ টেবিল যা কেবলমাত্র পূর্ণসংখ্যা সঞ্চয় করতে পারে, যেখানে হ্যাশ টেবিলের প্রবেশের কীটিও মান সঞ্চিত হয়। ধরা যাক আপনার টেবিলটি 8 টি আকারের এবং এটি মূলত মেমরির একটি অ্যারে:
---------------------------------
| | | | | | | | |
---------------------------------
0 1 2 3 4 5 6 7
হ্যাশ ফাংশন
হ্যাশ ফাংশন আপনাকে আপনার মানটি কোথায় সঞ্চয় করতে হবে তার একটি সূচক দেয়। এই টেবিলটির জন্য একটি দুর্দান্ত সাধারণ হ্যাশ ফাংশনটি হ'ল আপনি যে মানটি সংরক্ষণ করতে চান তাতে 1 যুক্ত করতে হবে এবং তারপরে এটি 8 (টেবিলের আকার) দ্বারা মোড করবে। অন্য কথায়, আপনার হ্যাশ ফাংশনটি হল (n+1)%8
, n
আপনি যে পূর্ণসংখ্যাটি সঞ্চয় করতে চান তা কোথায় ।
সন্নিবেশ
আপনি যদি এই হ্যাশ টেবিলের মধ্যে একটি মান সন্নিবেশ করতে চান, আপনি (n+1)%8
আপনাকে একটি সূচক দেওয়ার জন্য যে মানটি সন্নিবেশ করতে চান তার উপর আপনার হ্যাশ ফাংশনটিকে (এই ক্ষেত্রে ) কল করুন । উদাহরণস্বরূপ, যদি আমরা ১৪ টি সন্নিবেশ করতে চান, আমরা কল করে (14 + 1) % 8
সূচক 7
পাই, তাই আমরা সূচীতে এটি মান সন্নিবেশ করতাম 7
।
---------------------------------
| | | | | | | |14 |
---------------------------------
0 1 2 3 4 5 6 7
একইভাবে, আমরা 33, 82 এবং 191 এর মতো সন্নিবেশ করতে পারি:
---------------------------------
|191| |33 |82 | | | |14 |
---------------------------------
0 1 2 3 4 5 6 7
দুর্ঘটনায়
তবে যদি আমরা এমন কিছু প্রবেশের চেষ্টা করি যা এন্ট্রিটির সাথে সংঘর্ষ হয়? 2 সূচকে যেতে 3
হবে, তবে এটি 82 দ্বারা নেওয়া হয়েছে this এই সমস্যাটি সমাধান করার একাধিক উপায় রয়েছে, সহজতমটি হ্যাশ ফাংশনটিকে বারবার কল করা এবং আমরা খালি জায়গা না পাওয়া পর্যন্ত বারবার বারবার কল করা।
সুতরাং যুক্তিটি নিম্নরূপ:
- (2 + 1)% 8 = 3
- সূচক 3 পূর্ণ
- আমাদের হ্যাশ ফাংশনটিতে 3 প্লাগ করুন । ( 3 + 1)% 8 = 4 , যা খালি।
- সূচক 4 এ আমাদের মান রাখুন ।
এখন হ্যাশ টেবিলটি দেখতে দেখতে সূচীতে 2 মান সঞ্চিত রয়েছে 4
।
---------------------------------
|191| |33 |82 |2 | | |14 |
---------------------------------
0 1 2 3 4 5 6 7
এই সমাধানটির ক্ষতিটি হ'ল খুব শীঘ্রই, আমাদের টেবিলটি পূর্ণ হয়ে উঠবে! আপনি যদি জানেন যে আপনার ডেটার আকার সীমাবদ্ধ রয়েছে, যতক্ষণ না আপনার টেবিলটি সমস্ত সম্ভাব্য মান ধরে রাখতে যথেষ্ট বড় হয়। আপনি যদি আরও ধরে রাখতে সক্ষম হতে চান তবে আপনি সংঘর্ষগুলি অন্যভাবে পরিচালনা করতে পারেন। 2 সন্নিবেশ করার আগে আমরা যেখানে ছিলাম সেখানে ফিরে আসি।
---------------------------------
|191| |33 |82 | | | |14 |
---------------------------------
0 1 2 3 4 5 6 7
যদি আপনি স্মরণ করেন, (2+1)%8
আমাদের সূচক দেয় 3
, যা নেওয়া হয়। আপনি যদি নিজের হ্যাশ টেবিলটি পূরণ করতে না চান তবে আপনি প্রতিটি টেবিল সূচককে একটি লিঙ্কযুক্ত-তালিকা হিসাবে ব্যবহার করতে পারেন এবং সেই সূচীতে তালিকায় যুক্ত করতে পারেন। সুতরাং হ্যাশ ফাংশনটি আবার কল করার পরিবর্তে, আমরা কেবল সূচকগুলিতে তালিকায় যুক্ত করব 3
:
-----
| 2 |
---------------------------------
|191| |33 |82 | | | |14 |
---------------------------------
0 1 2 3 4 5 6 7
এই তালিকাটি মেমরির যতটা অনুমতি দেবে তত বাড়তে পারে। আমি 18 sertোকাতে পারি এবং এটি কেবল 2 এ যুক্ত হবে:
-----
|18 |
-----
| 2 |
---------------------------------
|191| |33 |82 | | | |14 |
---------------------------------
0 1 2 3 4 5 6 7
খোঁজ
আপনার হ্যাশ টেবিলের মানগুলি সন্ধান করা দ্রুত, আপনার হ্যাশ টেবিলটি বেশ বড় আকারের given আপনি কেবল আপনার হ্যাশ ফাংশনটি কল করেন এবং সূচকটি পান। ধরা যাক আপনি দেখতে চান যে আপনার টেবিলে 82 আছে কিনা। সন্ধানের ফাংশনটি কল করবে (82+1)%8
= 3
, এবং সূচীতে থাকা আইটেমটি দেখতে এবং 3
এটি আপনার জন্য ফিরিয়ে দেবে। আপনি যদি 16 টি দেখে থাকেন তবে সন্ধানের ফাংশনটি সূচীতে 1
দেখা যাবে এবং দেখুন যে এটির অস্তিত্ব নেই।
সংঘর্ষগুলিও হ্যান্ডল করা দরকার লুপআপের!
যদি আপনি মান 2 টি সন্ধান করার চেষ্টা করেন তবে আপনার হ্যাশ টেবিলটিকে ডেটা সঞ্চয় করার জন্য ব্যবহৃত ডেটা পুনরুদ্ধারের জন্য একই ধরণের সংঘর্ষ যুক্তি ব্যবহার করতে হবে। আপনার হ্যাশ টেবিলটি যেভাবে কাজ করে তার উপর নির্ভর করে আপনি যে কী প্রবেশদ্বারটি সন্ধান করছেন (বা একটি ফাঁকা জায়গা খুঁজে পাবেন) না পাওয়া পর্যন্ত আপনি কীটি বার বার চালিয়েছেন অথবা আইটেমটি না পাওয়া পর্যন্ত আপনি আপনার লিঙ্কযুক্ত তালিকার মাধ্যমে পুনরাবৃত্তি করবেন (অথবা তালিকার শেষে পেয়েছি)
সারাংশ
সুতরাং, হ্যাশ টেবিলগুলি কী-ভ্যালু জোড়াটি দ্রুত সঞ্চয় এবং অ্যাক্সেস করার একটি ভাল উপায়। এই উদাহরণে আমরা মান হিসাবে একই কী ব্যবহার করেছি, কিন্তু বাস্তব বিশ্বের হ্যাশ টেবিলগুলিতে কীগুলি এত সীমাবদ্ধ নয়। হ্যাশ ফাংশনগুলি একটি সূচক তৈরি করতে কীগুলিতে কাজ করবে এবং তারপরে কী / মানটি সেই সূচীতে সংরক্ষণ করা যাবে। হ্যাশ টেবিলগুলি সত্যিকার অর্থে পুনরাবৃত্তি করার অর্থ নয়, যদিও এটি করা সম্ভব। আপনি দেখতে পাচ্ছেন, হ্যাশ টেবিলগুলিতে প্রচুর ফাঁকা জায়গা থাকতে পারে এবং সেগুলির মাধ্যমে পুনরাবৃত্তি করা সময় নষ্ট হবে। এমনকি যদি হ্যাশ টেবিলটিতে তার পুনরুক্তিতে ফাঁকা স্থান অনুসন্ধানগুলি এড়াতে যুক্তিযুক্ত থাকে তবে আপনি সংযুক্ত তালিকার মতো পুনরুক্তিগুলির জন্য নকশাকৃত একটি ডেটা কাঠামো ব্যবহার করে আরও উপযুক্ত হবেন।