前言
最近点对问题是分治法的典型应用案例,下面分别从一维和二维的角度给出了利用分治法求解最近点对的方法和代码,并且使用递归式和递归树的方法分析了时间复杂度。
一、一维最近点对问题
1、问题提出及代码求解
先输入一组点的个数,再输入数轴上这组点的坐标(整数),输出这组点之中最近的两点的距离。

例:
输入 | 5 1 3 5 6 8 |
---|---|
输出 | 1 |
代码如下:
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6;
int A[N];//保存输入的数组
int closet_pot(int p, int q)
{
if(p == q)
return INFINITY;
if(p == q-1)
return A[q] - A[p];
int mid = (p+q)/2;
int a = closet_pot(p, mid);
int b = closet_pot(mid+1, q);
int Min = min(a, b);
Min = min(Min, A[mid+1] - A[mid]);
return Min;
}
int main()
{
int n;
cin>>n;
for(int i = 0; i < n; i++)
cin>>A[i];
sort(A, A+n);
cout<<closet_pot(0, n-1);
system("pause");
}
2、时间复杂度分析
按照分治法divide-conquer-merge的步骤分析,上述代码中的合并步骤:
Min = min(Min, A[mid+1] - A[mid]);
只有 O ( 1 ) O(1) O(1)的时间复杂度,我们可以写出下列的递归式:
T ( n ) = { O ( 1 ) , n = 1 2 T ( n 2 ) + O ( 1 ) , n > 1 T(n) = \begin{cases} O(1), & n=1 \\[2ex] 2T(\frac{n}{2}) + O(1), & n>1 \end{cases} T(n)=⎩⎨⎧O(1),2T(2n)+O(1),