百萬行級排序演算法比較與研究

2021-08-28 03:45:59 字數 3270 閱讀 3323

老闆最近給了我乙個空間資料壓縮包,壓縮包中包含10個檔案,每乙個檔案中包含id、x座標、y座標、元素

一、元素二五種標籤,每個大約包含四百萬條資料。老闆對我提出的要求是以乙個檔案的xy座標為準,找出其他九個檔案中與其最相近的座標,將相近座標的兩個元素複製到標準檔案中。idx

y元素一

元素二當時聽到這個要求是,腦海中立馬跳出乙個想法,將標準檔案的xy座標與比較檔案的所有xy座標進行求距離得到最小值就ok了嘛。想法很美好,結果很現實,寫了個matlab函式進行操作結果5個小時沒搞出來,這個演算法的時間複雜度為 0(

n2) 0(n

2),n為百萬級單位,在我的小破筆記本上短時間計算出來好比中國足球在世界盃拿冠軍。di

stan

ce=(

xi−x

j)2+

(yi−

yj)2

d is

tanc

e=(x

i−xj

)2+(

yi−y

j)2將標準檔案的乙個xy座標與相近檔案的所有xy座標進行距離計算是沒有必要的,只需要計算乙個範圍的資料即可,在此基礎上在進行下面演算法的調整能大幅度減少計算量。但又產生了乙個問題,如何進行排序,為此我下面**了內部排序的六種演算法。

for 依次遍歷標準檔案的每行資料

low = x - radius;

high = x + radius ;

使用二分法在相似檔案中尋找半徑內的座標

for 依次遍歷半徑內的座標

計算distance,尋找最小值,並進行移動。

endend;

這裡使用c++的clock()函式測試程式執行時間,測試環境為centos linux 7,記憶體13.3gib,處理器intel® core™ i5-4300m cpu @ 2.60ghz × 4 ,測試數量為10w萬條,相關**如下:

#include//標頭檔案

clock_t start_time = clock(); //獲取程式執行時間點

clock_t end_time = clock(); //獲取程式結束時間點

cout

<< "sortinsertsort running time is :"

<<

static_cast

(end_time-start_time)/clocks_per_sec

<

<< endl; //計算執行時間

void direcinsertsort( )  //直接插入排序}}

}

執行結果:

void shellsort(double data,int len)}}

}}

執行結果:

void  ******selectsort(double data,int len)

}if(min != i) //如果第i小的資料不再座標i上,進行交換}}

執行結果:

void adjustheap(int i,int len,double data)  //調整函式

if(data[k] > temp)

else

break;

}data[i] = temp;

}void heapsort(double data,int len) //主函式

}

執行結果為:

void bubblesort(double data,int len)}}

}

執行結果:

void quicksort(double &data,int left,int right)

data[i] = key;

quicksort(data,left,j-1);

quicksort(data,i+1,right);

}

執行結果:

排序演算法

執行時間

快速排序

0.01s

堆排序0.02

簡單選擇排序

0.12

直接插入排序

0.15

希爾排序

0.32

氣泡排序

15.6

從圖表中我們得知快速排序法最適合用於排序,因為它的時間複雜度和空間複雜度都是最優的,下面我們編寫改進的演算法看看效果。

int binarysearch(int data,int low,int high,int target)

return -1;

}

仔細考慮了一下,二分法只能找到模糊的界線,不適用與精確的要求,實際還是依次判斷座標是否在範圍內。

for 依次遍歷標準檔案的每行資料

for 從相似檔案上次開始的起始座標遍歷 因為已經排好序

if 標準x座標-相似x座標 > radius

continue;進入下一次迴圈

else

if 相似x座標-標準x座標 > radius

break;跳出此次迴圈

else

計算distance,記錄相似檔案起始座標,尋找最相近距離的座標,進行相關資料的替換

endend;

下面為核心**:

void getresult()

distance = pow(podu[i][1]- gouzao[j][1],2)+

pow(podu[i][2] - gouzao[j][2],2);

if(distance

< min_distance)}}

remem_label = 0 ;

podu[i][3] = gouzao[position][3];

podu[i][4] = gouzao[position][4];

min_distance = int_max; }}

執行結果:

經過上面的調整之後程式執行已經從7個小時降到了不足15分鐘,優化的大多也是減去了不必要的運算,所以在程式設計序之前認真分析資料和思考相關演算法是十分重要的。

基本排序演算法比較與選擇

前幾天應乙個朋友的要求,幫他完成了資料排序的乙個作業。覺得很有給大家參考的價值,所以經過他同意,作了些修改帖了上來。源 見附件,中實現了8種排序演算法,各演算法名稱見下表或見原始碼。執行程式時,將需要你輸入一數值,以確定對多少隨機數進行排序。然後將會顯示各排序演算法的耗時。並且你可選擇時否進行正序和...

基本排序演算法比較與選擇

from 通過實驗我們可將結果列入下表。以下是vc6.0 release win2000pro 128mddr p4 1.6g 因為在多工作業系統下,系統將進行程序式排程,影響實驗結果。以下是經過稍微修正過的值。如果要取得更準確的值,我們得多次實驗求其平均值。排序演算法實驗比較 單位 秒 n 方法 ...

基本排序演算法比較與選擇

演算法與結果聯合分析 氣泡排序 在最優情況下只需要經過n 1次比較即可得出結果,這個最優情況那就是序列己是正序,從100k的正序結果可以看出結果正是如此 但在最壞情況下,即倒序 或乙個較小值在最後 下沉演算法將需要n n 1 2次比較。所以一般情況下,特別是在逆序時,它很不理想。它是對資料有序性非常...