數據結構:面試
【Bloom Filter】算法
它其實是一個很長的二進制向量和一系列隨機映射函數數據庫
布隆過濾器能夠用於檢索一個元素是否在一個集合中數據結構
它的優勢是空間效率和查詢時間都遠遠超過通常的算法,缺點是有必定的誤識別率和刪除困難分佈式
【Bit map】ide
Bit-map就是用一個bit位來標記某個元素對應的Value, 而Key便是該元素。因爲採用了Bit爲單位來存儲數據,所以在存儲空間方面,能夠大大節省函數
【Hash】oop
【Trie】搜索引擎
【堆】spa
常見思想:
【分而治之/hash映射 + hash統計 + 堆/快速/歸併排序】
對大文件使用hash取模映射成小文件,再在小文件中分別統計
【雙層桶劃分】
【Trie樹/數據庫/倒排索引】
【外排序】
【分佈式處理之Hadoop/Mapreduce】
海量數據面試題的常見考點,無非就是兩個,一是數據太大,沒法一次性裝入內存;二是數據量太大,沒法單機快速處理
經常使用的思想就是分而治之,先化大爲小,化繁爲簡,再歸併結果
例1: 海量日誌數據,提取出某日訪問百度次數最多的那個IP
(文件總量多大 -> 能一次載入內存嗎 -> 怎麼將文件化大爲小,通常能夠採起hash -> 而後怎麼歸併)
首先能夠估計下某天所有的日誌大小,固然能夠選取任一個合理的估計 ,而不須要很精確。好比IP總的可能狀況是?
解答思路:
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;
key: 若是出現文件很大,又是內存受限,則考慮hash成小文件
例2: 搜索引擎會經過日誌文件把用戶每次檢索使用的全部檢索串都記錄下來,每一個查詢串的長度爲1-255字節。假設目前有一千萬個記錄(這些查詢串的重複度比較高,雖然總數是1千萬,但若是除去重複後,不超過3百萬個。一個查詢串的重複度越高,說明查詢它的用戶越多,也就是越熱門),請你統計最熱門的10個查詢串,要求使用的內存不能超過1G
1.hash_map統計:先對這批海量數據預處理。具體方法是:維護一個Key爲Query字串,Value爲該Query出現次數的HashTable,即hash_map(Query,Value),每次讀取一個Query,若是該字串不在Table中,那麼加入該字串,而且將Value值設爲1;若是該字串在Table中,那麼將該字串的計數加一便可。最終咱們在O(N)的時間複雜度內用Hash表完成了統計;
2.堆排序:第二步、藉助堆這個數據結構,找出Top K,時間複雜度爲N‘logK。即藉助堆結構,咱們能夠在log量級的時間內查找和調整/移動。所以,維護一個K(該題目中是10)大小的小根堆,而後遍歷300萬的Query,分別和根元素進行對比。因此,咱們最終的時間複雜度是:O(N) + N' * O(logK),(N爲1000萬,N’爲300萬)
例3: 有一個1G大小的一個文件,裏面每一行是一個詞,詞的大小不超過16字節,內存限制大小是1M。返回頻數最高的100個詞
分而治之 + hash統計 + 堆/快速排序 1.分而治之/hash映射:順序讀文件中,對於每一個詞x,取hash(x)%5000,而後按照該值存到5000個小文件(記爲x0,x1,...x4999)中。這樣每一個文件大概是200k左右。若是其中的有的文件超過了1M大小,還能夠按照相似的方法繼續往下分,直到分解獲得的小文件的大小都不超過1M。 2.hash_map統計:對每一個小文件,採用trie樹/hash_map等統計每一個文件中出現的詞以及相應的頻率。 3.堆/歸併排序:取出出現頻率最大的100個詞(能夠用含100個結點的最小堆)後,再把100個詞及相應的頻率存入文件,這樣又獲得了5000個文件。最後就是把這5000個文件進行歸併(相似於歸併排序)的過程了。
參考資料