阿里算法面試題--兩個大文件中找出共同記錄

1.題目

給定a、b兩個文件,各存放50億個url,每個url各佔64字節,內存限制是4G,讓你找出a、b文件共同的url?

2.解題思路

1)首先我們最常想到的方法是讀取文件a,建立哈希表(爲什麼要建立hash表?因爲方便後面的查找),然後再讀取文件b,遍歷文件b中每個url,對於每個遍歷,我們都執行查找hash表的操作,若hash表中搜索到了,則說明兩文件共有,存入一個集合。

(2)但上述方法有一個明顯問題,加載一個文件的數據需要50億*64bytes = 320G遠遠大於4G內存,何況我們還需要分配哈希表數據結構所使用的空間,所以不可能一次性把文件中所有數據構建一個整體的hash表。所以雖然可行,但是無法滿足需求。

(3)針對上述問題,我們分治算法的思想。

step1:遍歷文件a,對每個url求取hash(url)%1000,然後根據所取得的值將url分別存儲到1000個小文件(記爲a0,a1,...,a999,每個小文件約300M),爲什麼是1000?主要根據內存大小和要分治的文件大小來計算,我們就大致可以把320G大小分爲1000份,每份大約300M(當然,到底能不能分佈儘量均勻,得看hash函數的設計)

step2:遍歷文件b,採取和a相同的方式將url分別存儲到1000個小文件(記爲b0,b1,...,b999)(爲什麼要這樣做? 文件a的hash映射和文件b的hash映射函數要保持一致,這樣的話相同的url就會保存在對應的小文件中,比如,如果a中有一個url記錄data1被hash到了a99文件中,那麼如果b中也有相同url,則一定被hash到了b99中)

所以現在問題轉換成了:找出1000對小文件中每一對相同的url(不對應的小文件不可能有相同的url)

step3:因爲每個hash大約300M,所以我們再可以採用(1)中的想法

解題思路參考:https://blog.csdn.net/tiankong_/article/details/77234726

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