亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

存儲來自 count-min-sketch 的前 k 個結果

存儲來自 count-min-sketch 的前 k 個結果

開心每一天1111 2021-12-22 16:47:23
我需要在流中存儲前 k 個最頻繁的元素。為了估計頻率,我使用 count-min-sketch 算法。我的流由鍵(作為字符串)組成。所以基本上每次我在我的流中遇到一個新鍵時,我都會通過查看 count-min-sketch 數據結構來計算到目前為止當前鍵的頻率。但是我無法存儲前 k 個最常用的鍵。我的第一個想法是將它們存儲在一個固定大小為 k 的最小堆中。我將 [頻率,鍵] 存儲在這個最小堆中,并使用比較器比較頻率。因此,每次我獲得一個鍵的頻率時,我都會嘗試查看堆大小是否超過 k,如果是,那么我將當前鍵的頻率與最小堆中的最高(最?。╊l率進行比較,如果我當前的鍵是頻率較大然后我彈出頂部,并將我的密鑰插入堆中。但是我意識到最小堆不是一個集合,這意味著它允許重復。假設我有一個非常熱的鍵,并且我一直在流中計算它,所以每次我將這個 [頻率,鍵] 插入堆中時,最終我的堆將充滿相同的鍵,只是頻率不同。所以我想知道有沒有一種好方法可以在 count-min-sketch 中存儲前 k 個不同的更頻繁的元素。
查看完整描述

2 回答

?
猛跑小豬

TA貢獻1858條經驗 獲得超8個贊

您還可以維護所有三個數據結構 1. Count-min 草圖以存儲您在流中遇到的所有內容 2. 大小為 k 的最小堆 3. 大小為 k 的哈希圖

如果是熱門項目 - 您增加計數并從 count-min 草圖中獲取新頻率,假設此項目已存在于 min-heap 中,則您從哈希映射中獲取該項目并增加頻率

當您遇到一個頻率剛剛增加并進入著名的最小堆的不同項目時,您可以同時從最小堆和哈希映射中驅逐根,因此基本上最小堆可以幫助您維護前 k 個頻繁項目和哈希-map 隨機訪問那些頻繁項目。請注意,min-heap 和 hash-map 都可以映射到相同的內存地址,因此更新頻率只能對存儲在 hash-map 中的項目進行


查看完整回答
反對 回復 2021-12-22
?
慕哥9229398

TA貢獻1877條經驗 獲得超6個贊

維護[key,<frequency,position>]堆中已經存在的對的哈希圖是有意義的。position指的是堆內鍵的索引(假設是基于數組的堆)。當鍵到達時,您檢查 2 個條件:
- 鍵在哈希圖中
- 它的頻率已經改變

如果兩者都為真,你會O(1)及時在堆中找到鍵,因為你已經將它的位置存儲在哈希圖中,然后修改鍵的頻率,并根據頻率是增加還是減少,你從那個位置(O(logn))。更改位置后,您可以使用新的頻率和位置值更新該鍵的哈希圖條目。

如果第一個為假,則遵循通常的邏輯,即將鍵與根進行比較,如果堆已滿且鍵的頻率大于根的頻率,則將根從堆中彈出并將其從哈希圖中刪除,同時插入進入堆和哈希映射的鍵。

如果鍵在哈希圖中但它的頻率沒有改變,你什么都不做。


查看完整回答
反對 回復 2021-12-22
  • 2 回答
  • 0 關注
  • 337 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號