我一直在关注 Coursera 的算法课程,并想出了一个关于最近配对问题的分/治算法的想法,我想澄清一下。
根据 Roughgarden 教授的算法(如果您有兴趣,可以在此处查看):对于给定的一组点 P,我们有两个副本 - 在 X 和 Y 方向上排序 - Px 和 Py,算法可以给出为
最接近对(Px,Py):
- 将点分成左半部分 - Q 和右半部分 - R,并沿 x 和 y 方向形成两半的排序副本 - Qx,Qy,Rx,Ry
- 让closestPair(Qx,Qy)为点p1和q1
- 设最接近对(Rx,Ry)为p2,q2
- 令 delta 为 dist(p1,q1) 和 dist(p2,q2) 的最小值
- 这是不幸的情况,让 p3,q3 成为最接近的SplitPair(Px,Py,delta)
- 返回最好的结果
现在,我想要的澄清与第 5 步有关。我应该事先说一下,我的建议几乎没有任何改进,但如果你仍然感兴趣,请继续阅读。
R 教授说,由于点已经在 X 和 Y 方向上排序,为了在步骤 5 中找到最佳对,我们需要迭代宽度为 2*delta 的条带中的点,从下到上,在内部循环我们只需要 7 个比较。这可以改善到只有一个吗?
我觉得怎么可能用纯文本解释起来有点困难,所以我画了一张图,写在纸上,然后上传到这里:
由于没有其他人想出是,我很确定我的思路有一些错误。但我现在已经想了好几个小时了,我只好发布这个。这就是我脑子里的一切。
有人可以指出我哪里出错了吗?