大資料面試題記錄

2021-07-30 09:51:20 字數 3677 閱讀 1962

(1)海量日誌,檔案太大,ip位址最多有2^32=4g,無法裝入記憶體,,將這個大檔案(hash對映:可以取模00)分成多個小檔案(如1000)。

(2)對每個小檔案進行hash統計,hash_map(ip,value), 得到每個檔案出現頻率最多的ip

(3)將這些頻率最高的ip進行統計,然後排序得出最大值,這裡可以採用堆/快速/歸併,但只取乙個最大值的話可以採用堆排序。

搜尋引擎會通過日誌檔案把使用者每次檢索使用的所有檢索串都記錄下來,每個查詢串的長度為1-255位元組。

假設目前有一千萬個記錄(這些查詢串的重複度比較高,雖然總數是1千萬,但如果除去重複後,不超過3百萬個。乙個查詢串的重複度越高,說明查詢它的使用者越多,也就是越熱門。),請你統計最熱門的10個查詢串,要求使用的記憶體不能超過1g。

解法:(1)首先對這1千萬個資料進行hash統計,對映成3百萬個,每個對應乙個頻率, o(n)

(2)使用top k演算法,遍歷這3百萬資料,先取前10個資料構成乙個小堆(將小的資料都刪除掉),後面的元素依次與堆頂元素進行比較,如果大於堆頂元素,替換堆頂元素,重新調整堆,最多n-10次,時間複雜度建堆o(n)+o(nlogn) = o(nlogn)

最終時間複雜度o(nlogn)

3、有乙個1g大小的乙個檔案,裡面每一行是乙個詞,詞的大小不超過16位元組,記憶體限制大小是1m。返回頻數最高的100個詞。

思路:首先要求得每個詞的頻率,1g無法放入記憶體,需要分成多個小檔案,對每個小檔案的詞進行統計

(1)順序讀取檔案,對每個詞,可以hash(x)p00(只要不小於1024個檔案,是為了保證每個小檔案可以放入記憶體), 這樣被對映為5000個小檔案,每個檔案大概200k,每個檔案最少1250個單詞

(2)對於每個小檔案,利用hash_map記錄每個單詞出現的頻率,選出頻率最大的100個單詞(可以用100個元素的最小堆),再生成對應的5000個檔案分別包含這100個單詞和頻率,這分的檔案太多了(關於分多少檔案有什麼準則嗎?, 100*16*5000位元組 > 1m, 無法放入記憶體),

(3)對這5000個小檔案進行歸併排序,選出最大的100個。

以上也可以將從5000個檔案得到的100個數,最後放入100個小檔案吧,最後使用100路歸併。

4、有10個檔案,每個檔案1g,每個檔案的每一行存放的都是使用者的query,每個檔案的query都可能重複。要求你按照query的頻度排序。

(1)hash對映這10個檔案到另外的10個檔案中(hash(query)),這是為了讓相同的query放入乙個檔案中

(2)對每個檔案進行hash統計,統計出每個單詞的頻率,然後按照頻率進行排序,使用快速/堆/歸併都可以。將每個檔案的結果,包含query和頻率輸出到10個檔案中。

(3)對這10個檔案進行歸併排序。

令因為重複查詢比較多,對於所有的查詢可以同時放入記憶體,這樣可以將分成的10個檔案一次裝入記憶體,進行排序。

5、 給定a、b兩個檔案,各存放50億個url,每個url各佔64位元組,記憶體限制是4g,讓你找出a、b檔案共同的url?

思路:每個檔案的大小5g*64 = 32g,遠遠大於記憶體,需要對a,b分別分成小檔案

(1)利用乙個hash(url)00,分別將a,b檔案分別對映成1000個小檔案,因為通過相同的對映函式,所以對於a,b,相同的url都在對應的檔案中,(a0 vs b0, a1 vs b1等等)

(2)分別比對這1000個對應的小檔案,可以通過先將a對映到乙個hash表中,然後依次遍歷b,判斷是否在a中出現,出現過則說明重複

6、在2.5億個整數中找出不重複的整數,注,記憶體不足以容納這2.5億個整數。

思路1:總共大小2.5*10^8*4位元組=1g

(1)將這麼多整數先hash(val)00分成1000個小檔案,相同的數就在相同的檔案中

(2)對每個小檔案進行hash對映,統計出現次數,然後將對應次數為1的輸出。

思路2:採用2-bitmap(每個數分配2bit, 00表示不存在,01表示出現多次,11無意義),所有的整數總共需記憶體2^32次方,2^32 * 2 bit = 1g記憶體,如果可以存入記憶體,首先全部置為0, 依次遍歷這2.5憶個整數,如果bitmap中是00則變01,01變10, 10保持不變,把01對應的數輸出即可。

