最近點對問題(暴力,分治)

2022-09-09 00:36:23 字數 1461 閱讀 1033

給你n個點,讓你求出最近的兩個點的距離。

第一行輸入乙個整數n,接下來n行,每行兩個數,表示點的橫縱座標。

測試樣例:

12-1 3

-2 -2

1 -4

2 11 5

3 33 0

5 17 3

7 65 6

3 7輸出結果:

1.41421

solve方法

暴力法:理所當然,就是遍歷所有的點,求出所有可能的結果,取最小值。

時間複雜度:o(n^2)

/*

最近點對問題------暴力法

*/#include#include#includeusing namespace std;

const int maxn = 1e5 + 5;

struct nodea[maxn];

void solve(int n)}}

cout << "最近點對為點" << p1 << "和點" << p2 << endl;

cout << "最近點對的距離為" << sqrt(min_dis) << endl;

}int main()

分治法:用分治法解決最近點對問題,很自然的想法就是將這個集合分成兩個子集s1和s2,每個子集中有n/2個點,然後在每個子集中遞迴求其最近點對。

當然,在這過程中要注意一種特殊情況,就是在求完每個子集的最近點對合併的時候,從在乙個漏洞,那就是中軸線兩邊的點還沒有考慮(這個圖中表現為p3和q3),此時還需在求一下中軸線兩端最近點對的情況。

最近點對問題------分治法

*/#include#include#include#includeusing namespace std;

const int maxn = 1e5 + 5;

struct nodep[maxn], q[maxn];

bool cmp(node a, node b)

bool cmp1(node a, node b)

double solve_dis(node a, node b)

double solve(node p, int l, int r)

sort(q, q + t, cmp1);

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

}return res;

}int main()

分治 最近點對問題

利用分治方法的經典問題 最近點對問題 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個點中,找出最近的一對點,就是最近點對問題。如下 include include include using namespace std 頂點座標 typedef struct point 操作頂點座標 typedef struct tpoint double d 10e6...