布隆過濾器和海量資料面試題
雜湊切割topK問題
給一個超過100G大小的logfile,log中存著ip地址,設計演算法找到出現次數最多的ip地址,與上題條件相同,如何找到topK的ip?如何直接用Linux系統命令實現?
(1)topK的ip
思路:使用堆
(2)尋找次數最多
思路:分割成多個檔案,分別多每個檔案進行統計,統計方式用hash,ip為key,次數為value,然後就可以統計出每個ip出現的次數,然後再比較出出現次數最大的。
如果是找前k個出現次數最多的ip,就把出現的次數作為堆用來比較的的key,ip地址作為value,把剛剛用雜湊統計好的次數,建立儲存資料一定的小堆(用其中一個檔案先建立一個topK堆,然後再用其他檔案中的資料替換插入),出現次數多的都在堆裡,然後根據次數對應的找到ip。
點陣圖的應用
給定100億個整數,設計演算法找到只出現一次的整數
思路:
分割為多個檔案,兩個為位元位表示出現的次數
給兩個檔案,分別有100億個整數,我們只有1G記憶體,如何找到兩個檔案交集
分割多個檔案,編號相同的檔案比較,一個位元位表示是否出現
點陣圖變形
1一個檔案有100億個int,1G記憶體,設計演算法找到出現次數不超過2次的所有整數
點陣圖(兩個位元位表示一個數據)
布隆過濾器
給兩個檔案,分別有100億個query(字串),我們只有1G記憶體,如何找到兩個檔案交集?分別給出精確演算法
思路:思路的第一步都是先把兩個檔案分割成很多檔案,然後每個編號相同的檔案比較。
為什麼使用布隆過濾器:字串轉化整形數字,兩個字串可能都轉化為了同一個整形資料,這樣單純的點陣圖就無法解決
近似演算法:布隆過濾器,用不同的計算方法,讓query對映多個位圖(對應多個位元位),讓多個位圖中對應的位置都置1,找的時候通過query再次去找所有點陣圖對應的位置是否全為1,如果都是1就可能存在,如果有一個不為1,就說明一定不在。(缺點:不能作刪除操作)
精確演算法:使用雜湊(閉雜湊法和開鏈法):轉化的整數為key,query為value,尋找的時候有兩個比對條件,這樣就比較精確了。
思考:
如何擴充套件BloomFilter使得它支援刪除元素的操作?
思路:把每個位被對映的次數用一個變數記錄起來,刪除的時候就減一即可。(不過這樣做還是在增加了不少記憶體,感覺不太實用)
如何擴充套件BloomFilter使得它支援計數操作?
思路:弄一個變數計數唄,這變數放哪呢
倒排索引
給上千個檔案,每個檔案大小為1K-100M,給n個詞,設計演算法對每個詞找到所有包含它的檔案
思路:
精確方法:在hash表中載入每個檔案吧,hash的key用詞轉化的整形,然後用整形對映詞的位置,如果有雜湊衝突就用方法解決,然後在用n詞去匹配是檔案中否存在這個詞。