在单位圆的轮廓上给出n个点,我想计算最接近的2个点。
点数没有排序,我需要在O(n)中进行(所以我不能顺时针排序......)
我曾经知道解决方案,但忘记了......解决方案包括散列,并将圆圈分成n个或更多个切片。
如果您发现算法只计算距离,而不是特定点,那就足够了..
答案 0 :(得分:2)
这是一个solution that purports to be O(n log log n),用于查找一条线上最近的一对点。这是对你的问题的一个微不足道的转变 - 每一点 单位圆上的(x,y)映射到线段[0,2pi]中的线性坐标x', 其中x'= atan2(y,x)。一旦你将它转换为一维问题,这个想法就是 大致开始将x'坐标散列到桶中,重新划分大桶 较小的桶,直到每桶最多一个点,然后遍历列表 并找到最近的一对。 (你还有一张额外的支票,看看是否有 最小和最大x'坐标的点形成比线性更接近的对 最小。)
答案 1 :(得分:0)
通过将它们放入箱子(binsort,O(n)
)按角度对它们进行排序;选择与点数相同的多个箱柜。然后走过去找到最近的一对,如果有多个点落入垃圾箱内,则在垃圾箱内重复该过程。