布隆過濾器和海量數據面試題

哈希切割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詞去匹配是文件中否存在這個詞。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章