演算法 基於分割槽最近點演算法的二維平面

2021-09-07 02:33:47 字數 3532 閱讀 5936

摘要:

網上有關於尋找最近點的分而治之的方法很多討論,但是,未完成的可執行**,本文所介紹的問題乙個完整的可執行**,

參考對於那些有興趣。

正文:

作為對照。我們也同一時候實現了近期點對的列舉解法,詳細的主函式例如以下:

#include#include#include "node.h"

void initlist(node* p)

//測試分治和暴力;

int main()

上述中的force()是列舉的實現,callmindist則是分治的實現。上述的initlist主要對採用的測試案例進行初始化。

#ifndef __node__

#define __node__

#define size 4

#define max 100000.0

typedef structnode;

//排序部分;

void mergex(node a, node b, int s, int m, int t);

void mergey(node a, node b, int s, int m, int t);

void mergesortx(node a, node b, int s, int t);

void mergesorty(node a, node b, int s, int t);

//utility;

void show(node* a, int size);

void initlist(node* list);

double dist(node* n1, node* n2);

//列舉部分;

double force(node* nodelist, int n);

//分治部分;

double combine(node* py, int n, double lx, double delta);

void copynode(node* dt, node* sr, int b, int n);

double mindist(node* px, node* py, int n);

double callmindist(node*p, int n);

#endif

列舉部分的**比較簡單。詳細看例如以下:

#include #include "node.h"

double dist(node* n1, node* n2)

double force(node* nodelist, int n) //n is number of elements

以下就是分治演算法的主體:

double mindist(node* px, node* py, int n)  //這裡n是number of elements呢?還是max of index?依據以下的空間申請,應該是number of elements.

int m=n/2;

double fx = px[m].x;

node* lx = (node*)malloc(m*sizeof(node));

node* ly = (node*)malloc(m*sizeof(node));

node* rx = (node*)malloc((n-m)*sizeof(node));

node* ry = (node*)malloc((n-m)*sizeof(node));

copynode(lx, px, 0, m-1); //對copy而言,這裡的m應該是index;

//show(lx, m); //show中的n是number of elements;

//printf("lx :%x\n", lx);

copynode(rx, px, m, n-1); //copy這邊是index;

//show(rx, n-m);

copynode(ly, py, 0, m-1);

//show(ly, m);

copynode(ry, py, m, n-1);

//show(ry, n-m);

double d1 = mindist(lx, ly, m); //m is number of elements;

double dr = mindist(rx, ry, n-m);

double delta = min(d1, dr);

double d = combine(py, n, fx, delta); //對combine而言,這裡的n是number of elements;

//printf("lx :%x\n", lx);

free(lx);

free(ly);

free(rx);

free(ry);

return min(delta, d);

}

通過dl = mindist(lx, ly, m)來完畢左半部分的計算;

dr = mindist(rx, ry, n-m)完畢右半部分的計算。

最後通過combine(py, n, fx, delta)將兩半部分的結果整合在一起。

這裡的關鍵之處在於combine函式:

double combine(node* py, int n, double lx, double delta)

}double min(double x, double y)

還有是通過歸併排序對點集中的點進行排序的過程:

void mergesortx(node a, node b, int s, int t)

else

}void mergesorty(node a, node b, int s, int t)

else

}void mergex(node* a, node* b, int s, int m, int t)

else

} while(i<=m)

while(j<=t)

//這裡須要將a中的資料又一次複製到b中;

for(int i=s; i<=t; i++)

}void mergey(node* a, node* b, int s, int m, int t)

else

} while(i<=m)

while(j<=t)

//這裡須要將a中的資料又一次複製到b中;

for(int i=s; i<=t; i++)

}

注意:上述的歸併排序函式寫得不好,不是必需用到a這個引數,全然能夠函式內部堆上分配區域性變數進行替換。另外**中反覆部分太多,應該能夠寫得更精簡一點。

結論:

針對**中的簡單測試案例。分治案例結果正常;該演算法的主要時間複雜度在於排序部分,複雜度為o(nlogn),的複雜性的版本號列舉o(n2)。

演算法 二維陣列

1.最長公共子串行 總結 就是在邊上加一圈零,比較相對應的字元,相等,值就等於左上角的值,不相等,值就去左邊和上邊的最大值。2.字串相似度 static int martix static string str1 dhongda static string str2 fehongda protect...

演算法 二維陣列

1.最長公共子串行 總結 就是在邊上加一圈零,比較相對應的字元,相等,值就等於左上角的值,不相等,值就去左邊和上邊的最大值。2.字串相似度 static int martix static string str1 dhongda static string str2 fehongda protect...

二維凸包演算法

部落格參考 謝謝 chao xun 把凸包寫的這麼詳細。關於凸包的問題的解決的最初思路是這樣的。1 找到乙個基準點 必須在凸邊上 2 以基準點做射線,然後將該射線向固定方向旋轉,直到接觸到乙個新的點。3 以 2 中找到的點作為新的基準點,作射線繼續朝著一開始的固定的方向旋轉 4 反覆重複2,3直到最...