nlogn的二维最接近点对问题(分治)

本文介绍了如何使用分治策略解决二维平面上n个点中找到最近点对的问题。首先按x坐标排序,将点分为两组,分别计算组内和组间最接近点对,取最小值作为整体解。通过递归处理,最终解决最小子问题,如仅两个或三个点的情况。给出的代码实现了这一算法,并给出了具体输入输出示例。
摘要由CSDN通过智能技术生成

题目:

在二维平面上的n个点中,快速的找出最近的一对点。

思路:

分治,把平面上所有点按照x从小到大排序,分成两个集合,分别求出两个集合内的最接近点对,然后是这两个集合之间的最接近点对,二者取最小值则是整个问题的最终解。通过不断地递归分治,最终的状态只可能是只有两个点或者是只有三个点求最接近点对,也就是该问题的最小子问题。关键是在两个集合中与集合之间最接近点对的比较,详见代码。

代码:

#include <bits/stdc++.h>

using namespace std;
const int maxn=1000;
struct node
{
    int x,y;
};
node p[maxn],c1,c2;
bool cmp(node a,node b)
{
    if(a.x==b.x)
        return a.y<b.y;
    return a.x<b.x;
}
double dis(node a,node b)
{
    return sqrt((a.x-b.x)*(a.x-
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值