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

Algorithm 3+中最近的一对点;维度(分而治之),algorithm,divide-and-conquer,closest-points,Algorithm,Divide And Conquer,Closest Points,我正在努力思考分而治之算法在大于2维的情况下是如何工作的,特别是如何在两个子问题之间找到最近的一对点 我知道,我只需要考虑在代码< x>代码>轴之间的两个部分之间的距离 d>代码> 我知道在3d的情况下,我只需要将每个点与其他15个点进行比较 我不明白的是如何选择这15点。在2d情况下,只需按yvalue对值进行排序,并按顺序进行处理。但是,在3d情况下,需要将每个点与y和z轴上最靠近它的15个点进行比较。我似乎找不到一种方法来确定这15点是什么,而这种方法不存在最坏的情况O(n^2) 我在这里

我正在努力思考分而治之算法在大于2维的情况下是如何工作的,特别是如何在两个子问题之间找到最近的一对点

我知道,我只需要考虑在代码< x>代码>轴之间的两个部分之间的距离<代码> d>代码> 我知道在3d的情况下,我只需要将每个点与其他15个点进行比较

我不明白的是如何选择这15点。在2d情况下,只需按
y
value对值进行排序,并按顺序进行处理。但是,在3d情况下,需要将每个点与
y
z
轴上最靠近它的15个点进行比较。我似乎找不到一种方法来确定这15点是什么,而这种方法不存在最坏的情况
O(n^2)


我在这里遗漏了什么?

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

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

如果你把空间分成两半(比如说通过一些轴对齐的平面),你会把点分成两个子集,A和B,最近的两个点可以都在A中,都在B中,或者一个在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)算法的名称是什么?该算法是否有任何参考链接?该算法的名称为“它不存在”。我们可以证明,在最坏的情况下,用于最近对问题的基于最佳比较的算法不能比O(n*log(n))快。