3+维度中最接近的一对(分而治之)

Don*_*ato 5 algorithm divide-and-conquer closest-points

我正在努力解决分裂和征服算法如何适用于大于2的维度,特别是如何在两个子问题之间找到最接近的点对.

我知道我只需要考虑轴上d两者之间距离的距离x.

我知道在3d情况下,我需要将每个点与仅15个其他点进行比较.

我不明白的是如何选择那15分.在第二种情况下,只需按值对值进行排序,y然后按顺序进行排序.但是,在3d情况下,需要将每个点y z轴上最接近它的15个点进行比较.我似乎无法找到一种方法来确定那些15点是什么样的,没有最坏的情况O(n^2)......

我在这里错过了什么?

sal*_*lva 0

一个简单的解决方案是创建一个包含所有点的八叉树或 kd 树,然后使用它来查找每个点的最近点。对于平均情况,即 O(N*log N)。

考虑到以下想法,可以实现平均情况下 O(N) 的更快解决方案:

如果将空间分成两半(例如通过某个轴对齐的平面),则会将点分为两个子集 A 和 B,并且两个最近的点可以都在 A 中,都在 B 中,或者一个在 A 中,一个在 A 中B.

因此,您必须创建一个 3d 框对的队列,按它们之间的最小距离排序,然后:

1)从队列中挑选第一对盒子

2)如果两个盒子都是同一个盒子A,则将其分成两半为两个盒子B和C,并将对(B,B),(C,C)和(B,C)推入队列。

3)如果不同(A,B),则将最大的(例如B)分成两半,获得框C和D,并将(A,C)和(A,D)对推入队列。

4)重复。

此外,当这对盒子内的点数低于某个阈值时,您可以使用强力来找到最近的点对。

一旦顶部对中的两个框之间的距离大于迄今为止找到的最小距离,搜索就会停止。

  • 该算法的名称是“它不存在”。可以证明,在最坏的情况下,针对最近对问题的最佳基于比较的算法不可能比 O(n*log(n)) 更快。 (4认同)