我目前正致力于在C ++中实现最接近的点算法。也就是说,给定点(x,y)列表找到具有最小欧几里德距离的点对。我已经对此进行了研究,我对算法的理解如下(如果我错了,请纠正我):
将点阵列分开到中间 递归地找到左半部和右半部的最小距离的点对。 按y坐标对左右两半进行排序,并将左侧的每个点与右侧的6个最近邻点(通过y坐标)进行比较。这背后有一些理论上的东西,但这是我对需要做什么的理解。
我已经让算法的递归部分起作用,但我正在努力寻找一种有效的方法来找到左边每个点右边的6个最近邻居。换句话说,给定两个排序的数组,我需要在数组B中为数组A中的每个点找到6个最接近的数字。我假设这里需要类似于合并排序的东西,但是无法弄明白。任何帮助将不胜感激。
答案 0 :(得分:3)
听起来像是想要quad tree。
答案 1 :(得分:2)
让dist = min(dist_L, dist_R)
dist_L, dist_R
分别是左右两组中的最小距离。
现在要找到一个点位于左半部分而另一个点位于右半部分的最小距离,您只需要考虑其x坐标位于[x_m - dist, x_m+dist]
区间内的点。
现在的想法是考虑这个区间中最近的6个点。因此,按每个点的y坐标对点进行排序,期待下一个6.这将导致O(nlog^2(n))
运行时间。
您可以通过加快排序过程来进一步改进O(nlogn)
。为此,每次递归调用都会返回一个已排序的点列表。然后,要对整个列表进行排序,您只需合并两个排序列表即可。细心的读者会注意到这恰恰是合并排序。