编程之美2.11——寻找最近点对(POJ 3714)

问题:给定平面上N个点的坐标,找出距离最近的两个点。解法:我们先对N个点的x坐标进行排序,排序我们使用最坏复杂度O(n*logn)的快速排序方法,在排序的过程中minDifferent会递归计算出左右两边的最小距离,再用其中的较小值minum得到以中位数点附近的带状区域[p[median+1].x-median, p[median].x+median],对带状区域的点按照y坐标
摘要由CSDN通过智能技术生成

问题:

给定平面上N个点的坐标,找出距离最近的两个点。


解法:

我们先对N个点的x坐标进行排序,排序我们使用最坏复杂度O(n*logn)的快速排序方法,在排序的过程中minDifferent会递归计算出左右两边的最小距离,再用其中的较小值minum得到以中位数点附近的带状区域[p[median+1].x-median, p[median].x+median],对带状区域的点按照y坐标排序,对带状区域的每个点只需计算最多7个点,就能得到所有可能小于minum的点对。

#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;

// 顶点信息
struct Point
{
	double m_x, m_y;
	Point():m_x(0.0),m_y(0.0) {}
	Point(double x, double y):m_x(x),m_y(y){}
	bool operator==(const Point& p) const 
	{return m_x==p.m_x && m_y==p.m_y;}
};

ostream& operator<<(ostream& os, const Point& p)
{
	return os << "(" << p.m_x << "," << p.m_y << ")";
}

// 插入排序
template<class T, class Pr>
void insert_sort(vector<T> &vec, int l, int r, Pr pred)
{
	int i, j;
	for (i=l+1; i<=r; i++)
	{
		T tmp = vec[i];
		for (j=i-1; j>=l && pred(tmp,vec[j]); j--) 
			vec[j+1]=vec[j];
		vec[j+1] = tmp;
	}
}

// 找到key所在的位置
template<class T>
int get_position(vector<T> &vec, int l, int r, T key)
{
	for (int i=l; i<=r; i++)
		if (key == vec[i])
			return i;
	return -1;
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值