海量資料處理

2021-07-05 05:16:04 字數 4231 閱讀 4178

演算法思想:分而治之+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 位元組。

假設目前有一千萬個記錄(這些查詢串的重複度比較高,雖然總數是 1 千萬,但如果除去重複後,不超過 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 個元

素的最小堆來對出現頻率進行排序。

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

方案:順序讀檔案中,對於每個詞 x,取 hash(x)%5000,然後按照該值存到 5000 個小檔案(記為 x0,x1,…x4999)中。這樣每個檔案大概是 200k 左右。

如果其中的有的檔案超過了 1m 大小,還可以按照類似的方法繼續往下分,直到分解得到的小檔案的大小都不超過 1m。

對每個小檔案,統計每個檔案中出現的詞以及相應的頻率(可以採用 trie 樹/hash_map等),並取出出現頻率最大的 100 個詞(可以用含 100 個結點的最小堆),並把 100 個詞及相應的頻率存入檔案,這樣又得到了 5000 個檔案。下一步就是把這 5000 個檔案進行歸併(類似於歸併排序)的過程了。

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

還是典型的 top k 演算法,解決方案如下:

方案 1 :

順序讀取 10 個檔案,按照 hash(query)%10 的結果將 query 寫入到另外 10 個檔案(記

為)中。這樣新生成的檔案每個的大小大約也 1g(假設 hash 函式是隨機的)。

找一台內存在 2g 左右的機器,依次對用 hash_map(query, query_count)來統計每個query 出現的次數。利用快速/堆/歸併排序按照出現次數進行排序。將排序好的 query 和對應的 query_cout 輸出到檔案中。這樣得到了 10 個排好序的檔案(記為)。

對這 10 個檔案進行歸併排序(內排序與外排序相結合)。

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

方案 1 :可以估計每個檔案安的大小為 5g×64=320g,遠遠大於記憶體限制的 4g。所以

不可能將其完全載入到記憶體中處理。考慮採取分而治之的方法。

遍歷檔案 a,對每個 url 求取 hash(url)%1000,然後根據所取得的值將 url 分別儲存到1000 個小檔案(記為 a0,a1,…,a999)中。這樣每個小檔案的大約為 300m。

遍歷檔案 b,採取和 a 相同的方式將 url 分別儲存到 1000 小檔案(記為 b0,b1,…,b999)。

這樣處理後,所有可能相同的 url 都在對應的小檔案( a0vsb0,a1vsb1,…,a999vsb999)中,

不對應的小檔案不可能有相同的 url。然後我們只要求出 1000 對小檔案中相同的 url 即可。

求每對小檔案中相同的 url 時,可以把其中乙個小檔案的 url 儲存到 hash_set 中。然後遍歷另乙個小檔案的每個 url,看其是否在剛才構建的 hash_set 中,如果是,那麼就是共同

的 url,存到檔案裡面就可以了。

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

方案 1 :採用 2-bitmap(每個數分配 2bit, 00 表示不存在, 01 表示出現一次, 10 表示多次, 11 無意義)進行,共需記憶體 2^32 * 2 bit=1 gb 記憶體,還可以接受。然後掃瞄這 2.5億個整數,檢視bitmap 中相對應位,如果是 00 變 01, 01 變 10, 10 保持不變。所描完事後,檢視 bitmap,把對應位是 01 的整數輸出即可。

方案 2:也可採用與第 1 題類似的方法,進行劃分小檔案的方法。然後在小檔案中找出不重複的整數,並排序。然後再進行歸併,注意去除重複的元素。

又因為 2^32 為 40 億多,所以給定乙個數可能在,也可能不在其中;

這裡我們把 40 億個數中的每乙個用 32 位的二進位制來表示

假設這 40 億個數開始放在乙個檔案中。

然後將這 40 億個數分成兩類:

1.最高位為 0

2.最高位為 1

並將這兩類分別寫入到兩個檔案中,其中乙個檔案中數的個數<=20 億,而另乙個》=20

億(這相當於折半了);

與要查詢的數的最高位比較並接著進入相應的檔案再查詢

再然後把這個檔案為又分成兩類:

1.次最高位為 0

2.次最高位為 1

並將這兩類分別寫入到兩個檔案中,其中乙個檔案中數的個數<=10 億,而另乙個》=10

億(這相當於折半了);

與要查詢的數的次最高位比較並接著進入相應的檔案再查詢。

以此類推,就可以找到了,而且時間複雜度為 o(logn),方案 2 完。

位圖法比較適合於這種情況,它的做法是按照集合中最大元素 max 建立乙個長度為max+1 的新陣列,然後再次掃瞄原陣列,遇到幾就給新陣列的第幾位置上 1 ,如遇到 5 就給新陣列的第六個元素置 1 ,這樣下次再遇到 5 想置位時發現新陣列的第六個元素已經是 1了,這說明這次的資料肯定和以前的資料存在著重複。這種給新陣列初始化時置零其後置一的做法類似於位圖的處理方法故稱位圖法。它的運算次數最壞的情況為 2n。如果已知陣列的最大值即能事先給新陣列定長的話效率還能提高一倍。

8、怎麼在海量資料中找出重複次數最多的乙個?9、上千萬或上億資料(有重複),統計其中出現次數最多的錢 n 個資料。

方案 1 :上千萬或上億的資料,現在的機器的記憶體應該能存下。所以考慮採用 hash_map/搜尋二叉樹/紅黑樹等來進行統計次數。然後就是取出前 n 個出現次數最多的資料了,可以用第 2 題提到的堆機制完成。

10、乙個文字檔案,大約有一萬行,每行乙個詞,要求統計出其中最頻繁出現的前 10 個詞,請給出思想,給出時間複雜度分析。

方案 1 :這題是考慮時間效率。用 trie 樹統計每個詞出現的次數,時間複雜度是 o(n*le)( le 表示單詞的平準長度)。然後是找出出現最頻繁的前 10 個詞,可以用堆來實現,前面的題中已經講到了,時間複雜度是 o(n*lg10)。所以總的時間複雜度,是 o(n*le)與 o(n*lg10)中較大的哪乙個。

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

方案 1 :在前面的題中,我們已經提到了,用乙個含 100 個元素的最小堆完成。複雜度為 o(100w*lg100)。

方案 2:採用快速排序的思想,每次分割之後只考慮比軸大的一部分,知道比軸大的一部分在比 100 多的時候,採用傳統排序演算法排序,取前 100 個。複雜度為 o(100w*100)。

方案 3:採用區域性淘汰法。選取前 100 個元素,並排序,記為序列 l。然後一次掃瞄剩餘的元素 x,與排好序的 100 個元素中最小的元素比,如果比這個最小的要大,那麼把這個最小的元素刪除,並把 x 利用插入排序的思想,插入到序列 l 中。依次迴圈,知道掃瞄了所有的元素。複雜度為 o(100w*100)。

海量資料處理

1 有一千萬條簡訊,有重複,以文字檔案的形式儲存,一行一條,有 重複。請用5分鐘時間,找出重複出現最多的前10條。方法1 可以用雜湊表的方法對1千萬條分成若干組進行邊掃瞄邊建雜湊表。第一次掃瞄,取首位元組,尾位元組,中間隨便兩位元組作為hash code,插入到hash table中。並記錄其位址和...

海量資料處理

給定a b兩個檔案,各存放50億個url,每個url各占用64位元組,記憶體限制是4g,如何找出a b檔案共同的url?答案 可以估計每個檔案的大小為5g 64 300g,遠大於4g。所以不可能將其完全載入到記憶體中處理。考慮採取分而治之的方法。遍歷檔案a,對每個url求取hash url 1000...

海量資料處理

分而治之 hash對映 hash統計 堆 快速 歸併排序 300萬個查詢字串中統計最熱門的10個查詢。針對此類典型的top k問題,採取的對策往往是 hashmap 堆。hash統計 先對這批海量資料預處理。具體方法是 維護乙個key為query字串,value為該query出現次數的hashtab...