আপনি প্রত্যাশিত মোড়িত সময়ে এই সমস্ত কিছু করতে পারেন । অপরিহার্য কৌশলটি হ'ল আমাদের অগ্রাধিকারের সারির পূর্ণ শক্তি প্রয়োজন নেই, কারণ প্রতিটি সন্নিবেশ বা মোছার সময় মূল ফ্রিকোয়েন্সি কেবল 1 দ্বারা পরিবর্তিত হয়।O(1)
নীচের আমার সমাধানটি হ'ল এই "অক্ষম" অগ্রাধিকার সারির সাথে কেবল আপনার সমাধান যা এই ক্ষেত্রে ভাল কাজ করতে পারে: সর্বাধিক অগ্রাধিকারের সারিটি কীগুলির বালতিগুলির দ্বিগুণ লিঙ্কযুক্ত তালিকাগুলি হিসাবে প্রয়োগ করা হয়েছে ও (1) ইনসার্টমিন, ডিলিটম্যাক্স, সরানোপ্রেমকেট এবং increaseKey।
বালতিগুলির দ্বিগুণ-সংযুক্ত তালিকা বজায় রাখুন, যেখানে প্রতিটি বালকে নন-খালি হ্যাশ কীগুলি সেট করে (যে আমি একটি কোহর্ট কল করব) এবং একটি ধনাত্মক পূর্ণসংখ্যা (যেটি আমি ভ্যালকাউন্টকে কল করব)। একটি বালতি বিতে, বি এর কোহর্টের প্রতিটি কী-তে আপনার রক্ষণাবেক্ষণের সেটটিতে এর সাথে যুক্ত একই সংখ্যক অনন্য মান রয়েছে। উদাহরণস্বরূপ, যদি আপনার সেটে জোড়া থাকে (ক, আপেল), (ক, অ্যাভোকাডো), (খ, কলা), (সি, শসা), (ডি, ড্রাগন ফল) যেখানে একক বর্ণগুলি কী এবং ফলগুলি হয় মানগুলি, তারপরে আপনার কাছে দুটি বালতি থাকবে: একটি বালতিতে 2 এর একটি ভ্যালকাউন্ট এবং কেবল একটি চাবি সমন্বিত কোহর্ট থাকবে: ক। অন্যান্য বালতিতে 1 টির মান এবং 1, কো, তিনটি কী, বি, সি এবং ডি সমন্বিত কোহর্ট থাকবে।
বালতির দ্বিগুণ-সংযুক্ত তালিকাটি ভ্যালকাউন্টের মাধ্যমে অর্ডার করা উচিত। এটি গুরুত্বপূর্ণ যে আমরা মাথা এবং তালিকার লেজ জানতে পারেন হবে সময় এবং আমরা একটি নতুন বালতি সংযুক্ত করান করতে পারে হে ( 1 ) সময় যদি আমরা তার প্রতিবেশীদের জানি। অকল্পনীয়ভাবে, আমি বালতিদের বকেটলিস্টের তালিকায় কল করব।O(1)O(1)
বালতিলিস্ট ছাড়াও আমাদের একটি সেটম্যাপ লাগবে, যা ভ্যালুবকেটসে একটি হ্যাশ ম্যাপ ম্যাপিং কী। একটি ভ্যালুবিকেট হ'ল একটি জুটি যা ভ্যালুসেট (একটি শূন্য হ্যাশ মানগুলির সেট) এবং একটি বালতিতে নন-নাল পয়েন্টার সমন্বিত। একটি কী এর সাথে যুক্ত ভ্যালুসেটে কে-এর সাথে সম্পর্কিত সমস্ত অনন্য মান রয়েছে। ভ্যালুসেটের সাথে জড়িত বালতি পয়েন্টারটিতে ভ্যালুসেটের আকারের সমান কোহর্ট থাকে। সেটম্যাপে কী-এর সাথে জড়িত বালতিটিও বালতিলিস্টে কী-এর সাথে যুক্ত।
সি ++ এ:
struct Bucket {
unsigned ValCount;
unordered_set<Key> Cohort;
Bucket * heavier;
Bucket * lighter;
};
Bucket * BucketListHead;
Bucket * BucketListTail;
struct ValueBucket {
unordered_set<Value> ValueSet;
Bucket * bucket;
};
unordered_map<Key, ValueBucket> SetMap;
সর্বাধিক-ফ্রিকোয়েন্সি কী-মান জুটির সন্ধানের জন্য, আমাদের কেবল বকেটলিস্টের মাথাটি অনুসন্ধান করা উচিত, কোহর্টে একটি কী খুঁজে পাওয়া উচিত, সেটম্যাপে সেই কীটি সন্ধান করা উচিত এবং এর ভ্যালুবকেটের ভ্যালুসেটে একটি মান পাওয়া উচিত। (রাম রাম!)
কী-মানযুক্ত জোড়গুলি সন্নিবেশ করা এবং মুছে ফেলা জটিল।
কী-মানটির জোড়টি sertোকাতে বা মুছতে, আমরা প্রথমে সেটম্যাপে এটি সন্নিবেশ বা মুছুন এটি মান মানটির আকার পরিবর্তন করবে, সুতরাং আমাদের কীটির সাথে সম্পর্কিত বালতিটি সংশোধন করতে হবে। এই পরিবর্তনটি করার জন্য আমাদের কেবলমাত্র বালতিগুলি দেখতে হবে যে বালতিটি ব্যবহৃত হত সেই তত্ক্ষণাতিত প্রতিবেশী হবে several এখানে বেশ কয়েকটি কেস রয়েছে এবং এগুলি সম্ভবত পুরোপুরি বানান করার উপযুক্ত নয়, যদিও আমি খুশি হব আপনার যদি এখনও সমস্যা হয় তবে বিস্তারিতভাবে বলার জন্য।