Math 求O(n)中圆上最近两点的理论算法

Math 求O(n)中圆上最近两点的理论算法,math,computational-geometry,Math,Computational Geometry,给定单位圆轮廓上的n个点,我想计算最近的2个点 这些点没有排序,我需要在O(n)中进行排序(因此我无法顺时针排序…) 我曾经知道解决这个问题的方法,但是我忘了。。。解决方案包括散列,并将圆拆分为n个或多个切片 如果您找到了一种只计算距离而不计算特定点的算法,这就足够了。通过将它们放置在容器中按角度对它们进行排序(容器排序,O(n));选择与点数顺序相同的多个箱子。然后遍历并找到最近的一对,如果有多个点落在箱子中,则在箱子内重复该过程。以下是一个查找直线上最近的一对点的方法。这是您的问题的一个微不

给定单位圆轮廓上的n个点,我想计算最近的2个点

这些点没有排序,我需要在O(n)中进行排序(因此我无法顺时针排序…)

我曾经知道解决这个问题的方法,但是我忘了。。。解决方案包括散列,并将圆拆分为n个或多个切片


如果您找到了一种只计算距离而不计算特定点的算法,这就足够了。

通过将它们放置在容器中按角度对它们进行排序(容器排序,
O(n)
);选择与点数顺序相同的多个箱子。然后遍历并找到最近的一对,如果有多个点落在箱子中,则在箱子内重复该过程。

以下是一个查找直线上最近的一对点的方法。这是您的问题的一个微不足道的转换--每一点 单位圆上的(x,y)映射到直线段[0,2pi]中的线性坐标x', 其中x'=atan2(y,x)。一旦你将其转化为一维问题,这个想法就是 大致开始将x'坐标散列到bucket中,将大的bucket重新划分到 更小的桶,直到每个桶最多有一个点,然后浏览列表 然后找到最接近的一对。(你还需要再做一次检查,看看 具有“最小”和“最大x”坐标的点形成比线性坐标更接近的一对
最小值。)

binsort是基于点是随机选取的假设,对吗?我不确定我是否可以这样假设,但我明天会问。@Oren-你的假设是正确的。我可以给你一组点,这些点之间的距离呈指数递减,你不会比
O(N log N)做得更好
我的建议与@Jim Lewis链接的建议相同;我不知道他们是如何得到
O(N log N)
;在随机情况下,你希望每个
O(N)
步骤检查的点数减少(e-2)/e(如果你选择#bins=#points(泊松分布特性)),几何级数是1/(1-e/(e-2))=(e-2)/2,这只是一个常数因子。我不完全理解O(n log n)的计算,但我相信你。无论如何,这不是O(n)解决方案。你能把我们看一个圆的事实变成一个优势而不是劣势吗?另一方面,如果有一个算法可以用O(n)来解决我的问题,那么我可以把任何“直线上最近的对问题”映射成半个圆,用O(n)而不是O(n log n)。。。