名人博客閱讀摘要一:教你如何迅速秒殺掉:99%的海量數據處理面試題

1. 教你如何迅速秒殺掉:99%的海量數據處理面試題

1.1 STL容器分兩種

序列式容器:(vector/list/deque/stack/queue/heap)。

關聯式容器:又分爲set(集合)和map(映射表)兩大類,以及這兩大類的衍生體multiset(多鍵集合)和multimap(多鍵映射表),這些容器均以RB-tree完成。此外,還有第3類關聯式容器,如hashtable(散列表),以及以hashtable爲底層機制完成的hash_set(散列集合)/hash_map(散列映射表)/hash_multiset(散列多鍵集合)/hash_multimap(散列多鍵映射表)。也就是說,set/map/multiset/multimap都內含一個RB-tree,而hash_set/ hash_map/ hash_multiset/hash_multimap都內含一個hashtable。

什麼樣的結構決定其什麼樣的性質,因爲set/map/multiset/multimap都是基於RB-tree之上,所以有自動排序功能,而hash_set/hash_map/hash_multiset/hash_multimap都是基於hashtable之上,所以不含有自動排序功能,至於加個前綴multi_無非就是允許鍵值重複而已。

1.2 密匙一、分而治之/Hash映射 + Hash_map統計 + 堆/快速/歸併排序

1.2.1 海量日誌數據,提取出某日訪問百度次數最多的那個IP

Hash映射將大文件分成小文件,同時保證相同的IP記錄分在同一個小文件中,然後進行Hash_map統計,再排序,得到每個小文件中的Top1,最後對所有的Top1排序。

1.2.2 尋找熱門查詢,300萬個查詢字符串中統計最熱門的10個查詢

當內存可以完全容納的時候,就不需要分而治之,直接運用Hash_map統計每個查詢字符串出現的次數,然後求解Top10。

1.2.3 有一個1G大小的一個文件,裏面每一行是一個詞,詞的大小不超過16字節,內存限制大小是1M。返回頻數最高的100個詞

順序讀文件中,對於每個詞x,取hash(x)%5000,然後按照該值存到5000個小文件;對每個小文件,採用trie樹/hash_map等統計每個文件中出現的詞以及相應的頻率;取出出現頻率最大的100個詞(可以用含100個結點的最小堆)後,再把100個詞及相應的頻率存入文件,這樣又得到了5000個文件。最後就是把這5000個文件進行歸併(類似於歸併排序)的過程了。

1.2.4 海量數據分佈在100臺電腦中,想個辦法高效統計出這批數據的TOP10

如果同一個元素重複出現在不同的電腦中,這個時候,你可以有兩種方法:(1)遍歷一遍所有數據,重新hash取摸,如此使得同一個元素只出現在單獨的一臺電腦中;(2)暴力求解:直接統計每臺電腦中各個元素的出現次數,然後把同一個元素在不同機器中的出現次數相加,最終從所有數據中找出TOP10。

1.2.5 有10個文件,每個文件1G,每個文件的每一行存放的都是用戶的query,每個文件的query都可能重複。要求你按照query的頻度排序

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

 

1.2.7 小結

分而治之的關鍵在於保證同樣的記錄被分在同一個小文件中,運用Hash映射。分解完之後就是Hash_map和排序過程,其中堆排序、外部排序和TopK排序最重要。

1.3 密匙二、雙層桶劃分

其實質還是在於分而治之的思想,只是多重劃分,不一定侷限於雙層。

適用範圍:第k大,中位數,不重複或重複的數字。

1.3.1 2.5億個整數中找出不重複的整數的個數,內存空間不足以容納這2.5億個整數

將2.5億個整數Hash映射到若干個小文件中,然後運用bitmap即可。

1.3.2 5億個int找它們的中位數

將5億個int映射到若干個小文件中,統計各個小文件的大小,確定中位數位於哪個小文件中,再運用SelectK算法。

1.4 密匙三:Bloomfilter/Bitmap

對Bloom filter的專門研究見後續學習。

1.4.1 給40億個不重複的unsigned int的整數,沒排過序的,然後再給一個數,如何快速判斷這個數是否在那40億個數當中

用位圖/Bitmap的方法,申請512M的內存,一個bit位代表一個unsigned int值。讀入40億個數,設置相應的bit位,讀入要查詢的數,查看相應bit位是否爲1,爲1表示存在,爲0表示不存在。

1.5 密匙四、Trie樹/數據庫/倒排索引

Trie樹、數據庫索引技術、倒排索引的專門研究見後續學習。

1.6 密匙五、外排序

外排序的專門研究見後續學習。

1.7密匙六、分佈式處理之Mapreduce

Mapreduce的專門研究見後續學習。

1.8 總結

六大密鑰,第一點是最重要的,後續的只是處理方法。總之對大數據處理要把握最重要的思想:分而治之。此中,Hash技術、各種容器運用、各種排序、各種索引技術是最關鍵的。

 

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