Algorithm 给定一个有N个定义点的圆和圆外的一个点M,在N.O(LogN)集合中找到离M最近的点

Algorithm 给定一个有N个定义点的圆和圆外的一个点M,在N.O(LogN)集合中找到离M最近的点,algorithm,geometry,Algorithm,Geometry,我试图找到解决这个问题的办法。但是我没有成功。。谁能给我一个关于如何处理这个问题的提示吗 我要2对,每个2分。也就是说,我会做两个和弦。找出它们的垂直平分线。使用这些平分线,我将找出圆的中心 此外,我将给出圆的方程。找到点M和圆的交点。。。这应该是最近的点。但是,该点可能存在也可能不存在于N个点的集合中 谢谢 假设圆周长上的点“有序”(即按围绕圆中心的角度排序),可以使用基于角度的二进制搜索,该搜索应达到O(log(n))边界 计算从点M到圆心的角度A,O(1) 使用二进制搜索查找圆周上最大角度

我试图找到解决这个问题的办法。但是我没有成功。。谁能给我一个关于如何处理这个问题的提示吗

我要2对,每个2分。也就是说,我会做两个和弦。找出它们的垂直平分线。使用这些平分线,我将找出圆的中心

此外,我将给出圆的方程。找到点M和圆的交点。。。这应该是最近的点。但是,该点可能存在也可能不存在于N个点的集合中


谢谢

假设圆周长上的点“有序”(即按围绕圆中心的角度排序),可以使用基于角度的二进制搜索,该搜索应达到
O(log(n))
边界

  • 计算从点
    M
    到圆心的角度
    A
    O(1)
  • 使用二进制搜索查找圆周上最大角度小于
    A
    -
    O(对数(n))
    的点
    I
  • 因为圆是凸的,所以距离
    M
    最近的点是
    I
    I+1
    。计算到两者的距离,取最小值-
    O(1)

    为了找到最接近M的点,我们需要基于平面切割进行点的二进制消去。需要对输入点进行一些预处理,然后我们可以在O(lgn)时间内找到最接近任何给定点M的点

  • 计算(如果未给出)以(r,θ)格式表示的点的极坐标,其中r是距离中心的距离,θ是距离x轴的角度,范围为(-180180)
  • 按与x轴成角度的递增顺序对所有N个点进行排序
  • 请注意,对最靠近M的点进行简单的二进制搜索在这里不起作用,例如

    • 如果对给定点进行排序,使θ=(-130,-100,-90,-23,-15,0,2,14170),则对于θ=-170的点M,二进制搜索将给出-130(40度)作为最接近点,而170(20度)是最接近点
    • 如果我们在排序时忽略符号(认为它将产生正确的输出),我们新的排序数组将看起来像θ=(0,2,14,15,23,90100130170),对θ=-6的点M进行二进制搜索将得到结果应该是2或14,而在这种情况下,0是距离M最近的点
    要使用平面切割执行搜索操作

    • 找到穿过圆心并垂直于圆心与点M连接线的平面切割线
    • 消除圆平面[90+θ,-90+θ)或[-90+θ,90+θ)的一半,具体取决于平面M的一半所在的位置
    • 使平行于第一个切面的平面切口穿过前一个平面的中间点,并消除在远离M的平面的一半的所有点,直到在较近的平面的一半没有留下点,在这种情况下消除平面的近一半。
    • 继续切割平面,直到剩下一个点。该点是距离M最近的点。整个操作需要O(lgn)步


    如果数据倾斜且在圆中分布不均匀,我们可以优化平面切割,使每个切割穿过中间带(基于角度)搜索操作中剩下的几点。

    这似乎是一个略微开放的问题。候选人可能会问一两个问题。那么你想到了什么?因为日志(N)需要的是,我感觉到,在一个比较中,我应该能够减少至少一半的分数。否则,我就无法接近这个问题的答案。提示:考虑一行上的n个点,以及一个点m,也在行上。有一个log(n)吗?解决方案?我可以尝试二进制搜索。但我似乎不知道如何在这里应用它。:(我明白了。我之前以为我有一个反例。对不起。首先不是需要O(n log n)才能将数据按θ排序吗?(可能这个问题有误导性,我们实际上被允许将其视为一次性成本,可以在多个点上摊销。)@GarethRees:是的,如果点最初是无序的,您必须对它们进行排序(这将是
    O(nlog(n))
    ).我认为这些观点是按顺序给出的。因为这是一个面试问题,我想你可能会在当时与他们讨论这些想法。。。