大資料排序問題

2021-07-29 14:36:17 字數 1041 閱讀 7817

問題1:從100億個資料中找出前100個資料

分析:由於只要找出前100個資料,可以採用堆來進行處理。堆特別適合的場景是從海量資料中找出前m個最大值或最小值,當m不大的時候效率很高。

步驟:1.讀取前100個資料,建立最小堆(最小堆的作用是方便找出目前最大的100個資料中的最小值,把待比較的資料與這個最小值比較就好。由於一次性只讀取100個資料,不需要一次性讀完所有資料,降低對記憶體的要求)

2.對餘下資料依次進行讀取,分別與堆中最小資料進行比較。若當前資料小於堆中最小資料,說明當前資料在前100個以外,即捨棄。若當前資料大於堆中最小資料,則從堆中pop出最小資料,向堆中插入當前資料,並調整堆。

3.最後剩下的100個堆中元素即為所求。

問題2:從100億個資料中找出前1億個資料

分析:這個問題和上個問題有所不同。假如還用最小堆法,那麼維護乙個一億資料量的堆是非常不高效的,而且堆的空間會很大,占用非常多的記憶體。可以考慮一下幾種方法。

1.位圖法(假如每個資料最多重複一次)

首先對記憶體占用進行分析,假如說每個資料不大於100億,而且最多重複一次,那麼我們一共需要100億位。

1byte = 8bit(位)

1024byte = 8*1024 = 1k

1m = 1024k = 8*1024*1024 = 8388608bit

那麼100億位就是100*10^8/8388608 = 1187m,大約需要1g多的空間。

2.快排中的partition方法

因為是尋找前k大個數,只要找到分割整個資料的第k個資料就好。

//快速排序的劃分函式

int partition(int v, int left, int right)

v[left] = v[pivotpos];

v[pivotpos] = pivot;

return pivotpos;

}//線性尋找第k大的數

int select(int v, int left, int right, int k)

大資料排序問題

程式描述 1 海量資料,記憶體不足,需要將檔案分割成多個檔案,從磁碟讀入 2 將每個小檔案排好序 3 歸併每個排好序的檔案,合成乙個檔案。include include qsort include include include using namespace std int sort num 10...

大資料的排序問題

楔子 問題 假設乙個檔案中有9億條不重複的9位整數,現在要求對這個檔案進行排序。一般解題思路 1 將資料匯入到記憶體中 2 將資料進行排序 比如插入排序 快速排序 3 將排序好的資料存入檔案 難題 乙個整數為4個位元組即使使用陣列也需要900,000,000 4byte 3.4g記憶體對於32位系統...

大資料排序

大資料開發工程師的一道經典面試題 如果待排序資料具有某些特點,往往能夠有更加有效的方法解決。同時,這種思想也更加貼近大資料應用的思維方式。對於大資料問題,分而治之的思想十分普遍。同時分布式計算 平行計算等也都類似。包括hadoop採用的map reduce模型,分而治之的思想都貫穿其中。以時間為基準...