এমন বেশ কয়েকটি কৌশল রয়েছে যে গ্যারান্টি দেয় যে লুকোচুরির জন্য সর্বদা ও (1) ক্রিয়াকলাপ প্রয়োজন, এমনকি সবচেয়ে খারাপ ক্ষেত্রেও।
আমি কীভাবে এটি নির্ধারণ করতে পারি যে হ্যাশ টেবিলটিতে ও (1) অপারেশন করার সম্ভাবনা রয়েছে এবং সম্ভবত আমার হ্যাশ ফাংশনটিতে কোন কৌশলগুলি ব্যবহার করা উচিত?
সবচেয়ে খারাপ পরিস্থিতি ঘটে যখন কিছু দূষিত আক্রমণকারী (ম্যালরি) ইচ্ছাকৃতভাবে আপনাকে ডেটা দেয় যা ম্যালরি বিশেষত সিস্টেমটি চালিয়ে যাওয়ার জন্য বেছে নিয়েছিল।
একবার আপনি কোনও নির্দিষ্ট হ্যাশ ফাংশনটি বেছে নেওয়ার পরে, ম্যালরি ধরে নেওয়ার পক্ষে এটি সম্ভবত আশাবাদী যে আপনি কোন হ্যাশ ফাংশনটি বেছে নিয়েছেন তা কখনই খুঁজে পাবেন না। একবার ম্যালোরি কোন হ্যাশ ফাংশনটি আপনি আবিষ্কার করেছেন তা আবিষ্কার করলে, আপনি যদি ম্যালোরিকে সেই হ্যাশ ফাংশনটি ব্যবহার করে আপনার হ্যাশ টেবিলটিতে প্রচুর ডেটা সন্নিবেশ করার অনুমতি দেন, তবে আপনি ডুম্মড হয়ে যাবেন: ম্যালরি অভ্যন্তরীণভাবে বিলিয়ন বিলিয়ন ডেটা আইটেম তৈরি করতে পারে, আপনার সাথে সেগুলি হ্যাশ করে দেয় কোন ডেটা আইটেমগুলির সংঘর্ষ হওয়ার সম্ভাবনা রয়েছে তা অনুসন্ধান করার জন্য হ্যাশ ফাংশন এবং তারপরে আপনাকে মিলিয়ন মিলিয়ন মিলিয়ন ডেটা আইটেম সংঘটিত হওয়ার সম্ভাবনা রয়েছে, যা ও (1) এর চেয়ে অনেক ধীর গতিতে দেখা যায় এমন লকআপগুলিতে নিয়ে যায়।
"ও (1) এমনকি খারাপ অবস্থাতেও" অনুসন্ধানের গ্যারান্টি দেয় এমন সমস্ত কৌশল যে গ্যারান্টিটি রাখার জন্য প্রতিটি সন্নিবেশকে কিছুটা অতিরিক্ত কাজ করে এই সমস্যাটি এড়ায়, ভবিষ্যতে, প্রতিটি সম্ভাব্য চেহারা ও (1) সময়ে সফল হতে পারে । বিশেষত, আমরা ধরে নিই (সবচেয়ে খারাপ পরিস্থিতি) যে ম্যালোরি শীঘ্রই বা পরে আবিষ্কার করবে যে আমরা কোন হ্যাশ ফাংশনটি ব্যবহার করছি; তবে আমরা কেবলমাত্র একটি ভিন্ন হ্যাশ ফাংশন বাছাই করার আগে কয়েকটি তথ্য আইটেম সন্নিবেশ করার সুযোগ পেয়েছি - ট্যাবুলেশন হ্যাশিং বা অন্য কোনও সার্বজনীন হ্যাশিং - একটি যা আমরা বিশেষভাবে নির্বাচন করি যে আমাদের এতক্ষণে থাকা সমস্ত ডেটা 2 এ দেখা যেতে পারে বা 3 টি প্রোব - যেমন, ও (1)। যেহেতু আমরা এলোমেলোভাবে এই ফাংশনটি নির্বাচন করি, আমরা মোটামুটি নিশ্চিত হতে পারি যে ম্যালরি কিছুক্ষণের জন্য আমরা কী ফাংশনটি বেছে নিয়েছিলাম তা জানে না। ম্যালোরি হলেওতাত্ক্ষণিকভাবে আমাদের এমন ডেটা দেয় যা এমনকি এই নতুন হ্যাশ ফাংশনটির সাথেও পূর্ববর্তী ডেটার সাথে সংঘর্ষ ঘটে, আমরা এরপরে আরও একটি নতুন নতুন হ্যাশ ফাংশন বেছে নিতে পারি, রিহ্যাশ করার পরে, তিনি এবং অন্য সবাই আমাদের খাওয়ানো সমস্ত পূর্ববর্তী ডেটা এখন দেখা যাবে সবচেয়ে খারাপ ক্ষেত্রে 2 বা 3 টি প্রোব আপ - যেমন, সবচেয়ে খারাপ ক্ষেত্রে ও (1) অনুসন্ধান।
এলোমেলোভাবে একটি নতুন হ্যাশ ফাংশন নির্বাচন করা এবং প্রতিটি সন্ধান সর্বদা ও (1) থাকে তার গ্যারান্টি দেওয়ার জন্য প্রায়শই পুরো টেবিলটি পুনঃভাগ করা মোটামুটি সহজ। যদিও এটির গ্যারান্টি রয়েছে যে প্রতিটি তাত্ক্ষণি সর্বদা ও (1) থাকে, এই কৌশলগুলি যখন ইতিমধ্যে এন -1 আইটেমগুলিতে একটি হ্যাশ টেবিলের মধ্যে এনথ আইটেমটি সন্নিবেশ করায় তখন মাঝে মাঝে সেই সন্নিবেশের জন্য ও (এন) সময় প্রয়োজন হতে পারে। তবে, সিস্টেমটি এমনভাবে নকশা করা সম্ভব, যখন ম্যালরি ইচ্ছাকৃতভাবে আপনাকে নতুন ডেটা দেয় যে নতুন হ্যাশ ফাংশনটি ব্যবহার করে, পূর্ববর্তী ডেটার সাথে সংঘর্ষ ঘটে, সিস্টেমটি ম্যালরি এবং অন্যদের কাছ থেকে প্রচুর আইটেম গ্রহণ করার আগে গ্রহণ করতে পারে সম্পূর্ণ ও (এন) পুনর্নির্মাণ। হ্যাশ টেবিলের কৌশলগুলি যা ও (1) লুক্কুলের গ্যারান্টি হিসাবে বাছাইয়ের জন্য একটি নতুন-ফাংশন এবং পুনঃনির্ধারণ করতে পারে, এমনকি সবচেয়ে খারাপ ক্ষেত্রেও অন্তর্ভুক্ত:
- কোকিল হ্যাশিং গ্যারান্টি দেয় যে প্রতিটি কী লুক সর্বাধিক 2 হ্যাশ গণনা এবং 2 টি টেবিল লুকআপ সাফল্য করে।
- হপস্কোচ হ্যাশিং গ্যারান্টি দেয় যে টেবিলের অল্প সংখ্যক এইচ (সম্ভবত এইচ = 32) একটানা প্রবেশদ্বারগুলি পরিদর্শন করার পরে প্রতিটি কী লুক্স সফল হয়।
- ডায়নামিক পারফেক্ট হ্যাশিং - ১৯৯৪ সালে ডায়েটফেল্বিংগার দ্বারা প্রকাশিত প্রথম পত্রটি আমি এটি পড়ে দেখিয়েছি যে, প্রতিটি কী অনুসন্ধান সর্বদা ২ টি হ্যাশ গণনা এবং 2 অনুসন্ধানে সফল হয় তার গ্যারান্টিটি দেওয়ার জন্য এটি "ঘন ঘন" পুনঃস্থাপন করে, এটি সম্ভব একটি সম্পূর্ণ পুনর্নির্মাণ খুব কমই করা যায় যে প্রতিটি পূর্ণ পুনঃস্থাপনে ও (এন) সময় ব্যবহার করা হলেও সন্নিবেশ এবং মুছার জন্য প্রত্যাশিত গড় ব্যয়কে ও (1) স্বতন্ত্র করে তোলা হয়েছে।
ডেটা স্ট্রাকচার / হ্যাশ টেবিলগুলি