哈希之海量數據面試題

哈希切割TopK問題

給一個超過100G大小的log file, log中存着IP地址, 設計算法找到出現次數最多的IP地址?

1) 我們首先想到的是對文件進行切割,把它分成1000等份,每一份差不多100M左右。但是在切割時要注意,不能隨便切割。如果我們隨便進行切割,統計出每個文件中出現次數最多的IP地址,這不一定是整個文件出現次數最多的IP地址。假設,一個IP地址,在第一個文件,它時出現次數第二多的,在第二個文件呢也是如此,它不是每個文件出現次數最多的,但是它可能是整個100G文件出現次數最多的,因此,我們不能直接進行切割。
2) 我可以用過哈希映射,用點分十進制的IP地址轉化爲整數,利於哈希函數(哈希函數採用直接定址法),求出IP地址所對應文件的編號,將這些IP地址分割到不同文件,相同的地址一定在同一個文件當中
3) 利用鍵值對,將IP地址作爲鍵,將IP地址出現的次數做爲關鍵碼,然後建一個小堆,,在向堆中插入元素時,先向堆中插入K個元素,以後再插入元素時,先於堆頂元素進行比較,如果小於堆頂元素,不做處理;如果大於,則將堆頂元素刪除,將此元素重新插入堆中,當遍歷完所有IP地址後,堆中保存的元素就是出現次數最多的K個。

位圖應用

給定100億個整數,設計算法找到只出現一次的整數

1) 由於是整數,所以我們採取的思路就是我們可以採用位圖,100億個整數,至少有一半相同的,大致就是需要1.25G的內存進行存儲。一個數字必須要2個位來進行表示狀態,比如說,00表示不存在,01表示存在一次,10表示存在多次。這樣就可以全部表示出每一個數存在的狀態,這裏我們就需要的內存是2.5G。
2) 也可以按bit爲分組,每個bit位有0和1的區分,我們從第一個bit開始分兩個支路,然後對第二個bit位在進行分組,這樣到最後,每個支路末端單獨出現的元素就是隻出現一次的整數

給兩個文件,分別有100億個整數,我們只有1G內存,如何找到兩個文件交集

1)我們採用哈希切分,100億個整數我們來切分爲1000個文件,這樣就有2000個文件,然後我們進行哈希算法,A的100億個數根據餘數不同,對應存在A0文件-A999文件,這樣就完成了A的哈希切分,然後我們對B進行哈希切分,同樣的思想,分出1000個文件,根據餘數的不同分配到B0-B999文件中,這樣我們最後就進行簡單的對應編號的文件之間的比對。這樣就能找到兩個文件的交集。
2)我們可以使用位圖思想,這裏只需要一個比特位來表示一個數存在與否,將兩個文件的數據分別映射到兩個位圖當中,將兩個位圖按位與,得出的結果就是兩個文件的交集。

位圖變形

1個文件有100億個int,1G內存,設計算法找到出現次數不超過2次的所有整數

用兩個比特位表示一個數據的狀態00表示不存在,01表示只出現一次,10表示出現兩次,11表示出現兩次以上,將每個數據映射到位圖當中,最後遍歷位圖,就可以得出結果

布隆過濾器

給兩個文件,分別有100億個query,我們只有1G內存,如何找到兩個文件交集?分別給出精確算法和近似算法
如何擴展BloomFilter使得它支持刪除元素的操作
如何擴展BloomFilter使得它支持計數操作

精確算法
一個query(查詢記錄)字符串大概算60字節,100億大概600G,那麼我們可以進行哈希切割,給出6000(數目越多,越不容易發生哈希衝突,結果越準確)個文件,將字符串轉化爲整數,採用除留餘數法,將每個字符串保存到對應編號的文件當中,然後再遍歷第二個文件,拿到一個字符串,用相同的辦法找到它所對應的文件,再到對應的文件當中找是否有與其相同的字符串,這樣就找到了兩個文件的交集。

近似算法
可以採用布隆過濾器,(即位圖與哈希聯繫起來),將第一個文件當中的每一個字符串插入到布隆過濾器當中,然後,再到第二個文件當中,遍歷每一個query,到布隆過濾器中查找詞條query中是否存在。這樣就可以近似找到兩個文件的交集。因爲,在布隆過濾器中查找某一個元素,如果查找結果位不存在,那麼就一定不存在,但是如果結果位存在,其實也有可能不存在,所以這種解法位近似算法。
記數和刪除操作
可以給每一個元素分配多個比特位,例如:每個元素分配兩個比特位,00表示不存子,01表示有一個,10表示有兩個,如果要刪除某個元素,給其減一,如10變爲01

倒排索引

給上千個文件,每個文件大小爲1K—100M。給n個詞,設計算法對每個詞找到所有包含它的文件,你只有100K內存

1) 我們可以用一個文件info來專門保存n個詞及其對應的文件信息。先將這n個詞利用哈希切分,等分爲N份。對每一份都生成一個布隆過濾器,然後把生成的所有布隆過濾器保存在一個文件Bloom_Filter中。
2) 將內存分爲兩塊緩衝區,一塊用於每次讀入一個布隆過濾器,另一塊用於讀文件。讀文件的這個緩衝區的使用相當於有界生產者消費者模型來實現同步。
3)較大的文件可以切分爲更小的文件,但需要存儲較大文件的標識信息,比如這個小文件是來自哪個大文件的。對讀入的每個單詞都用內存中的布隆過濾器來判斷是否包含某個特定詞,若不包含,就從Bloom_Filter文件中讀取下一個布隆過濾器至內存,直至包含或遍歷完所有的布隆過濾器。如若包含,則更新info文件,直至處理完所有數據。最後將Bloom_Filter文件刪除即可。

發佈了82 篇原創文章 · 獲贊 30 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章