http://www.glassdoor.com/Interview/Google-Interview-RVW2382108.htm
我试图找到解决这个问题的方法。但我没有成功..任何人都可以给我一个关于如何处理这个问题的提示。
我将每人取 2 对两分。也就是说,我会制作2个和弦。找出它们的垂直平分线。使用这些平分线,我会找出圆的中心......
此外,我将提出圆的方程。并找到点 M 与圆的交点......那应该是最近的点。但是,该点可能存在也可能不存在于 N 个点的集合中
谢谢。
http://www.glassdoor.com/Interview/Google-Interview-RVW2382108.htm
我试图找到解决这个问题的方法。但我没有成功..任何人都可以给我一个关于如何处理这个问题的提示。
我将每人取 2 对两分。也就是说,我会制作2个和弦。找出它们的垂直平分线。使用这些平分线,我会找出圆的中心......
此外,我将提出圆的方程。并找到点 M 与圆的交点......那应该是最近的点。但是,该点可能存在也可能不存在于 N 个点的集合中
谢谢。
假设圆的圆周上的点是“有序的”(即按围绕圆中心的角度排序),您可以使用基于角度的二分搜索,这应该可以实现O(log(n))
边界。
A
点M
到圆心的角度 - O(1)
。I
在圆周上找到最大角度小于A
-的点O(log(n))
。M
是I
或I+1
。计算两者的距离并取最小值 - O(1)
。 为了找到最接近 M 的点,我们需要基于平面切割对点进行二元消除。需要对输入点进行一点预处理,之后我们可以在 O(lgn) 时间内找到最接近任何给定点 M 的点。
请注意,最接近 M 的点的简单二进制搜索在这里不起作用,例如,
要使用平面切割执行搜索操作,
如果数据是倾斜的并且没有均匀地分布在圆圈中,我们可以优化我们的平面切割,使每个切割都通过搜索操作中留下的那些点的中值(基于角度)。