海量資料處理 分而治之

2021-07-02 20:42:54 字數 2909 閱讀 1416

對於海量資料而言,由於無法一次性裝進記憶體處理,導致我們不得不把海量的資料通過hash對映分割成相應的小塊資料,然後再針對各個小塊資料通過hash_map進行統計或其它操作。

那什麼是hash對映呢?簡單來說,就是為了便於計算機在有限的記憶體中處理big資料,我們通過一種對映雜湊的方式讓資料均勻分布在對應的記憶體位置(如大資料通過取餘的方式對映成小數存放在記憶體中,或大檔案對映成多個小檔案),而這個對映雜湊方式便是我們通常所說的hash函式,設計的好的hash函式能讓資料均勻分布而減少衝突。

換言之,先對映,而後統計,最後排序。

解法:具體分為以下3個步驟

2.hash_map統計

3.堆/快速排序

注:hash取模是一種等價對映,不會存在同乙個元素分散到不同小檔案中去的情況,即這裡採用的是%1000演算法,那麼同乙個ip在hash後,只可能落在同乙個檔案中,不可能被分散的。

2、尋找熱門查詢,300萬個查詢字串中統計最熱門的10個查詢

原題:搜尋引擎會通過日誌檔案把使用者每次檢索使用的所有檢索串都記錄下來,每個查詢串的長度為1-255位元組。假設目前有一千萬個記錄,請你統計最熱門的10個查詢串,要求使用的記憶體不能超過1g。

分析:這些查詢串的重複度比較高,雖然總數是1千萬,但如果除去重複後,不超過3百萬個。乙個查詢串的重複度越高,說明查詢它的使用者越多,也就是越熱門。

由上面第1題,我們知道,資料大則劃為小的,例如一億個ip求top 10,可先%1000將ip分到1000個小檔案中去,並保證一種ip只出現在乙個檔案中,再對每個小檔案中的ip進行hash_map統計並按數量排序,最後歸併或者最小堆依次處理每個小檔案的top10以得到最後的結果。

但對於本題,資料規模比較小,能一次性裝入記憶體。因為根據題目描述,雖然有一千萬個query,但是由於重複度比較高,故去除重複後,事實上只有300萬的query,每個query255byte,因此我們可以考慮把他們都放進記憶體中去(300萬個字串假設沒有重複,都是最大長度,那麼最多占用記憶體3m*1k/4=0.75g。所以可以將所有字串都存放在記憶體中進行處理)。

所以我們放棄分而治之/hash對映的步驟,直接上hash_map統計,然後排序。so,針對此類典型的top k問題,採取的對策往往是:hash_map + 堆。

解法:

2.堆排序

關於第2步堆排序,可以維護k個元素的最小堆,即用容量為k的最小堆儲存最先遍歷到的k個數,並假設它們即是最大的k個數,建堆費時o(k),並調整堆(費時o(logk))後,有k1>k2>...kmin(kmin設為小頂堆中最小元素)。繼續遍歷數列,每次遍歷乙個元素x,與堆頂元素比較,若x>kmin,則更新堆(x入堆,用時logk),否則不更新堆。這樣下來,總費時o(klogk+(n-k)logk)=o(n*logk)。此方法得益於在堆中,查詢等各項操作時間複雜度均為logk。

當然,你也可以採用trie樹,關鍵字域存該查詢串出現的次數,沒有出現為0。最後用10個元素的最小推來對出現頻率進行排序。

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

解法:2.hash_map統計

3.堆/歸併排序

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

解法一:

如果同乙個資料元素只出現在某一台機器中,那麼可以採取以下步驟統計出現次數top10的資料元素:

2.組合歸併

解法二:

但如果同乙個元素重複出現在不同的電腦中呢,比如拿兩台機器求top 2的情況來說:

第二台的資料分布及各自出現頻率為:a(0),b(0),c(49),d(49),e(50),f(50)

這個時候,你可以有兩種方法:

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

解法一:

2.hash_map統計

3.堆/快速/歸併排序

解法二:

一般query的總量是有限的,只是重複的次數比較多而已,可能對於所有的query,一次性就可以加入到記憶體了。這樣,我們就可以採用trie樹/hash_map等直接來統計每個query出現的次數,然後按出現次數做快速/堆/歸併排序就可以了。

解法三:

與解法1類似,但在做完hash,分成多個檔案後,可以交給多個檔案來處理,採用分布式的架構來處理(比如mapreduce),最後再進行合併。

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

解法:可以估計每個檔案安的大小為5g×64=320g,遠遠大於記憶體限制的4g。所以不可能將其完全載入到記憶體中處理。考慮採取分而治之的方法。

2.hash_set統計

7、100萬個數中找出最大的100個數

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

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

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

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

2、上千萬或上億資料(有重複),統計其中出現次數最多的前n個資料。

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

4、1000萬字串,其中有些是重複的,需要把重複的全部去掉,保留沒有重複的字串。請怎麼設計和實現?

5、乙個文字檔案,找出前10個經常出現的詞,但這次檔案比較長,說是上億行或十億行,總之無法一次讀入記憶體,問最優解。

海量資料處理 分而治之 hash對映和堆排序

對於海量資料而言,由於無法一次性裝進記憶體處理,導致我們不得不把海量的資料通過hash對映分割成相應的小塊資料,然後再針對各個小塊資料通過hash map進行統計或其它操作。什麼是hash對映?簡單來說,就是為了便於計算機在有限的記憶體中處理big資料,我們通過一種對映雜湊的方式讓資料均勻分布在對應...

海量資料處理

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...