一维二维最近点对问题及算法分析

前言

最近点对问题是分治法的典型应用案例,下面分别从一维和二维的角度给出了利用分治法求解最近点对的方法和代码,并且使用递归式和递归树的方法分析了时间复杂度。


一、一维最近点对问题

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),

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值