आप इन सभी को अपेक्षित परिशोधन समय में कर सकते हैं। आवश्यक चाल यह है कि हमें प्राथमिकता कतार की पूरी शक्ति की आवश्यकता नहीं है, क्योंकि कुंजी आवृत्ति केवल प्रत्येक डालने या हटाने के दौरान 1 से बदल जाती है।O(1)
नीचे दिया गया मेरा समाधान वास्तव में सिर्फ एक "अक्षम" प्राथमिकता कतार के साथ आपका समाधान है जो इस मामले के लिए अच्छी तरह से काम करता है: कुंजी की बाल्टी की दोहरी लिंक की गई सूचियों के रूप में लागू की गई अधिकतम प्राथमिकता कतार में O (1) इन्सर्टिन, डिलीटमैक्स, रिमूफ़ ब्रॉकेट और increaseKey।
बकेट्स की एक डबल-लिंक की गई सूची को बनाए रखें, जहां प्रत्येक बकेट में गैर-खाली हैश सेट ऑफ़ कीज़ (कि मैं एक कॉहोर्ट कहूँगा) और एक पॉज़िटिव पूर्णांक (जिसे मैं वेलकाउंट कहूँगा)। एक बाल्टी बी में, बी के कोहोर्ट में प्रत्येक कुंजी k में आपके द्वारा बनाए गए सेट में इसके साथ जुड़े अद्वितीय मानों की संख्या समान है। उदाहरण के लिए, यदि आपके सेट में जोड़े (ए, सेब), (ए, एवोकैडो), (बी, केला), (सी, ककड़ी), (डी, ड्रैगन फ्रूट) हैं, जहां एकल अक्षर कुंजी और फल हैं मान, तो आपके पास दो बकेट होंगे: एक बकेट में 2 की वैलकाउंट होगी और एक कोहर्ट में केवल एक की होगी: a। अन्य बकेट में 1 की वालकाउंट होगी और एक कोहार्ट में तीन चाबियां बी, सी और डी होंगी।
बाल्टी की दोगुनी-लिंक की गई सूची को ValCount द्वारा आदेशित किया जाना चाहिए। यह महत्वपूर्ण होगा कि हम समय में सूची के प्रमुख और पूंछ पा सकते हैं और यदि हम अपने पड़ोसियों को जानते हैं तो हम O ( 1 ) समय में एक नए बकेट में विभाजन कर सकते हैं । अकल्पनीय रूप से, मैं बकेट की सूची को बकेटलिस्ट कहूंगा।O(1)O(1)
बकेट लिस्ट के अलावा, हमें एक SetMap की आवश्यकता होगी, जो कि ValueBuckets के लिए हैश मैप मैपिंग कुंजी है। एक ValueBucket एक जोड़ी है जिसमें ValueSet (मानों का एक गैर-खाली हैश सेट) और एक बाल्टी के लिए एक गैर-शून्य सूचक होता है। एक कुंजी कश्मीर के साथ जुड़े ValueSet में कश्मीर से जुड़े सभी अद्वितीय मूल्य हैं। एक ValueSet से जुड़े बकेट पॉइंटर में एक Valuehet के आकार के बराबर एक कोहोर्ट है। सेटटेप में एक कुंजी k के साथ जुड़ा हुआ बकेट भी BucketList में कुंजी k के साथ जुड़ा हुआ है।
C ++ में:
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;
एक अधिकतम-आवृत्ति की-वैल्यू जोड़ी को खोजने के लिए, हमें बस बकेट लिस्ट के प्रमुख को देखने की जरूरत है, कोहोर्ट में एक कुंजी ढूंढें, सेटपेज़ में उस कुंजी को देखें, और उसके वैल्यूबकेट के ValueSet में एक मान ढूंढें। (ओफ़्फ़!)
कुंजी-मूल्य जोड़े को सम्मिलित करना और हटाना मुश्किल है।
की-वैल्यू पेयर को सम्मिलित या डिलीट करने के लिए, हम सबसे पहले इसे SetMap में सम्मिलित करते हैं या हटाते हैं। इससे ValueSet का आकार बदल जाएगा, इसलिए हमें कुंजी से संबद्ध बकेट को संशोधित करना होगा। इस बदलाव को देखने के लिए हमें जिन बकेट्स की आवश्यकता होगी, वे उस बकेट के तत्काल पड़ोसी होंगे जो कुंजी का इस्तेमाल करते थे। यहाँ कई मामले हैं, और वे शायद पूरी तरह से वर्तनी के लायक नहीं हैं, हालाँकि मैं खुश हूँ। यदि आपको अभी भी परेशानी हो रही है तो विस्तृत करें।