← 回首頁

Heavy Hitters(串流 top-k 高頻項:Misra-Gries / Space-Saving)

資料像水流般不斷湧來——每秒上百萬次點擊、上億筆日誌——你存不下每一筆,卻很想知道「哪幾個東西最常出現」: 最熱門的商品、被搜最多次的關鍵字、打最多流量的那幾個 IP。這類「找串流裡的少數高頻項」問題叫 Heavy Hitters。笨方法是替每個相異項都開一個計數器,但相異項可能有幾千萬個,記憶體爆掉。聰明的做法 是只用固定的 k 個計數器(本頁 k=3),單次掃描就逼近答案。代價是計數不再精確——這頁把兩種經典解法 並排,讓你親眼看見它們各自「往哪個方向不準」。

Misra-Gries(MG)像「僧多粥少就一起扣」:新項若已在表就 +1,有空槽就進駐;但表滿又來個生面孔時, 所有計數器同時 −1、歸零的踢出去,新項這回不進表。這種「連坐扣減」會讓留下來的計數偏低 (估計 ≤ 真頻,低估或準)。Space-Saving(SS)則反過來「鳩佔鵲巢」:表滿又來生面孔時,找計數 最小的那個槽,把它換成新項、繼承它的計數再 +1——於是新來的項白白揹上前一位的計數,讓估計 偏高(估計 ≥ 真頻,高估或準)。下面用同一份串流餵給兩者,並把「兩法的估計」和「暴力精確算出的真值」 三欄並排對照。

為什麼 AI 時代重要

找 top-k 高頻項是串流系統的日常剛需:觀測系統(observability)要即時抓出「打最多流量的熱點 API / IP」做限流 與 DDoS 防護、推薦與廣告系統要追「當下最熱門的商品 / 查詢」、CDN 要決定「哪些內容最該進快取」。放到 LLM 語料工程更關鍵——清洗數十億級 token 語料時,常要依高頻 token / n-gram 過濾樣板重複或偵測資料 污染,逐項精確計數在這種規模上不可行,只能用 Heavy Hitters 以固定 O(k) 空間單次掃描逼近。看懂 MG「低估」 與 SS「高估」兩個方向,才知道拿到近似 top-k 後該往哪邊修正、能信到什麼程度。

它是串流概要(Count-Min / HyperLogLog)與雜湊的延伸

Heavy Hitters 是串流 sketch 家族的第三根柱子: 串流概要 Count-Min / HyperLogLog 裡,Count-Min 估「某一項出現幾次」 (頻次)、HyperLogLog 估「總共有幾個不同的項」(基數),而本頁回答的是「哪些項最熱門」(top-k) ——三者都以固定小空間換取近似,方向與代價各不相同。實作上 Space-Saving 常以 雜湊 Hash Table / Bloom Filter 的雜湊表加 min-heap 做到近 O(1) 更新(本頁為教學用小陣列線性掃描示範核心邏輯),同屬「用固定格位換空間、以偏差換規模」的血緣。

雙表並行(stream 逐項更新 → estimate vs 真實)

固定串流 [A,B,A,B,C,A,D,A,B,E,A,A,B](共 13 項,A 為主導高頻項、B 次之,C/D/E 為低頻雜訊,刻意穿插製造 MG 的 decrement-all 溢位與 SS 的 replace-min 替換)。每個到達項先更新 MG、再更新 SS,各產生一幀; 最後對相異項 [A,B,C,D,E] 逐項揭露「暴力精確真值 vs MG 估計 vs SS 估計」。兩法都只保證「超過各自門檻的項 必留」:MG 門檻 n/(k+1)=13/4=3.25、SS 門檻 n/k=13/3≈4.33——真頻 6 的 A 與真頻 4 的 B 是真正的 top-2, 兩法皆保留;C/D 真頻僅 1,被兩法丟棄。

固定串流(項目標籤):[A,B,A,B,C,A,D,A,B,E,A,A,B](13 項);計數器數 k=3;查詢項 [A,B,C,D,E]。 無隨機,對照 Java aiera/HeavyHitters.java(決定性)。
已處理項數(processed):0 / 13 階段:stream
4 列 × 3 欄計數器表:列 0/1 = Misra-Gries(項目列 / 計數列)、列 2/3 = Space-Saving (項目列 / 計數列);空槽項目顯示「·」、計數顯示 0(0 為合法計數,非「未填」)。藍色外框(active)= 當前到達項在該法本步觸及的格;粉紅(pivot)=MG decrement-all 歸零被移除的槽 / SS replace-min 被替換 的槽。MG 低估、SS 高估:MG 的連坐 −1 使留存計數 ≤ 真頻;SS 的繼承 +1 使新項揹上舊計數 ≥ 真頻。 誠實揭露:k=3 為教學用極小值,刻意讓溢位/替換在小格子上看得見,真實系統 k 會大得多; 兩法皆非精確 top-k——只保證超過門檻(MG:n/(k+1)、SS:n/k)的項必留,門檻以下(如 C/D/E)可能 被丟棄或以偏差計數呈現(如 E 被 SS 高估到 3,真頻其實只有 1)。

估計 vs 真實(暴力精確計數)對照

真值MG 估SS 估SS err

Misra-Gries 計數器(低估或準)

Space-Saving 計數器(高估或準;err = 可能高估量)

已執行操作紀錄(opLog)

(空)