標籤:
分類:海量資料處理面試題
1.海量日誌資料,提取出某日訪問百度次數最多的那個IP。
首先是這一天,並且是訪問百度的日誌中的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-255位元組;
假設目前有一千萬個記錄(這些查詢串的重複讀比較高,雖然總數是一千萬,但如果出去重複後,不超過3百萬個。一個查詢串的重複度越高,說明查詢它的使用者越多,也就是越熱門。)請你統計最熱門的10個查詢串,要求使用的記憶體不能超過1g。
第一步、先對這批海量資料預先處理,在O(N)的時間內用Hash表完成統計。
第二步,藉助堆這個資料結構,找出Top K,時間複雜度為Nlogk.
即,藉助堆結構,我麼可以在log量級的時間內尋找和調整/移動。因此,維護一個K(該題目中是10)大小的小根堆,然後遍曆300萬的query,分別和根項目進行對比所以,我們最終的時間複雜度是:o(N)+n`*o(logk),(N為1000萬,N·為300萬)。
或者,採用trie樹,關鍵字域存該查詢串出現的次數,沒有出現為0.最後用10個元素的最大堆來對出現的頻率進行排序。
大資料演算法題(一)