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

时间:2013-02-21 03:45:09

标签: algorithm geometry

http://www.glassdoor.com/Interview/Google-Interview-RVW2382108.htm

我试图找到解决这个问题的方法。但是我没有成功。任何人都可以给我一个关于如何处理这个问题的提示。

我将分别拿2对两分。也就是说,我将制作2个和弦。找出他们的垂直平分线。使用这些平分线,我会找到圆圈的中心......

而且,我会想出圆圈的等式。并找到点M与圆的交点......那应该是最近点。但是,该点在N点集合中可能存在也可能不存在

感谢。

2 个答案:

答案 0 :(得分:5)

假设圆周上的点是“按顺序”(即按圆圈中心的角度排序),您可以使用基于角度的二分搜索,它应该达到O(log(n))边界。

  1. 计算从A点到圆圈中心的角度M - O(1)
  2. 使用二分搜索在圆周上找到点I,其中最大角度小于A - O(log(n))
  3. 由于圆圈是凸的,因此M的最近点是II+1。计算两者的距离并取最小值 - O(1)

答案 1 :(得分:1)

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

  1. 计算(如果没有给出)(r,θ)格式的点的极坐标表示,其中r是距离中心的距离,θ是x轴在范围内的角度(-180,180)。
  2. 按x轴的角度递增顺序对所有N个点进行排序。
  3. 请注意,最接近M的点的简单二进制搜索在此处不起作用,例如

    • 如果给定的点被排序为θ=(-130,-100,-90,-23,-15,0,2,14,170),那么对于θ= -170的点M,二分搜索将给-130(40度远)作为最近点,而170(20度距离)是最接近M的点。
    • 如果我们在排序时忽略符号(认为它会产生正确的输出),我们的新排序数组将看起来像θ=(0,2,14,15,23,90,100,130,170),二进制搜索点M θ= -6将产生结果应为2或14,而0是在这种情况下最接近M的点。

    使用平面切割执行搜索操作

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

    planar elimination

    如果数据偏斜并且不均匀地分布在圆圈中,我们可以优化我们的平面切割,使得每个切割通过搜索操作中留下的那些点的中值(基于角度)。