海量資料統計topK

2022-08-04 07:15:11 字數 905 閱讀 4578

有乙個1g大小的乙個檔案,裡面每一行是乙個詞,詞的大小不超過16位元組,記憶體限制大小是1m。返回頻數最高的100個詞。

思路:把這1g的資料一次性全部讀入記憶體是不可能了,可以每次讀一行,然後將該詞存到乙個雜湊表裡去,雜湊表的value是詞出現的次數。

現在的問題是,這個雜湊表有多大,能不能裝載1m的記憶體中去。

假設這1g檔案裡每個詞都不一樣,那麼最多有不同的1g/1byte = 1g個詞,乙個雜湊表的節點中包含了單詞(key),頻率(value),next指標,則記憶體至少要24bytes * 1g,這顯然大大超了。不過如果題目告訴我們頂多有一百萬個不同的詞,那麼 24bytes*1m=24m,對於大多數的機器,這個雜湊表是可以建立的,當然此題記憶體只有1m,連24m的雜湊表都裝不下。

因此我們的第一步是將所有的詞分到不同的檔案中去,相同的詞要分到相同的檔案中去。這樣檔案的規模小了,建立的雜湊表也就小了。

將單詞的雜湊值對5000取模,根據結果將單詞分配到5000個檔案中去。這樣,平均情況下,乙個檔案中有1g/5000 = 0.2m個詞,雜湊表基本上能裝得下了。

對每個檔案進行hashmap統計,將詞與頻率寫到乙個新的檔案中,得到5000個新檔案。

維護乙個100個節點的最小堆,依次讀5000個檔案中的每一條記錄。如果頻率小於堆頂,證明該詞比堆裡的100個單詞頻率都低,不可能進top100,捨棄。如果頻率大於堆頂,就將該詞至於堆頂,然後呼叫維護函式,維護最小堆的性質。所有的記錄遍歷完了,最小堆中的單詞就是結果。

總結:雜湊表的大小不是根據單詞的數量,而是根據不同單詞的數量。

最大的topk用最小堆,最小的topk用最大堆。

演算法的時間複雜度:

分小檔案 o(n)

hashmap統計 o(n)

維護最小堆 o(n'logk)   n'是不同的單詞數,k是topk

UV統計 海量資料統計的前世今生

在網際網路公司中,每個專案都需要資料統計 分析,便於專案組利用詳細資料研究專案的整體情況,進行下一步的調整。在資料統計中,uv統計是最常見的,也是最普遍的。有的場景要求實時性很高,有點場景要求準確性很高,有的場景比較在意計算過程中的記憶體。不同的場景使用不同的演算法,下面我們從0到1簡單介紹下uv統...

海量資料 TopK問題

在海量資料中找出出現頻率最高的前k個數,或者從海量資料中找出最大的前k個數,這類問題通常被稱為topk問題。下面我們通過乙個簡單的例子來說明 假如面試官給你100w個資料,請找出其最大的前k個數,而且現在只有1m的空間?在32位作業系統中,預設乙個位元組為4個位元組,則有下列運算 needsize ...

海量資料topK問題

給你一億個資料,從中找出前k個大的資料。有兩種解決辦法。1.直接將資料從大到小排序,然後取前k個。但是由於資料的數量過於龐大,要開闢很大的空間,很浪費記憶體,所以這種方法不建議使用。2.用堆來解決。要找前k個大的資料,則將待找的元素的前k個元素建立大小為k的小根堆,小根堆的堆頂元素是這k個資料中最小...