c++实现分治法最近点对算法

最近点对的算法是分治法的典型代表,所求的是平面上一堆点,求所有点对的距离的最小值,如果用暴力方法,其复杂度高达O(n*n)显然,效果太差,分治法的思想是将平面上的点分成左右两半,分别求左右两半的最小距离,然后取一个最小值,当然,最近点对还可能会有这样的情况,即一个点在左半边,一个点在右半边,这里,并不需要用暴力的方法求解所有的左边的和右边的最近点对,而是通过数学的一些证明将分治的其余代价降到O(n),根据主定理和递推公式

T(n) = 2T(n/2)+O(n)所求,可知最终的算法时间复杂度为O(nlogn)



// 分治算法求最近点对
#include<iostream>
#include<algorithm>
#include<cmath>
#define MAX 100000
using namespace std;

struct point {
  double x, y;
}p[100005];

int a[100005];// 保存排序的索引

int cmpx(const point& a, const point& b) {
  return a.x < b.x;
}

int cmpy(int &a, int &b) {
  return p[a].y < p[b].y;
}

inline double min(double a, double b) {
	return a < b ? a : b;
}
inline double dist(const point& a, const point&
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值