Bunların tümünü beklenen amortisman süresinde yapabilirsiniz. Temel hile, öncelik sırasının tam gücüne ihtiyacımız olmamasıdır, çünkü anahtar sıklığı her ekleme veya silme sırasında sadece 1 oranında değişir.O(1)
Aşağıdaki çözümüm, gerçekten bu durumda iyi sonuç veren "verimsiz" öncelik kuyruğuna sahip çözümünüzdür: Çift bağlantılı anahtar listesi olarak uygulanan bir maksimum öncelik kuyruğunda O (1) insertMin, deleteMax, removeFromBucket ve increaseKey.
Her bir Kova'nın boş olmayan bir anahtar kümesi (bir Kohort diyeceğim) ve pozitif bir tamsayı (ValCount diyeceğim) olduğu çift bağlantılı bir Kova listesi bulundurun. Bir Kova b'de, b Kohortundaki her k tuşu, bakımını yaptığınız sette onunla ilişkilendirilmiş aynı sayıda benzersiz değere sahiptir. Örneğin, kümenizde tek harflerin tuşların ve meyvelerin olduğu çiftler (a, elma), (a, avokado), (b, muz), (c, salatalık), (d, ejderha meyvesi) varsa değerleri, o zaman iki Kova olurdu: Bir Kova 2 ValCount ve sadece bir anahtardan oluşan bir Kohort olurdu: a. Diğer Bölüm 1 ValCount değerine ve b, c ve d üç anahtarından oluşan bir Kohort'a sahip olacaktır.
Çifte bağlantılı Kova listesi ValCount tarafından sipariş edilmelidir. Listenin başını ve kuyruğunu zamanında bulabilmemiz ve komşularını tanıyorsak zamanında yeni bir Kovaya ekleyebilmemiz önemlidir . Beklenmedik bir şekilde, BucketList Kovaları listesini arayacağım.O ( 1 )O(1)O(1)
BucketList'e ek olarak, ValueBuckets için karma eşleme anahtarları olan bir SetMap'e ihtiyacımız olacak. ValueBucket, ValueSet (boş olmayan bir karma değer kümesi) ve bir Kovaya null olmayan bir işaretçi içeren bir çifttir. K anahtarıyla ilişkilendirilmiş ValueSet, k ile ilişkilendirilmiş tüm benzersiz değerleri içerir. Bir ValueSet ile ilişkili Bucket işaretçisi, ValueSet'in boyutuna eşit bir Kohort'a sahiptir. SetMap içinde bir k anahtarıyla ilişkilendirilen Bucket, BucketList'teki k anahtarıyla da ilişkilendirilir.
C ++ dilinde:
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;
Bir maksimum frekans anahtar / değer çifti bulmak için, BucketList'in başına bakmamız, Kohort'ta bir anahtar bulmamız, SetMap'te bu anahtarı bulmamız ve ValueBucket'in ValueSet'inde bir değer bulmamız gerekir. (Vay be!)
Anahtar / değer çiftlerini eklemek ve silmek daha zordur.
Bir anahtar / değer çiftini eklemek veya silmek için, önce bunu SetMap'e ekler veya sileriz. Bu değişikliği yapmak için bakmamız gereken tek Kova, Kepçenin içinde bulunduğu anahtarın hemen komşuları olacak. Burada birkaç durum var ve muhtemelen tam olarak yazılmaya değmezler, ama mutlu olurum hala sorun yaşıyorsanız ayrıntılandırmak için.