平面最近点对

一,平面最近点对问题:在给n个平面上的点,让你找到最近的一对点。暴力n*n做法肯定超时。我们考虑分治。1-n这个区间,我们可以先找到A=(1-mid)和B=(mid+1,n)这个区间的最小点对。并一直递归下去。现在主要的问题,在于如何对这两个区间进行合并操作。因为,也许最近点对是A区间一个点B区间一个点。我们可以继续考虑合并这两个区间,我们有必要把这两个区间所有的点都拿来比较一下吗...
摘要由CSDN通过智能技术生成

一,平面最近点对

问题:在给n个平面上的点,让你找到最近的一对点。

暴力n*n做法肯定超时。

我们考虑分治。

1-n这个区间,我们可以先找到A=(1-mid)和B=(mid+1,n)这个区间的最小点对。并一直递归下去。

现在主要的问题,在于如何对这两个区间进行合并操作。

因为,也许最近点对是A区间一个点B区间一个点。

我们可以继续考虑

合并这两个区间,我们有必要把这两个区间所有的点都拿来比较一下吗?

肯定是没有必要的。

假如当前所求的最小距离为minx,同时我们可以把a[mid]作为一个旗标。

A区间和B区间的点离旗标之间的距离如果大于minx。那我肯定就不用考虑了。

所以我们合并的时候要考虑的x范围是[a[mid] - minx,a[mid] + minx]。超过这个范围的x,距离一定会比minx大。

可是这样还不够,万一所考虑的区间很多点,那复杂度还是降不下来。

我们用考虑x的想法继续去考虑y。

对于一个点a的y来说,与点a的最近点b的y,一定不会离a的y差minx距离。

所以我们用这种方法可以把所考虑到的点降低到只有7个点。

为什么是7个点呢?

可看下面这篇证明:https://oi-wiki.org/geometry/nearest-points/

参考博客:https://www.cnblogs.com/kamimxr/p/11200473.html 大佬的图解很好懂了。

例题一:https://www.luogu.com.cn/problem/P1429

这题是裸题,可以做模板了。(逃,巨弱还是错了n次,痛

#include"stdio.h"
#include"string.h"
#include"vector"
#include"math.h"
#include"algorithm"
using namespace std;

typedef struct Node{
    double x,y;
    int id;
}Node;

int n;
Node node[200100];
Node tran[200100];
double minx = 1e20;

bool same(double a, double b) { /// 1e-5精度意义下的浮点数相等
    if(fabs(a-b) <= 1e-5) return true; return false;
}
int cmpx(Node a,Node 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值