海量資料處理 top K

2021-07-15 19:11:09 字數 1445 閱讀 9587

區域性淘汰法

用乙個容器儲存前 10000個數,然後將剩餘的所有數字一一與容器內的最小數字相比,如果所有後續的元素都比容器內的 1000個數還小,那麼容器內的這 10000個數就是最大的 10000個數。如果某一後續元素比容器內的最小數字大,則刪掉容器內最小元素,並將該元素插入容器,最後遍歷完這1億個數,得到的結果容器中儲存的數即為最終結果了。

容器可以用優先佇列,最小堆。

分治法

將1億個資料分成100份,每份100萬個資料,找出每份資料中最大的10000個,最後在剩下的100×10000個資料裡面找出最大的10000個。100萬個資料裡面查詢最大的10000個資料的方法可以用快速排序或者優先佇列或者最小堆維護。

hash法

如果這1億個數裡面有很多重複的數,先通過hash法,把這1億個數字去重複,這樣如果重複率很高的話,會減少很大的記憶體用量,從而縮小運算空間,然後通過分治法或最小堆查詢最大的10000個數。

單機+單核+足夠大記憶體

先用hashmap求出每個詞出現的頻率,然後求出頻率最大的10個詞。

單機+多核+足夠大記憶體

直接在記憶體中使用hash方法將資料劃分成c×n份,每個執行緒處理完當前任務後主動取下乙個繼續處理,直到所有資料處理完畢,最後由乙個執行緒進行歸併。

單機+單核+受限記憶體

將原資料檔案切割成乙個乙個小檔案,如採用hash(x)%m,將原檔案中的資料切割成m小檔案,如果小檔案仍大於記憶體大小,繼續採用hash的方法對資料檔案進行切割,直到每個小檔案小於記憶體大小,這樣每個檔案可放到記憶體中處理。

直接將資料均分到不同的機器上進行處理是無法得到正確的結果的。因為乙個資料可能被均分到不同的機器上,而另乙個則可能完全聚集到乙個機器上,同時還可能存在具有相同數目的資料。

類似的問題

(1)有10000000個記錄,這些查詢串的重複度比較高,如果除去重複後,不超過3000000個。乙個查詢串的重複度越高,說明查詢它的使用者越多,也就是越熱門。請統計最熱門的10個查詢串,要求使用的記憶體不能超過1gb。

(2)有10個檔案,每個檔案1gb,每個檔案的每一行存放的都是使用者的query,每個檔案的query都可能重複。按照query的頻度排序。

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

(4)提取某日訪問**次數最多的那個ip。

(5)10億個整數找出重複次數最多的100個整數。

(6)搜尋的輸入資訊是乙個字串,統計300萬條輸入資訊中最熱門的前10條,每次輸入的乙個字串為不超過255b,記憶體使用只有1gb。

(7)有1000萬個身份證號以及他們對應的資料,身份證號可能重複,找出出現次數最多的身份證號。

海量資料處理 (top K問題)

前兩天面試3面學長問我的這個問題 想說teg的3個面試學長都是好和藹,希望能完成最後一面,各方面原因造成我無比想去鵝場的心已經按捺不住了 這個問題還是建立最小堆比較好一些。先拿10000個數建堆,然後一次新增剩餘元素,如果大於堆頂的數 10000中最小的 將這個數替換堆頂,並調整結構使之仍然是乙個最...

海量資料處理(查重,topk)

求top k 對記憶體有限制的大資料處理 查重 就是在一組海量資料中,查詢重複的資料,一般的解題思路就是雜湊表 名稱特點 unordered set 單重集合,只存放key,不允許key重複 unordered multiset 多重集合,只存放key,允許key重複 unordered map 單...

海量資料處理演算法(top K問題)

有乙個1g大小的乙個檔案,裡面每一行是乙個詞,詞的大小不超過16位元組,記憶體限制大小是1m。返回頻數最高的100個詞。1.分治 順序讀檔案中,對於每個詞c,取hash c 2000,然後按照該值存到2000個小檔案中。這樣每個檔案大概是500k左右。如果其中的有的檔案超過了1m大小,還可以按照類似...