几道大数据面试题
幾道大數(shù)據(jù)面試題
http://blog.csdn.net/samjustin1/article/details/52251180
#面試算法題 http://blog.csdn.net/samjustin1
首先處理大數(shù)據(jù)的面試題,有些基本概念要清楚: (1)1Gb = 109bytes(1Gb = 10億字節(jié)):1Gb = 1024Mb,1Mb = 1024Kb,1Kb = 1024bytes; (2)基本流程是,分解大問題,解決小問題,從局部最優(yōu)中選擇全局最優(yōu);(當(dāng)然,如果直接放內(nèi)存里就能解決的話,那就直接想辦法求解,不需要分解了。) (3)分解過程常用方法:hash(x)%m。其中x為字符串/url/ip,m為小問題的數(shù)目,比如把一個(gè)大文件分解為1000份,m=1000; (4)解決問題輔助數(shù)據(jù)結(jié)構(gòu):hash_map,Trie樹,bit map,二叉排序樹(AVL,SBT,紅黑樹); (5)top K問題:最大K個(gè)用最小堆,最小K個(gè)用最大堆。(至于為什么?自己在紙上寫個(gè)小栗子,試一下就知道了。) (6)處理大數(shù)據(jù)常用排序:快速排序/堆排序/歸并排序/桶排序 下面是幾個(gè)例題(每個(gè)題的解法都不唯一,下面只列出了眾多解法中的一種): 1. 給定a、b兩個(gè)文件,各存放50億個(gè)url,每個(gè)url各占64字節(jié),內(nèi)存限制是4G,讓你找出a、b文件共同的url? 假如每個(gè)url大小為10bytes,那么可以估計(jì)每個(gè)文件的大小為50G×64=320G,遠(yuǎn)遠(yuǎn)大于內(nèi)存限制的4G,所以不可能將其完全加載到內(nèi)存中處理,可以采用分治的思想來解決。 Step1:遍歷文件a,對(duì)每個(gè)url求取hash(url)%1000,然后根據(jù)所取得的值將url分別存儲(chǔ)到1000個(gè)小文件(記為a0,a1,...,a999 ,每個(gè)小文件約300M); Step2: 遍歷文件b,采取和a相同的方式將url分別存儲(chǔ)到1000個(gè)小文件(記為b0,b1,...,b999); 巧妙之處:這樣處理后,所有可能相同的url都被保存在對(duì)應(yīng)的小文件(a0 vs b0, a1 vs b1 ,...,a999 vs b999)中,不對(duì)應(yīng)的小文件不可能有相同的url。然后我們只要求出這個(gè)1000對(duì)小文件中相同的url即可。 Step3:求每對(duì)小文件ai和bi中相同的url時(shí),可以把a(bǔ)i的url存儲(chǔ)到hash_set/hash_map中。然后遍歷bi的每個(gè)url,看其是否在剛才構(gòu)建的hash_set中,如果是,那么就是共同的url,存到文件里面就可以了。 草圖如下(左邊分解A,右邊分解B,中間求解相同url): 2. 有一個(gè)1G大小的一個(gè)文件,里面每一行是一個(gè)詞,詞的大小不超過16字節(jié),內(nèi)存限制大小是1M,要求返回頻數(shù)最高的100個(gè)詞。 Step1:順序讀文件中,對(duì)于每個(gè)詞x,取hash(x)%5000,然后按照該值存到5000個(gè)小文件(記為f0 ,f1 ,... ,f4999)中,這樣每個(gè)文件大概是200k左右,如果其中的有的文件超過了1M大小,還可以按照類似的方法繼續(xù)往下分,直到分解得到的小文件的大小都不超過1M; Step2:對(duì)每個(gè)小文件,統(tǒng)計(jì)每個(gè)文件中出現(xiàn)的詞以及相應(yīng)的頻率(可以采用trie樹/hash_map等),并取出出現(xiàn)頻率最大的100個(gè)詞(可以用含100個(gè)結(jié)點(diǎn)的最小堆),并把100詞及相應(yīng)的頻率存入文件,這樣又得到了5000個(gè)文件; Step3:把這5000個(gè)文件進(jìn)行歸并(類似與歸并排序); 草圖如下(分割大問題,求解小問題,歸并): 3. 現(xiàn)有海量日志數(shù)據(jù)保存在一個(gè)超級(jí)大的文件中,該文件無法直接讀入內(nèi)存,要求從中提取某天出訪問百度次數(shù)最多的那個(gè)IP。 Step1:從這一天的日志數(shù)據(jù)中把訪問百度的IP取出來,逐個(gè)寫入到一個(gè)大文件中; Step2:注意到IP是32位的,最多有2^32個(gè)IP。同樣可以采用映射的方法,比如模1000,把整個(gè)大文件映射為1000個(gè)小文件; Step3:找出每個(gè)小文中出現(xiàn)頻率最大的IP(可以采用hash_map進(jìn)行頻率統(tǒng)計(jì),然后再找出頻率最大的幾個(gè))及相應(yīng)的頻率; Step4:在這1000個(gè)最大的IP中,找出那個(gè)頻率最大的IP,即為所求。
#面試算法題 http://blog.csdn.net/samjustin1
首先處理大數(shù)據(jù)的面試題,有些基本概念要清楚: (1)1Gb = 109bytes(1Gb = 10億字節(jié)):1Gb = 1024Mb,1Mb = 1024Kb,1Kb = 1024bytes; (2)基本流程是,分解大問題,解決小問題,從局部最優(yōu)中選擇全局最優(yōu);(當(dāng)然,如果直接放內(nèi)存里就能解決的話,那就直接想辦法求解,不需要分解了。) (3)分解過程常用方法:hash(x)%m。其中x為字符串/url/ip,m為小問題的數(shù)目,比如把一個(gè)大文件分解為1000份,m=1000; (4)解決問題輔助數(shù)據(jù)結(jié)構(gòu):hash_map,Trie樹,bit map,二叉排序樹(AVL,SBT,紅黑樹); (5)top K問題:最大K個(gè)用最小堆,最小K個(gè)用最大堆。(至于為什么?自己在紙上寫個(gè)小栗子,試一下就知道了。) (6)處理大數(shù)據(jù)常用排序:快速排序/堆排序/歸并排序/桶排序 下面是幾個(gè)例題(每個(gè)題的解法都不唯一,下面只列出了眾多解法中的一種): 1. 給定a、b兩個(gè)文件,各存放50億個(gè)url,每個(gè)url各占64字節(jié),內(nèi)存限制是4G,讓你找出a、b文件共同的url? 假如每個(gè)url大小為10bytes,那么可以估計(jì)每個(gè)文件的大小為50G×64=320G,遠(yuǎn)遠(yuǎn)大于內(nèi)存限制的4G,所以不可能將其完全加載到內(nèi)存中處理,可以采用分治的思想來解決。 Step1:遍歷文件a,對(duì)每個(gè)url求取hash(url)%1000,然后根據(jù)所取得的值將url分別存儲(chǔ)到1000個(gè)小文件(記為a0,a1,...,a999 ,每個(gè)小文件約300M); Step2: 遍歷文件b,采取和a相同的方式將url分別存儲(chǔ)到1000個(gè)小文件(記為b0,b1,...,b999); 巧妙之處:這樣處理后,所有可能相同的url都被保存在對(duì)應(yīng)的小文件(a0 vs b0, a1 vs b1 ,...,a999 vs b999)中,不對(duì)應(yīng)的小文件不可能有相同的url。然后我們只要求出這個(gè)1000對(duì)小文件中相同的url即可。 Step3:求每對(duì)小文件ai和bi中相同的url時(shí),可以把a(bǔ)i的url存儲(chǔ)到hash_set/hash_map中。然后遍歷bi的每個(gè)url,看其是否在剛才構(gòu)建的hash_set中,如果是,那么就是共同的url,存到文件里面就可以了。 草圖如下(左邊分解A,右邊分解B,中間求解相同url): 2. 有一個(gè)1G大小的一個(gè)文件,里面每一行是一個(gè)詞,詞的大小不超過16字節(jié),內(nèi)存限制大小是1M,要求返回頻數(shù)最高的100個(gè)詞。 Step1:順序讀文件中,對(duì)于每個(gè)詞x,取hash(x)%5000,然后按照該值存到5000個(gè)小文件(記為f0 ,f1 ,... ,f4999)中,這樣每個(gè)文件大概是200k左右,如果其中的有的文件超過了1M大小,還可以按照類似的方法繼續(xù)往下分,直到分解得到的小文件的大小都不超過1M; Step2:對(duì)每個(gè)小文件,統(tǒng)計(jì)每個(gè)文件中出現(xiàn)的詞以及相應(yīng)的頻率(可以采用trie樹/hash_map等),并取出出現(xiàn)頻率最大的100個(gè)詞(可以用含100個(gè)結(jié)點(diǎn)的最小堆),并把100詞及相應(yīng)的頻率存入文件,這樣又得到了5000個(gè)文件; Step3:把這5000個(gè)文件進(jìn)行歸并(類似與歸并排序); 草圖如下(分割大問題,求解小問題,歸并): 3. 現(xiàn)有海量日志數(shù)據(jù)保存在一個(gè)超級(jí)大的文件中,該文件無法直接讀入內(nèi)存,要求從中提取某天出訪問百度次數(shù)最多的那個(gè)IP。 Step1:從這一天的日志數(shù)據(jù)中把訪問百度的IP取出來,逐個(gè)寫入到一個(gè)大文件中; Step2:注意到IP是32位的,最多有2^32個(gè)IP。同樣可以采用映射的方法,比如模1000,把整個(gè)大文件映射為1000個(gè)小文件; Step3:找出每個(gè)小文中出現(xiàn)頻率最大的IP(可以采用hash_map進(jìn)行頻率統(tǒng)計(jì),然后再找出頻率最大的幾個(gè))及相應(yīng)的頻率; Step4:在這1000個(gè)最大的IP中,找出那個(gè)頻率最大的IP,即為所求。
草圖如下:
總結(jié)
- 上一篇: 大数据量及海量数据处理算法总结
- 下一篇: 深入理解HTTP协议、HTTP协议原理分