外排序演算法及相關場景

2021-08-20 09:07:34 字數 1422 閱讀 5817

外排序演算法的核心思路在於把檔案分塊讀到記憶體,在記憶體中對每塊檔案依次進行排序,最後合併排序後的各塊資料,依次按順序寫回檔案。外排序需要進行多次磁碟讀寫,因此執行效率往往低於內排序,時間主要花費於磁碟讀寫上。我們給出外排序的演算法步驟如下:

假設檔案需要分成k塊讀入,需要從小到大進行排序。

(1)依次讀入每個檔案塊,在記憶體中對當前檔案塊進行排序(應用恰當的內排序演算法)。此時,每塊檔案相當於乙個由小到大排列的有序佇列

(2)在記憶體中建立乙個最小值堆,讀入每塊檔案的佇列頭。

(3)彈出堆頂元素,如果元素來自第i塊,則從第i塊檔案中補充乙個元素到最小值堆。彈出的元素暫存至臨時陣列。

(4)當臨時陣列存滿時,將陣列寫至磁碟,並清空陣列內容。

(5)重複過程(3)、(4),直至所有檔案塊讀取完畢。

演算法思想:分而治之+hash

1.ip位址最多有2^32=4g種取值情況,所以不能完全載入到記憶體中處理;

2.可以考慮採用「分而治之」的思想,按照ip位址的hash(ip)24值,把海量ip日誌分別儲存到1024個小檔案中。這樣,每個小檔案最多包含4mb個ip位址;

3.對於每乙個小檔案,可以構建乙個ip為key,出現次數為value的hash map,同時記錄當前出現次數最多的那個ip位址;

4.可以得到1024個小檔案中的出現次數最多的ip,再依據常規的排序演算法得到總體上出現次數最多的ip;

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

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

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

②對每個小檔案,統計每個檔案中出現的詞以及相應的頻率(可以採用trie樹/hash_map等),並取出出現頻率最大的100個詞(可以用含100個結點的最小堆),並把100個詞及相應的頻率存入檔案,這樣又得到了5000個檔案。

③就是把這5000個檔案進行歸併(類似與歸併排序)的過程了(類似外排的實現)。

申請512m的記憶體,乙個bit位代表乙個unsigned int值。讀入40億個數,設定相應的bit位,讀入要查詢的數,檢視相應bit位是否為1,為1表示存在,為0表示不存在。

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

對海量資料進行外排序的演算法

需求 一種資料報中包括int,string,long,double 四種型別的陣列,陣列長度均為4096.即4096行,每行有int,string,long,double四個資料 對1000個隨機產生的資料報,按int列進行排序。將int列最小的4096個資料及其對應的其他資料儲存到乙個新的資料報中...

海量資料處理(4) 外排序演算法

外排序演算法是指能夠處理極大量資料的排序演算法。通常來說,外排序處理的資料不能一次裝入記憶體,只能放在硬碟上。通常採用排序 歸併的策略,將原本的大檔案,拆分為若干個小檔案,小檔案可以讀入記憶體中進行排序,然後使用歸併操作。因此,外排序通常分為兩個基本步驟 根據記憶體的大小,盡可能多的分批次的將資料 ...

git常見場景及相關命令

command git config global user.name x 輸入賬戶 command git config global user.email xx qq.com輸入郵箱 command git init初始化資料夾,使其成為git可以管理的倉庫 command git add.將資...