海量数据处理题集
1、海量日志數據,提取出某日訪問百度次數最多的那個IP。
因為ip地址本省就是用簡單的數字表示,可以直接利用hash算法建立一個ip與訪問次數的鍵值對。ip地址最多有2^32約等于40億,對ip地址用1000取余,得到有1000個4M左右個記錄的文件,每個文件都可以直接讀入到內存中。然后按照訪問次數對每個文件排序,取出每個文件中的最大值,在1000個最大值中再找到最大的那個。
2、搜索引擎會通過日志文件把用戶每次檢索使用的所有檢索串都記錄下來,每個查詢串的長度為1-255字節。假設目前有一千萬個記錄(這些查詢串的重復度比較高,雖然總數是1千萬,但如果除去重復后,不超過3百萬個。一個查詢串的重復度越高,說明查詢它的用戶越多,也就是越熱門。),請你統計最熱門的10個查詢串,要求使用的內存不能超過1G。
由于最多有3百萬個不重復的記錄,即小于3M個記錄,對每個記錄建立搜索串到查詢次數的鍵值對,大約需要3M*256=768M的空間,可以一次性存入內存中。下來的問題就是如何找到最大的10記錄,可以維護一個10個節點的最小堆。它們就是最熱門的10個記錄。
《======TOP K算法總結=====》
3、有一個1G大小的一個文件,里面每一行是一個詞,詞的大小不超過16字節,內存限制大小是1M。返回頻數最高的100個詞。
由于1G大小的文件并不能一次性放入到內存中去,可以建立從單詞到頻數的哈希映射,將原始文件分割成5000個小文件,平均每個大約200k大小。如果分割后文件還是大于1M,還可以繼續分,然后將每個文件加載到內存中,就和第2題的問題一樣了。
4、有10個文件,每個文件1G,每個文件的每一行存放的都是用戶的query,每個文件的query都可能重復。要求你按照query的頻度排序。
對每個文件中的每一行建立query與頻度的hash映射,得到多個文件,每個文件都可以直接放入內存中去,然后根據頻度排序就可以了
《==========回答的不詳細,除了hash外還可以其他方法============》
5、 給定a、b兩個文件,各存放50億個url,每個url各占64字節,內存限制是4G,讓你找出a、b文件共同的url?
一個文件大小大概為5G*64個字節=320GB大小,肯定不能一次性放入內存中去,可以首先用hash法將一個原始文件映射到多個小文件中去。比如說讓每個url對1000取余,得到每個大概為0.32G的文件。要查找共同的url,只需要對每兩個的文件進行查找就可以。
6、在2.5億個整數中找出不重復的整數,注,內存不足以容納這2.5億個整數。
兩種方法:
i.雙位位圖法
用內存中的每兩位表示對應的數字的信息,如00表示不存在,01表示存在一個,10表示存在多個。因為是整數,所以最多需要2^32*2bits=1GB大小的空間來表示數據的信息(注意:不能這樣算,2.5億個整數需要0.25G/8*2=62.5M的空間),可以直接存入到內存中去。查找出位圖信息為01的數據即可。
《===========關于位圖法的理解還不夠深刻=====================》
ii.hash映射法
將2.5億個數進行hash映射到多個文件中去,使每個文件都可以被讀入到內存當中去。對每個文件進行統計得到整數的重復次數。得到重復次數為1的整數。
7、騰訊面試題:給40億個不重復的unsigned int的整數,沒排過序的,然后再給一個數,如何快速判斷這個數是否在那40億個數當中?
與上題思路大致相同。只不過這道題要的查找一個數,上題得到查找的是很多個數。
位圖法只需要使用單位就可以了。
hash方法中要先對各文件按數據大小排序(可以使用快速排序),再對排序結果進行二分查找。
8、怎么在海量數據中找出重復次數最多的一個?
先hash,再求出各數重復次數,然后求出各文件中重復次數最多的那個數,最后在上一步中求出來的數中找到最大的那個即可。
9、上千萬或上億數據(有重復),統計其中出現次數最多的前N個數據。
先hash,再堆排序即可。
10、一個文本文件,大約有一萬行,每行一個詞,要求統計出其中最頻繁出現的前10個詞,請給出思想,給出時間復雜度分析。
與第三題思路相同,
《====================時間復雜度=======================》
11.100w個數中找出最大的100個數。
很好做了吧?
題目來源于:
http://blog.csdn.net/v_JULY_v/article/details/6279498
轉載于:https://www.cnblogs.com/woshizyl/archive/2012/09/03/2800349.html
總結
- 上一篇: C预编译处理
- 下一篇: win8 - 学习资源