最近點對問題 遞迴,分治

2021-06-29 15:15:58 字數 1616 閱讀 2641

問題描述:

在二維平面上的n個點中,找出最近的一對點,就是最近點對問題。

**如下:

#include #include #include using namespace std;

/*--------------頂點座標*/

typedef struct point;

/*--------------操作頂點座標*/

typedef struct tpoint;

double d = 10e6; //----初始化距離

/*--------------按x排序*/

int cmpx(point a , point b)

/*-------------按y排序*/

int cmpy(tpoint a , tpoint b)

/*-----------計算兩個頂點的距離*/

double distance(double ax , double ay , double bx , double by)

/*-----------求解最短距離的工作過程函式*/

void closest(point x , tpoint *y , int l , int r)

if(r-l == 2)

/*----------多於3個頂點*/

tpoint *sl = new tpoint[(r-l)/2+6];

tpoint *sr = new tpoint[(r-l)/2+6];

int m = (r-l)/2+l;//------------從中間分開

int j = 0 , k = 0;

for(int i = 0 ; i <= r-l ; i++)

closest(x , sl , l , m);//遞迴求解左邊

closest(x , sr , m+1 , r);//遞迴求解右邊

point *z = new point[r-l+6];

k = 0;

/*-------------找出 距離 m < d 的說有頂點*/

for(int i = 0 ; i <= r-l ; i++)

}/*-----------------頂點最短距離位於左右兩邊*/

for(int i = 0 ; i < k ; i++)

}delete sl;

delete sr;

delete z;

}/*-------初始化函式*/

bool cpair(point x , int n)

sort(y , y+n , cmpy);//---按 y排序

closest(x , y , 0 , n-1);

delete y;

return true;

}/*--------main()*/

int main()

{ int n;

cout

point x[n];

cout>x[i].y;

cpair(x , n);

cout<

分治 最近點對問題

利用分治方法的經典問題 最近點對問題 closest pair of points problem 問題描述 n個點在公共空間中,求出所有點對的歐幾里得距離最小的點對。問題分析 該題直觀的解決方法便是brute force 暴力求解 利用分治思想進行求解。首先分析題目,符合分治法的適用條件,規模越小...

分治 最近點對問題

最近點對問題 在平面內有點集 s s 包含 n 個點。已知每個點的座標 x,y 求最近的兩點之間的距離 n 2 如果存在重合的兩個點,最近距離記為0。列舉的方法時間複雜度是o n 2 通過分治可以將時間複雜度降為o nlog n 利用一條直線將平面上的所有點集 s 分成兩部分s1 s2,分別計算這兩...

平面最近點對問題 分治

在與聯盟的戰鬥中屢戰屢敗後,帝國撤退到了最後乙個據點。依靠其強大的防禦系統,帝國擊退了聯盟的六波猛烈進攻。經過幾天的苦思冥想,聯盟將軍亞瑟終於注意到帝國防禦系統唯一的弱點就是能源 該系統由n個核電站 能源,其中任何乙個被摧毀都會使防禦系統失效。將軍派出了n個 進入據點之中,打算對能源站展開一次突襲。...