1. 程式人生 > >布隆過濾器和海量資料面試題

布隆過濾器和海量資料面試題

雜湊切割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詞去匹配是檔案中否存在這個詞。