思路1:同樣採用位圖,40憶個不重複的數,每個數用1bit表示,出現或不出現,40*10^8*1 = 0.5g大小。遍歷這40憶個數,如果出現將對應位置為1,對於給定的數直接判斷點陣圖中對應的值。

思路2:程式設計珠璣上的乙個思路。將每個整數都看成32位的二進位制數,從最高位,依次按位來分,按最高位0,1分成兩個檔案,每個檔案數字個數小於20億,與所要判斷的數的最高為進行比較,從而知道去哪個檔案繼續比較,然後對於選定的檔案再按照次高位比較再分成2個檔案,再比較判斷數對應的位數,依次迴圈,直到最後一位,就可以找到或判斷沒有該數了。時間複雜度o(log2n),因為每次都將資料減少一半,直到最後乙個。

8、怎麼在海量資料中找出重複次數最多的乙個?

思路:hash分成小檔案,分別統計每個小檔案資料出現次數,找出出現次數最大的,然後在將每個小檔案的最大值進行比較,找到最大值,與上面思路一樣的。

9、100w個數中找出最大的100個數。

思路1:最小堆,找最大100個數

思路2:快速排序,每次分割之後只考慮比軸大的一部分(快速選擇的思想),直到比軸大的一部分比100多時,採用傳統排序,取前100個

思路3:選取前100個元素,排序,然後掃瞄剩餘的元素,與排好序的元素中最小的相比,如果比它大,替換,重排前面,這跟堆排序思路一樣。

10、5億個整數找他們的中位數

思路:遍歷這個檔案,按照數的大小分別放入不同的檔案,例如2^16個區域,每個區域大概9000個數的範圍,然後統計每個區域的個數,然後就可以計算中位數落入哪個區域,並且可以計算出中位數是這個區域的第幾大數,然後求出這個區域的第k個數就可以了。

分布式:

海量資料分布在100臺電腦中,想個辦法高效統計出這批資料的top10。

一共有n個機器,每個機器上有n個數。每個機器最多存o(n)個數並對它們操作。如何找到n^2個數的中數(median)?

分析:思路其實是一樣的,這只不過是分不到了n臺電腦上,首先你不能保證乙個元素只出現在一台電腦上,所以需要先通過hash對映,遍歷所有的資料,對於第一道題,將所有相同的資料對映到同一臺機器上,對於第2個問題,每個電腦上存放不同範圍的資料,然後再進行統計,第1道題就可以用前面題的思路,對於找出每台機子的前10個數,然後再統計這些數,找到top10, 第2道題,統計每台機子數的個數,找出中位數所在機子,並計算出中位數是這個機子的第幾個就找到了。 

總結:這些海量資料處理的題,思路基本差不多,首先是hash對映,成為不同型別的檔案,然後hash統計,之後進行排序等等。以下是july總結的,以上也是參考其中部落格整理一些思路的產物。。:

分而治之/hash對映 + hash統計 + 堆/快速/歸併排序(頻率最高,最大等);

雙層桶劃分(中位數, 不重複數):本質上還是分而治之的思想,重在「分」的技巧上!

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

基本原理及要點:因為元素範圍很大,不能利用直接定址表,所以通過多次劃分,逐步確定範圍,然後最後在乙個可以接受的範圍內進行

bloom filter/bitmap(可以用來實現資料字典,進行資料的判重,或者集合求交集,不重複數);

大資料面試題記錄

1 用空間換時間,通過大量的預處理來提公升應用系統的使用者體現 效率 因此資料倉儲會存在大量冗餘的資料。2 如果不分層的話,如果源業務系統的業務規則發生變化將會影響整個資料清洗過程,工作量巨大。3 通過資料分層管理可以簡化資料清洗的過程,因為把原來一步的工作分多個步驟去完成,相當於把乙個複雜的工作拆...

面試題記錄

面試題記錄 2012年6月13日杭州某網路技術公司 1,空指標自加 int p int pa null p pa p 求p的值 這道題考的貌似指標的加法,因為對於空指標比較敏感直接感覺有問題,所以填寫出錯.到底如何呢?直接反彙編之 int p int pa null 010d14f1 mov dwo...

面試題記錄

筆試面試題總結 1,var a 0 function a catch e 0 this.b bbb var aa new a settimeout function 0 settimeout的作用域是window,所以結果為1,2,bbb,b但是將 中的第二個settimeout去掉之後,結果為1,...