十道海量資料處理面試題

2021-05-12 22:09:39 字數 4557 閱讀 8502

table of contents

第一部分:十道海量資料處理面試題 1

1、海量日誌資料,提取出某日訪問百度次數最多的那個ip。 1

2、搜尋引擎會通過日誌檔案把使用者每次檢索使用的所有檢索串都記錄下來,每個查詢串的長度為1-節。 2

3、有乙個1g大小的乙個檔案,裡面每一行是乙個詞,詞的大小不超過16位元組,記憶體限制大小是1m。返回頻數最高的100個詞。 2

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

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

6、在2.5億個整數中找出不重複的整數,注,記憶體不足以容納這2.5億個整數。 4

7、騰訊面試題:給40億個不重複的unsigned int的整數,沒排過序的,然後再給乙個數,如何快速判斷這個數是否在那40億個數當中? 4

8、怎麼在海量資料中找出重複次數最多的乙個? 5

9、上千萬或上億資料(有重複),統計其中出現次數最多的錢n個資料。 5

10、乙個文字檔案,大約有一萬行,每行乙個詞,要求統計出其中最頻繁出現的前10個詞,請給出思想,給出時間複雜度分析。 5

附、100w個數中找出最大的100個數。 5

第二部分、十個海量資料處理方法大總結 6

一、bloom filter 6

二、hashing 6

三、bit-map 7

四、堆 7

五、雙層桶劃分----其實本質上就是【分而治之】的思想,重在「分」的技巧上! 8

六、資料庫索引 8

七、倒排索引(inverted index) 8

八、外排序 9

九、trie樹 9

十、分布式處理 mapreduce 10

經典問題分析 10

首先是這一天,並且是訪問百度的日誌中的ip取出來,逐個寫入到乙個大檔案中。注意到ip是32位的,最多有個2^32個ip。同樣可以採用對映的方法,比如模1000,把整個大檔案對映為1000個小檔案,再找出每個小文中出現頻率最大的ip(可以採用hash_map進行頻率統計,然後再找出頻率最大的幾個)及相應的頻率。

然後再在這1000個最大的ip中,找出那個頻率最大的ip,即為所求。

或者如下闡述(雪域之鷹):

演算法思想:分而治之+hash

1.ip位址最多有2^32=4g種取值情況,所以不能完全載入到記憶體中處理;

2.可以考慮採用「分而治之」的思想,按照ip位址的hash(ip)%1024值,把海量ip日誌分別儲存到1024個小檔案中。這樣,每個小檔案最多包含4mb個ip位址;

3.對於每乙個小檔案,可以構建乙個ip為key,出現次數為value的hash map,同時記錄當前出現次數最多的那個ip位址;

4.可以得到1024個小檔案中的出現次數最多的ip,再依據常規的排序演算法得到總體上出現次數最多的ip;

2、搜尋引擎會通過日誌檔案把使用者每次檢索使用的所有檢索串都記錄下來,每個查詢串的長度為1-節。

假設目前有一千萬個記錄(這些查詢串的重複度比較高,雖然總數是1千萬,但如果除去重複後,不超過3百萬個。乙個查詢串的重複度越高,說明查詢它的使用者越多,也就是越熱門。),請你統計最熱門的10個查詢串,要求使用的記憶體不能超過1g。

典型的top k演算法,還是在這篇文章裡頭有所闡述,詳情請參見:十

一、從頭到尾徹底解析hash表演算法。

文中,給出的最終演算法是:

第一步、先對這批海量資料預處理,在o(n)的時間內用hash表完成統計(之前寫成了排序,特此訂正。july、2011.04.27);

第二步、借助堆這個資料結構,找出top k,時間複雜度為n『logk。

即,借助堆結構,我們可以在log量級的時間內查詢和調整/移動。因此,維護乙個k(該題目中是10)大小的小根堆,然後遍歷300萬的query,分別和根元素進行對比所以,我們最終的時間複雜度是:o(n) + n'*o(logk),(n為1000萬,n』為300萬)。

ok,更多,詳情,請參考原文。

或者:採用trie樹,關鍵字域存該查詢串出現的次數,沒有出現為0。最後用10個元素的最小推來對出現頻率進行排序。

方案:順序讀檔案中,對於每個詞x,取hash(x)%5000,然後按照該值存到5000個小檔案(記為x0,x1,...x4999)中。這樣每個檔案大概是200k左右。

如果其中的有的檔案超過了1m大小,還可以按照類似的方法繼續往下分,直到分解得到的小檔案的大小都不超過1m。

對每個小檔案,統計每個檔案中出現的詞以及相應的頻率(可以採用trie樹/hash_map等),並取出出現頻率最大的100個詞(可以用含100個結點的最小堆),並把100個詞及相應的頻率存入檔案,這樣又得到了5000個檔案。下一步就是把這5000個檔案進行歸併(類似與歸併排序)的過程了。

