1. 給定一個大小超過 100G 的檔案, 其中存著 IP 地址, 找到其中出現次數最多的 IP 地址

100G遠遠大於記憶體的大小,因此不能一次全部讀入到記憶體中進行統計。

進行雜湊切分,一般的記憶體是4G,但肯定不能一下子把4G填滿,記憶體還要放其他的東西,因此可以選擇切成1000份小檔案,每份大小100G/1000=100M(這個值只是估算一下,實際上每份的大小是和具體的資料有關係)

將ip地址對映到相應檔案中 index = hash_func(ip)
相同的ip地址一定得到的是相同的索引值,進入了同一個小檔案
在每個小檔案中分別找出出現次數最多的ip地址
將所有小檔案中的結果彙總,找出所有檔案中出現次數最多的Ip地址

2. 給定100億個整數, 找到其中只出現一次的整數

方法一:
使用點陣圖
2^32位元組=4G
2^32 ≈ 42億9千萬
100億個int –> 所佔大小100億*4位元組 = 400億位元組 ≈ 40G
所以常規操作是不可行了,像這樣找“只出現一次”的問題,可以考慮用點陣圖
普通的點陣圖用1位表示一個數存在或不存在,統計次數的話用兩位的點陣圖
整數約有 42億9千萬(即2^32=4G)個,(42億9千萬 * 2 )/ 8 = 1G
00:沒出現過
01:出現過一次
02:出現過多次

將100億個整數存入點陣圖中,遍歷點陣圖,找出狀態為01的數

方法二:
雜湊切分
將100億個整數切分為400份,每份400M,分別找到每個小檔案中只出現一次的整數,再合併,篩選出合併後只出現一次的整數

3. 有兩個檔案, 分別有100億個query(查詢詞, 字串), 只有1G記憶體, 找到兩個檔案的交集

近似演算法:
查詢字串是否存在使用布隆過濾器
1.定義一個1G的點陣圖,能存放大約10億*8=80億個位
2.字串通過雜湊函式得到整數,將點陣圖中整數對應的位置1
3.再讓另一個檔案的query使用相同的雜湊函式得到的位來這個點陣圖中找

精確演算法:
雜湊切分,切1000份,每份約400M
將兩個檔案的query分別進行雜湊切分,使用相同的雜湊函式將query轉換為一個整數,再用整數模上1000得到一個下標值,將query存入對應下標的小檔案中

相同的query一定進入了相同下標的小檔案
對比兩份下標相同的小檔案,找出其交集,將1000份小檔案的交集彙總起來即兩份檔案的交集

4. 給上千個檔案, 每個檔案大小為1K - 100M, 設計演算法找到某個詞存在在哪些檔案中

倒排索引
遍歷所有檔案,將出現的單詞進行雜湊計算,建立雜湊桶
單詞出現在哪個檔案中,就把該檔案存入單詞對應的雜湊桶中

查詢時,只需將要找的單詞用同樣的雜湊函式進行對映,找到對應的桶,就能找到它在哪些檔案中出現過

.