হ্যাশ টেবিল হল একটি ডেটা স্ট্রাকচার যা একটি সহযোগী পদ্ধতিতে ডেটা সংরক্ষণ করে। একটি হ্যাশ টেবিলে, ডেটা একটি অ্যারে ফরম্যাটে সংরক্ষণ করা হয়, যেখানে প্রতিটি ডেটা মানটির নিজস্ব অনন্য সূচক মান রয়েছে। যদি আমরা পছন্দসই ডেটার সূচী জানি তবে ডেটাতে অ্যাক্সেস খুব দ্রুত হয়ে যায়।
এইভাবে, এটি একটি ডেটা স্ট্রাকচারে পরিণত হয় যেখানে ডেটার আকার নির্বিশেষে সন্নিবেশ এবং অনুসন্ধানের কাজগুলি খুব দ্রুত হয়৷ হ্যাশ টেবিল স্টোরেজ মাধ্যম হিসাবে একটি অ্যারে ব্যবহার করে এবং একটি সূচক তৈরি করতে হ্যাশ কৌশল ব্যবহার করে যেখানে একটি উপাদান সন্নিবেশ করা হবে বা যেখান থেকে অবস্থিত হবে৷
হ্যাশিং
হ্যাশিং হল একটি রেঞ্জের মূল মানের একটি পরিসরকে একটি অ্যারের সূচকের পরিসরে রূপান্তর করার একটি কৌশল। আমরা কি মান একটি পরিসীমা পেতে modulo অপারেটর ব্যবহার করতে যাচ্ছি. 20 আকারের হ্যাশ টেবিলের একটি উদাহরণ বিবেচনা করুন এবং নিম্নলিখিত আইটেমগুলি সংরক্ষণ করতে হবে। আইটেমটি (কী, মান) বিন্যাসে রয়েছে৷
৷
এখানে আমাদের একটি হ্যাশ ফাংশন রয়েছে যা কীগুলি নেয় এবং একটি টেবিলের জন্য সূচক তৈরি করে। এই সূচকগুলি আমাদের জানায় যে মানটি কোথায় সংরক্ষণ করা হয়। এখন যখনই আমরা একটি কী-এর সাথে যুক্ত একটি মান অনুসন্ধান করতে চাই, আমাদের কেবল কীটিতে হ্যাশ ফাংশনটি আবার চালাতে হবে এবং প্রায় ধ্রুবক সময়ের মধ্যে মানটি পেতে হবে৷
হ্যাশ ফাংশন যদিও ডিজাইন করা বেশ কঠিন। একটি উদাহরণ নেওয়া যাক -
ধরা যাক আমাদের নিম্নলিখিত হ্যাশ ফাংশন আছে -
উদাহরণ
function modBy11(key) { return key % 11; }
এবং আমরা এটিকে কী-মানের জোড়ায় চালানো শুরু করি যা আমরা সংরক্ষণ করতে চাই, উদাহরণস্বরূপ −
- (15, 20) - হ্যাশ কোড:4
- (25, 39) - হ্যাশ কোড:3
- (8, 55) - হ্যাশ কোড:8
- (26, 84) - হ্যাশ কোড:4
এখানে আমরা দেখতে পাচ্ছি যে আমাদের একটি সংঘর্ষ হয়েছে, অর্থাৎ, যদি আমরা প্রথমে 15 সংরক্ষণ করি এবং তারপর এই হ্যাশ ফাংশনটির সাথে কী 26 এর মুখোমুখি হই, এটি একই গর্তে এই এন্ট্রিটি ঠিক করার চেষ্টা করবে। একে সংঘর্ষ বলা হয়। এবং এই ধরনের পরিস্থিতি পরিচালনা করার জন্য, আমাদের একটি সংঘর্ষ হ্যান্ডলিং প্রক্রিয়া সংজ্ঞায়িত করতে হবে। কিছু ভাল সংজ্ঞায়িত সহজ সংঘর্ষ রেজোলিউশন অ্যালগরিদম আছে. যেমন −
- লিনিয়ার প্রোবিং:এই অ্যালগরিদমে, আমরা একটি খালি ঘর না পাওয়া পর্যন্ত পরের ঘরে খোঁজ করে অ্যারের পরবর্তী খালি অবস্থান অনুসন্ধান করতে পারি। আমাদের উদাহরণে, যেহেতু 4 এ ছিদ্র নেওয়া হয়েছে, আমরা এটি 5 এ পূরণ করতে পারি।
- পৃথক চেইনিং:এই বাস্তবায়নে:আমরা হ্যাশ টেবিলের প্রতিটি অবস্থানকে একটি তালিকার সাথে সংযুক্ত করি। যখনই আমরা সংঘর্ষ পাই, আমরা এই তালিকার শেষে কী-মান জোড়া যোগ করি। চেইন দীর্ঘ হতে থাকলে এটি অনুসন্ধানের সময় অনেক দীর্ঘ হতে পারে।
এখন যেহেতু আমরা বুঝতে পারছি কিভাবে একটি হ্যাশ টেবিল কাজ করে এবং কিভাবে আমরা সংঘর্ষের রেজোলিউশন ব্যবহার করতে পারি, আসুন হ্যাশটেবল ক্লাসটি বাস্তবায়ন করি।
পদ্ধতিগুলি আমরা প্রয়োগ করব
আমরা আমাদের বাস্তবায়নে এই পদ্ধতিগুলি প্রয়োগ করব -
- পুট(কী, মান):হ্যাশ টেবিলে একটি নতুন কী-মান জোড়া যোগ করে
- get(key):একটি কী এর সাথে যুক্ত মান পায়
- remove(key):টেবিল থেকে কী-মান জোড়া সরিয়ে দেয়
- প্রত্যেকটির জন্য():সমস্ত কী-মানের জোড়ার উপর পুনরাবৃত্তি করার অনুমতি দেয়
- স্ট্যাটিক যোগদান():একটি নতুন 2টি হ্যাশ টেবিলে যোগদানের একটি স্ট্যাটিক পদ্ধতি