C++求平面最近点对

引入

题目很好理解:给你N个点,求其中距离最近的一对点(之间的距离)。

很显然可以枚举,时间复杂度 Θ(N2)

如果数据强一点(N=100000什么的),显然枚举直接挂掉,那么要怎么办呢?
这里就要用到分治(当然是二分)了,时间复杂度 Θ(Nlog2N)

Ps.以前几乎没做过分治,一来就碰到求最近点对这种题,我当时也看了1小时的题解才大概明白,当然我相信这篇博客一定能让你明白的~

算法

怎么分

首先,我们随便来几个点:

然后,将他们按x坐标排个序,方便找x坐标在中间的点,即编号为N/2的点。否则,例如上图,编号N/2(即3)的点根本不在中间。
排序过后编号所对应的点就不同了,也可以理解为点的编号不同了,即:

这样一来,想找x坐标中间的点就是N/2了(虽然不能整除,但没有问题)。
然后就可以直接由编号在中间的点二分了:

在S1里面重复上述的操作(排序就不用了),直到只有1个点时,返回极大值(点对不可能只有一个点),有两个点时,返回这两点的距离,很好理解。
然后再在S2里重复一次。
(这里的分治有递归的思想,实在无法理解的小伙伴自己多想想吧~我也没有什么办法讲得更详细了……)

怎么合

在得到S1和S2的答案后(当你递归到S1只有1个或2个点,S2也只有1个或2个点时,就需要从S1和S2的答案得到整体的答案了),首先想到:答案有可能是 min(AnsS1,AnsS2) ,这样就是算左右区间中更小的答案。

但是,这只是ans中的两个点都在一侧(S1或S2)的情况,但是ans有可能一个点在S1中,一个点在S2,这就是这道题最最最恶心的一个地方了

Ps.接下来的一切极其烧脑,做好准备吧骚年

d=min(AnsS1,AnsS2) ,则距离有可能小于d的两个点P1,P2只有可能在下图中的黑色直线之间:
图1
那我就要问(当时这个问题我想了好久,真的不明白)了:为什么不是在这个黑色直线之间呢?
图2
事实上,P1和P2两个点可以是这样的:
图3
显然P1和P2的距离是小于d的,但P1并不在图2的范围内

好了,所以还需要把x坐标在 midxd midx+d 的点给挑出来。

然后怎么办?一个一个地枚举吗?还是不行,这样最坏的情况下可能会枚举到 (N2)2 个点(这个你可以不用知道为什么,只需要知道这样很耗时就行了)

所以我们还需要优化一下,网上很多人说,对于点P1,和它的距离小于d的最多只有6个点,但我完全不懂,所以这里就不这样了。我们可以用这一条优化:先将之前说的范围中的点挑出来后,按y坐标从小到大排序,然后两个循环枚举,但是,对于第二个点j,只要从第一个点i+1开始枚举即可。然后,当点j与点i的距离大于了d时,就不用再枚举j了(再枚举j的y坐标只会更大,与i的距离也会更大)。

算法就是这样了。

代码

【分治】【二分】POJ 3714 Raid

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 平面的距离是指从平面上的最短距离。在三维空间中,可以通过以下公式来P(x,y,z)到平面Ax+By+Cz+D=0的距离: d = |Ax + By + Cz + D| / √(A² + B² + C²) 其中,“| |”表示绝对值符号,“√”表示平方根符号。 具体来说,首先需要平面的法向量N(A,B,C),然后用P到平面上任意一Q的向量PQ与法向量N的积作为分子,再出N的模长作为分母即可。 需要注意的是,如果P在平面上,则平面的距离为0;如果法向量N为零向量,则平面不存在,无法计算平面的距离。此外,如果平面方程不是标准式,比如写成一般式或法式,需要先转化为标准式才能应用上述公式。 ### 回答2: 平面的距离是指从该向垂直于平面的方向所作的线段的长度,这一长度可以用向量的内积和模长得。 假设的坐标为P(x1,y1,z1),平面的方程为Ax+By+Cz+D = 0。首先,将平面的方程变形为法向量N=(A, B, C)和O(任意一,假设坐标为(x0,y0,z0))的内积形式,如下所示: N·(P-O) + D = 0 其中·表示向量的内积。 那么P到平面的距离h可以表示为: h = |N·(P-O)| / |N| 其中|N|表示向量N的长度。因此,我们只需要得向量N的长度和向量N·(P-O)的长度,就可以P到平面的距离h。 具体计算过程如下: 1. 向量N的长度 |N| = sqrt(A^2 + B^2 + C^2) 2. 向量N·(P-O)的长度 N·(P-O) = N·P - N·O = Ax1 + By1 + Cz1 - (Ax0 + By0 + Cz0) 3. 由上述公式计算P到平面的距离h h = |N·(P-O)| / |N| 需要注意的是,当向量N为单位向量时,上式中的分母|N|可以省略,计算起来会更加简便。 以上就是平面的距离的计算方法。这一方法可以用于各种情况下,比如在三维空间中研究平面的关系,解问题时可以根据具体需要灵活应用。 ### 回答3: 首先,我们需要明确平面的概念。 几何中没有大小、无限小的一个对象,在空间中被表示为一组坐标。 平面是指没有厚度的无限大平面,可以用两个垂直的轴表示,在三维空间中是一个二维的图形。 平面之间的距离,指的是平面最近的距离。计算平面的距离的方法如下: 假设的坐标为P(x1,y1,z1),平面的方程为Ax+By+Cz+D=0。 - 平面内一Q的坐标:假设平面上垂直于z轴的直线与该平面的交为Q,则Q的坐标为(x1,y1,-(A*x1+B*y1+D)/C)。 - 出向量PQ:向量PQ的坐标为(PQx,PQy,PQz),其中PQx=x1-x2、PQy=y1-y2、PQz=z1-z2。 - 平面的法向量:平面的法向量为N(A,B,C)。 - 计算平面的距离:平面的距离为其在法向量方向上的分量,即平面的距离d=|PQ·N|/|N|。 其中,|PQ·N|表示向量PQ与平面法向量N的积,|N|表示平面法向量N的模长。 举个例子,在三维空间中,P(2,3,4)到平面2x+3y+4z-5=0的距离该如何解呢? 首先,按照上述方法,平面内一Q的坐标:Q(x1,y1,z1)= (2,3,(5-2*2-3*3)/4) = (2,3,-1/2)。 然后,出向量PQ: PQ=(PQx,PQy,PQz)=(2-2,3-3,4-(-1/2))=(0,0,9/2)。 接着,计算平面的法向量N=(2,3,4)。 最后,根据上述公式,P到平面的距离:d=|PQ·N|/|N|=|(0,0,9/2)·(2,3,4)|/sqrt(2^2+3^2+4^2)=9/sqrt(29/2)≈5.212。因此,P到平面2x+3y+4z-5=0的距离为约5.212。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值