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