1、給乙個超過100g大小的log file,log中存著ip位址,設計演算法找到出現次數最多的ip位址。如何找到top k的ip
這樣的問題如果出現在資料量較小的情形下,用乙個map或者unordered_map都能很快的處理,但是100g這樣的量級放在乙個map裡是絕對不可行的。因此,我們採用雜湊切分。
什麼是雜湊切分?
100g檔案我們無法處理,是1g檔案我們能處理,100m檔案我們能處理
因此,雜湊切分的第一步:對映切分(分治)
首先把所有log file中的ip挨個提取出來,然後這個總量為100g的ip檔案,我們通過對所有進行ip%1000這樣乙個操作,把100g的大檔案切分成了1000個100m的小檔案
第二步:對每個切分小檔案進行統計。這個統計過程一般直接用unordered_map就能完成,然後在每個切分小檔案裡,我們很快就能找到出現次數最多的那個ip
第三步:排序,由第二步得到了1000個出現頻率最高的ip後,由於我們在這裡只用找出出現次數最多的ip,那麼o(n)次內遍歷一趟就能找出來,當然,如果找前k個,那就用乙個容量為k的小堆就能完成。
2、給定100億個整數,設計演算法找到只出現一次的整數
使用hash將所有整數對映到1000個檔案中,在每個檔案中使用 bitmap,用兩個bit表示出現次數,00表示沒出現過,01表示出現過1次,10表示出現過多次,11捨棄,最後歸併每個檔案**現只有1次的數即為所求。
3、給兩個檔案,分別有100億個整數,我們只有1g記憶體,如何找到兩個檔案交集
(1)同樣,我們對兩個檔案分別分10份,每次使用兩個位圖,這兩個點陣圖按位與得到的結果就記錄好了交集,每次我們又把交集裡出現的正數統計好,記錄下來,這樣記憶體也可以很好的控制在1g以下
(2)掃瞄每個整數是否出現過,節省記憶體方法使用bitmap。桶分 + bitmap。如果整數是32bit,直接使用bitmap的方法實現。所有整數共2^32種可能,每個數用兩位表 示,00表示檔案均沒出現,10表示檔案1出現過,01表示檔案2出現過,11表示兩檔案均出現過,共需要2^32*2/8 = 1gb記憶體,遍歷兩個檔案中的所有整數,然後尋 找bitmap中11對應的整數即是兩個檔案的交集,這樣即可線性時間複雜度完成。
4、1個檔案有100億個int,1g記憶體,設計演算法找到出現次數不超過2次的所有整數
這個問題實際上和第二題是一樣的,答案參考第二題
5、給兩個檔案,分別有100億個query,我們只有1g記憶體,如何找到兩個檔案交集?分別給出精確演算法和近似演算法
精確演算法:雜湊切分
對兩個檔案分別進行雜湊切分,使用相同的雜湊函式 (如 bkdrhash雜湊函式)將所有query轉換為乙個整數key ,再利用 index=key%1000就可將相同query分到同一 個檔案。(index為檔案下標)
將兩個檔案中下標相同的小檔案進行對比,找出其交集。
將100個檔案的交集彙總起來即為所給檔案的檔案交集 。此種演算法時間複雜度為o(n)。
近似演算法:布隆過濾器
首先使用相同的雜湊函式(如 bkdrhash雜湊函式)將所有 query轉換為乙個整數key,
又因為布隆過濾器中的每 一位就可代表乙個整數的存在 與否,而16g的整數用位圖512m即可表示,
將第乙個檔案中的整數對映到位圖中去,
拿第二個檔案中的數字到第乙個檔案對映的點陣圖中去對比,相同數字存在即為交集。
此種演算法時間複雜度為o(n)。
注意:布隆過濾器判斷不存在是確定的,而存存在在可能導致誤判,所以稱近似演算法。
6、如何直接用linux系統命令實現找到top k的ip?
sort log|uniq -c|sort -nr|awk ''|head -k
7、有乙個詞典,包含n個英文單詞,現在任意給乙個字串,設計演算法找出包含這個字串的所有英文單詞
1,使用 strstr()進行字串匹配;
2,字典樹;
3,倒排索引;
給輸入字串,利⽤用字母建立倒排索引,索引中儲存該字母 出現在哪個單詞以及在單詞中位置;查詢時,利用倒排找到所有的單詞,並求交集並且位置要連續
海量資料處理問題
一 給乙個超過100g大小的log file,log中存著ip位址,設計演算法找到出現次數最多的ip位址?該題目要求的是出現次數最多的乙個,有時候題目也會變成求出現次數排名前k的ip位址,兩個問題的解題思路是一致的,只是求前k個會多乙個小步驟,就是建堆,所以現在學習一下,求前k個的思路。100g記憶...
海量資料處理問題之雙層桶劃分
雙層桶劃分 什麼是雙層桶 事實上,與其說雙層桶劃分是一種資料結構,不如說它是一種演算法設計思想。面對一堆大量的資料我們無法處理的時候,我們可以將其分成乙個個小的單元,然後根據一定的策略來處理這些小單元,從而達到目的。適用範圍 第k大,中位數,不重複或重複的數字 基本原理及要點 因為元素範圍很大,不能...
海量資料的處理問題
筆者在實際工作中,有幸接觸到海量的資料處理問題,對其進行處理是一項艱鉅而複雜的任務。原因有以下幾個方面 一 資料量過大,資料中什麼情況都可能存在。如果說有10條資料,那麼大不了每條去逐一檢查,人為處理,如果有上百條資料,也可以考慮,如果資料上到千萬級別,甚至過億,那不是手工能解決的了,必須通過工具或...