2 回答

TA貢獻1858條經驗 獲得超8個贊
您還可以維護所有三個數據結構 1. Count-min 草圖以存儲您在流中遇到的所有內容 2. 大小為 k 的最小堆 3. 大小為 k 的哈希圖
如果是熱門項目 - 您增加計數并從 count-min 草圖中獲取新頻率,假設此項目已存在于 min-heap 中,則您從哈希映射中獲取該項目并增加頻率
當您遇到一個頻率剛剛增加并進入著名的最小堆的不同項目時,您可以同時從最小堆和哈希映射中驅逐根,因此基本上最小堆可以幫助您維護前 k 個頻繁項目和哈希-map 隨機訪問那些頻繁項目。請注意,min-heap 和 hash-map 都可以映射到相同的內存地址,因此更新頻率只能對存儲在 hash-map 中的項目進行

TA貢獻1877條經驗 獲得超6個贊
維護[key,<frequency,position>]
堆中已經存在的對的哈希圖是有意義的。position
指的是堆內鍵的索引(假設是基于數組的堆)。當鍵到達時,您檢查 2 個條件:
- 鍵在哈希圖中
- 它的頻率已經改變
如果兩者都為真,你會O(1)
及時在堆中找到鍵,因為你已經將它的位置存儲在哈希圖中,然后修改鍵的頻率,并根據頻率是增加還是減少,你從那個位置(O(logn)
)。更改位置后,您可以使用新的頻率和位置值更新該鍵的哈希圖條目。
如果第一個為假,則遵循通常的邏輯,即將鍵與根進行比較,如果堆已滿且鍵的頻率大于根的頻率,則將根從堆中彈出并將其從哈希圖中刪除,同時插入進入堆和哈希映射的鍵。
如果鍵在哈希圖中但它的頻率沒有改變,你什么都不做。
添加回答
舉報