演算法系列 大資料面試題 兩個大檔案中找出共同記錄

2021-08-06 07:00:10 字數 850 閱讀 7846

給定a、b兩個檔案,各存放50億個url,每個url各佔64位元組,記憶體限制是4g,讓你找出a、b檔案共同的url?

(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)中的想法

大資料演算法面試題

本文參考並對部分內容進行了整理 1 給定 a b 兩個檔案,各存放 50 億個 url,每個 url 各佔 64 位元組,記憶體限制是 4g,讓你找出 a b 檔案共同的 url?1 可以估計每個檔案安的大小為 50g 64 320g,遠遠大於記憶體限制的 4g。所以不可能將其完全載入到記憶體中處理...

PHP面試題,計算兩個檔案之間的相對路徑方法

看了 的 很精簡,而且測試結果也很滿意 例如 檔案a 的路徑是 home web lib img cache.php 檔案b的路徑是 home web api img show.php 那麼,檔案a相對於檔案b的路徑是 lib img cache.php,即檔案b 訪問 檔案a的相對路徑。上 fun...

資料結構 棧面試題 兩個佇列實現乙個棧

上篇文章寫了用兩個棧實現乙個佇列,這篇文章實現用兩個佇列實現乙個棧,其實兩者的思想都是差不多的。下邊繼續畫圖說明 下邊給出實現 includetemplateclass stack else if q1.empty q1不空就push進q1 q1空,q2不空 直接放入q1,這樣pop的話可能更方便一...