摘要:
網上有關於尋找最近點的分而治之的方法很多討論,但是,未完成的可執行**,本文所介紹的問題乙個完整的可執行**,
參考對於那些有興趣。
正文:
作為對照。我們也同一時候實現了近期點對的列舉解法,詳細的主函式例如以下:
#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直到最...