還是典型的top k演算法,解決方案如下:

方案1:

順序讀取10個檔案,按照hash(query)%10的結果將query寫入到另外10個檔案(記為)中。這樣新生成的檔案每個的大小大約也1g(假設hash函式是隨機的)。

找一台內存在2g左右的機器,依次對用hash_map(query, query_count)來統計每個query出現的次數。利用快速/堆/歸併排序按照出現次數進行排序。將排序好的query和對應的query_cout輸出到檔案中。

這樣得到了10個排好序的檔案(記為)。

對這10個檔案進行歸併排序(內排序與外排序相結合)。

方案2:

一般query的總量是有限的,只是重複的次數比較多而已,可能對於所有的query,一次性就可以加入到記憶體了。這樣,我們就可以採用trie樹/hash_map等直接來統計每個query出現的次數,然後按出現次數做快速/堆/歸併排序就可以了。

方案3:

與方案1類似,但在做完hash,分成多個檔案後,可以交給多個檔案來處理,採用分布式的架構來處理(比如mapreduce),最後再進行合併。

方案1:可以估計每個檔案安的大小為5g×64=320g,遠遠大於記憶體限制的4g。所以不可能將其完全載入到記憶體中處理。考慮採取分而治之的方法。

遍歷檔案a,對每個url求取hash(url)%1000,然後根據所取得的值將url分別儲存到1000個小檔案(記為a0,a1,...,a999)中。這樣每個小檔案的大約為300m。

遍歷檔案b,採取和a相同的方式將url分別儲存到1000小檔案(記為b0,b1,...,b999)。這樣處理後,所有可能相同的url都在對應的小檔案(a0vsb0,a1vsb1,...

,a999vsb999)中,不對應的小檔案不可能有相同的url。然後我們只要求出1000對小檔案中相同的url即可。

求每對小檔案中相同的url時,可以把其中乙個小檔案的url儲存到hash_set中。然後遍歷另乙個小檔案的每個url,看其是否在剛才構建的hash_set中,如果是,那麼就是共同的url,存到檔案裡面就可以了。

方案2:如果允許有一定的錯誤率,可以使用bloom filter,4g記憶體大概可以表示340億bit。將其中乙個檔案中的url使用bloom filter對映為這340億bit,然後挨個讀取另外乙個檔案的url,檢查是否與bloom filter,如果是,那麼該url應該是共同的url(注意會有一定的錯誤率)。

bloom filter日後會在本blog內詳細闡述。

方案1:採用2-bitmap(每個數分配2bit,00表示不存在,01表示出現一次,10表示多次,11無意義)進行,共需記憶體2^32 * 2 bit=1 gb記憶體,還可以接受。然後掃瞄這2.

5億個整數,檢視bitmap中相對應位,如果是00變01,01變10,10保持不變。所描完事後,檢視bitmap,把對應位是01的整數輸出即可。

方案2:也可採用與第1題類似的方法,進行劃分小檔案的方法。然後在小檔案中找出不重複的整數,並排序。然後再進行歸併,注意去除重複的元素。

與上第6題類似,我的第一反應時快速排序+二分查詢。以下是其它更好的方法:

方案1:oo,申請512m的記憶體,乙個bit位代表乙個unsigned int值。讀入40億個數,設定相應的bit位,讀入要查詢的數,檢視相應bit位是否為1,為1表示存在,為0表示不存在。

dizengrong:

方案2:這個問題在《程式設計珠璣》裡有很好的描述,大家可以參考下面的思路,**一下:

又因為2^32為40億多,所以給定乙個數可能在,也可能不在其中;

這裡我們把40億個數中的每乙個用32位的二進位制來表示

假設這40億個數開始放在乙個檔案中。

然後將這40億個數分成兩類:

1.最高位為0

2.最高位為1

並將這兩類分別寫入到兩個檔案中,其中乙個檔案中數的個數<=20億,而另乙個》=20億(這相當於折半了);

與要查詢的數的最高位比較並接著進入相應的檔案再查詢

再然後把這個檔案為又分成兩類:

1.次最高位為0

2.次最高位為1

並將這兩類分別寫入到兩個檔案中,其中乙個檔案中數的個數<=10億,而另乙個》=10億(這相當於折半了);

與要查詢的數的次最高位比較並接著進入相應的檔案再查詢。

.......

以此類推,就可以找到了,而且時間複雜度為o(logn),方案2完。

十七道海量資料處理面試題

十七道海量資料處理面試題與bit map詳解 作者 小橋流水,redfox66,july。文章性質 整理。前言 本部落格內曾經整理過有關海量資料處理的10道面試題 十道海量資料處理面試題與十個方法大總結 此次除了重複了之前的10道面試題之後,重新多整理了7道。僅作各位參考,不作它用。同時,程式設計師...

海量資料處理面試題

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

海量資料處理筆試面試題

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