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求取,然後根...