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

时间:2016-02-25 02:20:59

标签: algorithm divide-and-conquer closest-points

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

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

我知道在3d情况下我需要将每个点与只有15个点进行比较。

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

我在这里缺少什么?

1 个答案:

答案 0 :(得分:0)

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

考虑到以下想法,我认为更快的解决方案是平均情况下的O(N):

如果将空间分成两半(比如通过某个轴对齐的平面),则得到的点分为两个子集A和B,两个最近的点可以都是A,B都是B或A中的一个B中有一个。

所以,你必须创建一对3d盒子的队列,按它们之间的最小距离排序然后:

1)从队列中选择第一对框

2)如果两个方框都是相同的方框A,则在两个方框B和C中将它分成两半,然后将对(B,B),(C,C)和(B,C)推入队列。 / p>

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

4)重复。

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

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