คุณสามารถทำสิ่งเหล่านี้ได้ในเวลาตัดจำหน่ายคาดไว้ เคล็ดลับสำคัญคือเราไม่ต้องการพลังเต็มความสำคัญของคิวลำดับความสำคัญเนื่องจากความถี่ของคีย์เปลี่ยนเพียง 1 ครั้งระหว่างการแทรกหรือลบแต่ละครั้งO(1)
โซลูชันด้านล่างของฉันเป็นเพียงโซลูชันของคุณด้วยคิวลำดับความสำคัญ "ไม่มีประสิทธิภาพ" ที่ทำงานได้ดีสำหรับกรณีนี้: คิวลำดับความสำคัญสูงสุดที่ใช้เป็นรายการที่เชื่อมโยงสองครั้งของกลุ่มของคีย์มี O (1) insertMin, deleteMax, removeFaxBucket increaseKey
รักษารายการที่เชื่อมโยงเป็นสองเท่าของที่เก็บข้อมูลโดยที่ที่ฝากข้อมูลแต่ละชุดมีชุดแฮชของคีย์ที่ไม่ว่างเปล่า (ซึ่งฉันจะเรียก Cohort) และจำนวนเต็มบวก (ที่ฉันจะเรียก ValCount) ในถังขแต่ละคีย์ k ในกลุ่มของ b มีจำนวนค่าที่ไม่ซ้ำกันซึ่งเกี่ยวข้องกับค่าในชุดที่คุณกำลังบำรุงรักษา ตัวอย่างเช่นหากชุดของคุณมีคู่ (a, apple), (a, อะโวคาโด), (b, กล้วย), (c, แตงกวา), (d, แก้วมังกร) ซึ่งตัวอักษรเดียวเป็นกุญแจและผลไม้ ค่าจากนั้นคุณจะมีสองถัง: หนึ่งถังจะมี ValCount เป็น 2 และ Cohort ที่ประกอบด้วยคีย์เดียวเท่านั้น: Bucket อื่นจะมี ValCount เป็น 1 และ Cohort ซึ่งประกอบด้วยสามปุ่ม b, c และ d
รายการถังที่เชื่อมโยงเป็นทวีคูณควรได้รับคำสั่งจาก ValCount มันจะเป็นสิ่งสำคัญที่เราสามารถค้นหาหัวและส่วนท้ายของรายการในเวลาและเราสามารถประกบกันในถังใหม่ในเวลาO ( 1 )ถ้าเรารู้ว่าเพื่อนบ้าน ในทางกลับกันฉันจะเรียกรายชื่อ Bucketets the BucketListO(1)O(1)
นอกเหนือจาก BucketList เราจะต้องใช้ SetMap ซึ่งเป็นคีย์การแมปแฮชกับ ValueBuckets ValueBucket เป็นคู่ที่ประกอบด้วยชุดค่า (ชุดแฮชที่ไม่ว่างเปล่าของค่า) และตัวชี้ที่ไม่ใช่ค่าว่างไปยังที่ฝากข้อมูล ชุดค่าที่เกี่ยวข้องกับคีย์ k มีค่าเฉพาะทั้งหมดที่เกี่ยวข้องกับ k ตัวชี้ Bucket ที่เกี่ยวข้องกับ ValueSet มี Cohort เท่ากับขนาดของ ValueSet ที่ฝากข้อมูลที่เชื่อมโยงกับคีย์ k ใน SetMap นั้นเชื่อมโยงกับคีย์ k ใน BucketList ด้วย
ใน 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;
ในการหาคู่คีย์ - ค่าความถี่สูงสุดเราเพียงแค่ต้องดูที่หัวของ BucketList ค้นหาคีย์ใน Cohort ค้นหาคีย์นั้นใน SetMap และค้นหาค่าใน ValueSet ของ ValueBucket (วุ้ย!)
การแทรกและการลบคู่คีย์ - ค่าเป็นเรื่องยุ่งยาก
ในการแทรกหรือลบคู่คีย์ - ค่าอันดับแรกเราจะแทรกหรือลบใน SetMap สิ่งนี้จะเปลี่ยนขนาดของ ValueSet ดังนั้นเราต้องแก้ไข Bucket ที่เกี่ยวข้องกับกุญแจ บุ้งกี๋เดียวที่เราจะต้องดูเพื่อทำการเปลี่ยนแปลงนี้จะเป็นเพื่อนบ้านทันทีของกลุ่มกุญแจที่เคยมีอยู่มีหลายกรณีที่นี่และพวกเขาอาจจะไม่คุ้มกับการสะกดคำอย่างสมบูรณ์แม้ว่าฉันจะมีความสุข ทำอย่างละเอียดหากคุณยังคงมีปัญหา