【问题标题】:Given many circles and a point, how to find which circle contains that point给定许多圆和一个点,如何找到包含该点的圆
【发布时间】:2017-01-18 22:34:13
【问题描述】:

我最近遇到了一个类似这样的问题

有 N 个不相交的(这样它们不接触或相交的)圆,由它们的中心和半径给出,即center = (x_i, y_i), radius = r_i。然后我们有 Q 查询,其中给出了一个点 (x, y)。对于每个查询,我们需要找出包含给定点的圆的索引i(如果没有圆,则为-1)。
约束大致为1 <= N <= 10^51 <= Q <= 10^5。所以可能需要O(Q * log(N))

除了直截了当的O(Q * N) 解决方案之外,我能想到的唯一更好的方法是将圆圈的最左边和最右边的点作为间隔保留在数组中,然后进行二分搜索以找出包含 x 的间隔- 点的坐标,但多个区间可能重叠,并且多个圆可能包含该点。所以我不确定这是否会奏效。

任何帮助将不胜感激。谢谢。

【问题讨论】:

    标签: algorithm geometry binary-search


    【解决方案1】:

    这可以用 N+1 维的nearest-neighbour query 来解决。

    想象一组具有固定半径的 3d 球,它们与平面 z=0 的交点正是您的一组圆。 (球可能相交,没关系)。现在,落入一个圆的点必然比所有其他球的中心更靠近相应球的中心。

    最近邻问题得到了很好的研究。空间分区技术适用于现实生活中的数据,但最坏情况下的性能不是很好。

    编辑:由于查询点在固定平面z=0,所以问题可以看成是非欧几里得距离函数的二维最近邻问题。查询点到圆心的有效距离为

    D = &sqrt;(d2+R2 - r2)

    其中d是真实距离,R是球半径(所有球通用),r是圆半径。

    解决此问题的另一种方法是构建一组圆圈的power diagram。功率图是平面细分。有一些方法可以有效地回答“给定点属于平面细分的哪个单元格”形式的查询,例如,使用Kirkpatrik's point location data structure

    这两种方法是相似的,如果不等效的话,因为在幂图中,点相对于圆的幂是距离公式中 D 的平方(R=0)。

    【讨论】:

    • (我觉得提到 N+1-d 最近邻居很奇怪,你。)
    • @greybeard 为什么?这有什么奇怪的?这是我想出的第一个解决方案。也许它不太优雅或效率不高,但它很简单,可以使用现有的库。
    • (我觉得这并不奇怪。我想知道是什么让人们将它与 2D 功率图和点位置一起呈现。)
    • @greybeard 我不知道这两种解决方案的实际效率。可以想象,第一个表现更好。它也应该很容易实现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-18
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    相关资源
    最近更新 更多