需求:一種資料報中包括int, string, long, double 四種型別的陣列,陣列長度均為4096.(即4096行,每行有int, string, long, double四個資料)。對1000個隨機產生的資料報,按int列進行排序。將int列最小的4096個資料及其對應的其他資料儲存到乙個新的資料報中。要求不修改1000個資料報。
分析:由於需要排序的資料量巨大,我們選擇外排序演算法來處理這道題。用.txt檔案來表示需求中的資料報,利用歸併演算法生成已排好序的順串檔案,然後利用敗者樹演算法來進行排序。示例**先以10個資料報為例。
具體函式**:
#include
#include
#include
#include
#include
#include
using
namespace
std;
#define max_int 0x7fffffff
const
int kmaxsize = 4096;
const
int kmaxway = 10;
int buffer[kmaxsize]; //假設記憶體只能放4096個整型.
int heap_size;
struct run ;
int ls[kmaxway]; //敗者樹,ls[0]是最小值的位置,其餘是各敗者的位置
run *runs[kmaxway];
將vector轉換為arr陣列
template
//將vector轉化為arr
elemtype* vec2arr(vector
vec)
template
快排函式
void quicksort(elemtype a, int begin, int end) //將key賦值給i與j相遇的地方
a[i] = key;
quicksort(a, begin, i - 1); //兩側遞迴
quicksort(a, i + 1, end);
}}
構建以及調整敗者樹函式
void adjust(run **runs, int n, int s)
t /= 2;
}ls[0] = s;
}void createlosertree(run **rus, int n)
// 將順串檔案的資料讀到緩衝區中
for (int i = 0; i < num_of_runs; i++)
runs[i]->length = j;
runs[i]->idx = 0;
}createlosertree(runs, num_of_runs);
ofstream out(file_out);
int live_runs = num_of_runs;
while (live_runs > 0)
runs[ls[0]]->length = j;
runs[ls[0]]->idx = 0;
}if (runs[ls[0]]->length == 0)
adjust(runs, num_of_runs, ls[0]);
}}
生成10個排序好的順串檔案
map mapdata;
for(int i = 0;i < 10;i++)
vector
vec;
string temp;
while (getline(infile, temp))
vector
radius;
for (auto it = vec.begin(); it != vec.end(); it++)
if(pam > 1)
if(pam == 4)
pam++;
}}infile.close();
int *arr = new
int[4096];
arr = vec2arr(radius);
quicksort(arr,0,4096);
fstream file;
string bbl,fnl;
map::iterator iter;
bbl = to_string(static_cast
long>(i+1)); //將int轉化為string型別
fnl = bbl+".txt";
file.open(fnl,ios::out|ios::trunc);
for(int j = 0;j < 4096;j++)
filet.close();
int *arr = new
int[4096];
arr = vec2arr(radius);
fstream datafile; //定義檔案操作物件
datafile.open("result.txt",ios::out);
map::iterator iter;
for(int i = 0;i < 4096;i++) { //向result中寫入最小的4096個結果
iter = mapdata.find(arr[i]);
datafile<< i<<" "
2.敗者樹的建立以及調整
3.getline來以行為單位讀取txt中的i資料,並根據空格來讀取需要排序的int型資料,將其餘三列資料看做字串
4.map 根據key,value來補全排序後,int列資料後面的三列資料。
海量資料處理(4) 外排序演算法
外排序演算法是指能夠處理極大量資料的排序演算法。通常來說,外排序處理的資料不能一次裝入記憶體,只能放在硬碟上。通常採用排序 歸併的策略,將原本的大檔案,拆分為若干個小檔案,小檔案可以讀入記憶體中進行排序,然後使用歸併操作。因此,外排序通常分為兩個基本步驟 根據記憶體的大小,盡可能多的分批次的將資料 ...
海量資料排序演算法
題目 有100萬無序資料,要求從小到大排序。但是每次記憶體只能排序1萬條資料。1.因為每次只能處理1萬條資料,所以要分組處理,我們將100萬資料分成100組 2.因為每組資料都是無序的,所以我們使用平均時間複雜度較好的演算法。3.當我們分組排序完成後,我們要排序1萬條資料就會簡單很多了。我們一共要取...
如何使用hadoop對海量資料進行統計並排序
b color green size x large 不得不說,hadoop確實是處理海量離線資料的利器,當然,凡是乙個東西有優點必定也有缺點,hadoop的缺點也很多,比如對流式計算,實時計算,dag具有依賴關係的計算,支援都不友好,所以,由此誕生了很多新的分布式計算框架,storm,spark,...