動不動的「上千萬」 海量資料處理面試題

2021-08-28 05:53:55 字數 2316 閱讀 3809

1、給a,b兩個檔案,各存放50億條url,每條url占用64個位元組,記憶體限制為4g,找出a,b中相同的url。

【分析】我們先來看如果要把這些url全部載入到記憶體中,需要多大的空間。

1mb = 2^20 = 10^6 = 100w

1gb = 2^30 = 10^9 = 10億

50億 = 5g * 64 byte = 320g

明顯是不可能全部載入到記憶體中的。我們可採用以下方法解決:

方法1:

採用bloom filter,假設布隆過濾器的錯誤率為0.01,則位陣列大小m約為輸入元素個數n的13倍,此時需要的雜湊函式k約為8個。

元素個數:n = 5g

位陣列大小:m = 5g * 13 = 65g = 650億 即需要650億個bit位才能達到錯誤率0.01

而我們擁有的記憶體可容納bit位個數:4g * 8bit = 32g bit = 320億,按此實現錯誤率大於0.01。

方法2:

分別掃瞄a,b兩個檔案,根據hash(url)%k(k為正整數,比如k = 1000,那麼每個小檔案只占用300m,記憶體完全可以放得下)將url劃分到不同的k個檔案中,比如a0,a1,....a999;b0,b1,...b999;這樣處理後相同的url肯定在對應的小檔案中(a0 vs b0,a1 vs b1,...a999 vs b999)因為相同的url%1000的值肯定相同,不對應的小檔案不可能有相同的url;然後我們只要求出1000對小檔案中相同的url即可。比如對於a0 vs b0,我們可以遍歷a0,將其中的url存放到hash_map中,然後遍歷b0,如果b0中的某個url在hash_map中,則說明此url在a和b中同時存在,儲存下來即可。

1)a,b分別用hash分成m個小檔案 

2)在a對應第i個檔案,用hash表標記url是否出現,遍歷在b對應的第i個檔案檢視url在hash表中是否存在,若存在則為共同url 

3)合併m個檔案中找到的共同url 

ip有32位,共有232232個ip。 

1)採用hash的方式,ip%m,將大檔案分成m個小檔案。 

2)對每個小檔案,用hash表統計ip出現的次數。找出這個小檔案出現次數最多的ip 

3)在這m個ip中,比較得到出現次數最多的ip。 

如果是top k的話,就維護乙個長度為k的最小堆。

3、統計最熱門的10個查詢串,要求使用的記憶體不能超過1g。

假設目前有一千萬個記錄,這些查詢串的重複度比較高,雖然總數是1千萬,但如果除去重複後,不超過3百萬個。每個查詢串的長度為1-255位元組。乙個查詢串的重複度越高,說明查詢它的使用者越多,也就是越熱門。 

300萬*255=7.65x10^8<1gb 

1)用hash表統計查詢串出現的頻率 

2)維護長度為k的最小堆

4、有10個檔案,每個檔案1g,每個檔案的每一行存放的都是使用者的query,每個檔案的query都可能重複。要求你按照query的頻度排序。

10檔案順序讀取,然後hash,分散到10個檔案裡面去。再hash表統計詞頻,排序。最後歸併。

1、2.5億個整數中找出不重複的整數的個數

32位整數共有232232個,每個數用1bit標記是否出現,共需要232bit=4g/8=512m232bit=4g/8=512m 

申請512m的記憶體,每一bit,0表示未出現,1表示已出現。 

計數器count初始化為0。 

遍歷資料檔案,對每乙個數,檢視對應標誌位,如果為0,則count+1,並標記為1;

2、2.5億個整數中找出不重複的整數

2-bitmap,每個數用2個bit來標記,00未出現,01出現1次,10出現多次,11無意義。需要1g記憶體。 

遍歷資料檔案,對每個數檢視標誌位,為00則改為01,為01則改為10 

最後,檢視bitmap輸出標誌位01的數。

3、5億個int找它們的中位數

思路是先分治,再用雙堆法: 

首先我們將int劃分為2^16個區域,然後讀取資料統計落到各個區域裡的數的個數,之後我們根據統計結果就可以判斷中位數落到那個區域。然後第二次掃瞄我們只統計落在這個區域中的那些數就可以了。

雙堆法的思路: 

序列中的元素,前一半儲存在乙個最大堆中,後一半儲存在乙個最小堆中。控制maxheap與minheap的大小差不能超過1。

參考:

海量資料處理面試題

海量資料處理思路分析題 1.給乙個超過100g大小的log file,log中存著ip位址,設計演算法找到出現次數最多的ip位址?解決方法 雜湊切割topk。將100g的大檔案分成1000份,根據同乙個雜湊函式hashfunc將ip對映到向對應的檔案 每個檔案的大小可以在記憶體中處理 中,相同的ip...

海量資料處理面試題

什麼是海量資料處理?所謂海量資料處理,無非就是基於海量資料上的儲存 處理 操作。何謂海量,就是資料量太大,所以導致要麼是無法在較短時間內迅速解決,要麼是資料太大,導致無法一次性裝入記憶體。那解決辦法呢?針對時間,我們可以採用巧妙的演算法搭配合適的資料結構,如bloom filter hash bit...

海量資料處理之面試題

給定a b兩個檔案,各存放50億個url,每個url各佔64位元組,記憶體限制是4g,讓你找出a b檔案共同的url?方案1 可以估計每個檔案安的大小為50g 64 320g,遠遠大於記憶體限制的4g。所以不可能將其完全載入到記憶體中處理。考慮採取分而治之的方法。遍歷檔案a,對每個url求取,然後根...