本篇部落格我們通過幾個經典的問題來看一下計算機中處理海量資料的常用方法。問題:給定乙個超過100g大小的日誌檔案,檔案中儲存著ip位址,設計演算法找出出現次數最多的ip位址?如何找到出現次數topk的ip?如何直接用linux命令實現?
上述過程的示意圖如下:
問題一:給40億個不重複的無符號整數,沒排過序。給乙個無符號整數,如何快速判斷乙個數是否在這40億個數中。
點陣圖的大致結構如下:
問題二:給定100億個整數,設計演算法找到只出現一次的整數?
上述過程的示意圖如下:
問題三:給兩個檔案,分別有100億個整數,我們只有1g記憶體,如何找到兩個檔案交集?
上述過程的示意圖如下:
問題四:乙個檔案有100億個int,1g記憶體,設計演算法找到出現次數不超過2次的所有整數?
上述過程的示意圖大致如下:
本質上布隆過濾器是一種資料結構,比較巧妙的概率型資料結構,特點是高效的插入和查詢,可以用來告訴你「某樣東西一定不存在或者可能存在」。
布隆過濾器使用點陣圖的方式實現,相比於傳統的list、set、map等資料結構,它更高效、占用空間更少,但是缺點是其返回的結果是概率性的,而不是確切的。
傳統的布隆過濾器不支援刪除,因為可能有多個值對某乙個bit位置1,因此不支援刪除操作,如果想要支援刪除操作,就不能使用點陣圖的結構,將乙個bit位調整成乙個整數,用於統計被置1的次數,類似於乙個計數器,刪除時,對對應的位進行減減操作。但是這樣空間就會消耗很大。
海量資料處理
1 有一千萬條簡訊,有重複,以文字檔案的形式儲存,一行一條,有 重複。請用5分鐘時間,找出重複出現最多的前10條。方法1 可以用雜湊表的方法對1千萬條分成若干組進行邊掃瞄邊建雜湊表。第一次掃瞄,取首位元組,尾位元組,中間隨便兩位元組作為hash code,插入到hash table中。並記錄其位址和...
海量資料處理
給定a b兩個檔案,各存放50億個url,每個url各占用64位元組,記憶體限制是4g,如何找出a b檔案共同的url?答案 可以估計每個檔案的大小為5g 64 300g,遠大於4g。所以不可能將其完全載入到記憶體中處理。考慮採取分而治之的方法。遍歷檔案a,對每個url求取hash url 1000...
海量資料處理
分而治之 hash對映 hash統計 堆 快速 歸併排序 300萬個查詢字串中統計最熱門的10個查詢。針對此類典型的top k問題,採取的對策往往是 hashmap 堆。hash統計 先對這批海量資料預處理。具體方法是 維護乙個key為query字串,value為該query出現次數的hashtab...