我最近遇到了类似这样的问题
由它们的中心和半径给出的N个不相交(使它们不接触或交叉),即
center = (x_i, y_i), radius = r_i
。然后我们有Q查询,其中给出了一个点(x, y)
。对于每个查询,我们需要找出包含该给定点的圆的索引i
(如果没有圆,则为-1)。
约束大致为1 <= N <= 10^5
和1 <= Q <= 10^5
。因此可能需要O(Q * log(N))
。
除了直截了当的O(Q * N)
解决方案之外,我能想到的唯一更好的事情是将圆圈的最左边和最右边的点保持为数组中的间隔,然后进行二分查找以找出包含的间隔该点的x坐标,但不止一个间隔可能重叠,并且多个圆可能包含该点。所以我不确定这是否会起作用。
任何帮助都将受到高度赞赏。谢谢。
答案 0 :(得分:2)
这可以在N + 1维度中以nearest-neighbour query来解决。
想象一下3d中固定半径的一组球,这样它们与z = 0平面的交点就是你的圆圈集合。 (球可以相交,没关系)。现在落入圆圈的点必然更接近其相应球的中心而不是所有其他球的中心。
最近邻问题已得到充分研究。空间分区技术可以很好地处理现实生活中的数据,但最糟糕的情况并不是那么好。
编辑:由于查询指向固定平面 z = 0 ,因此该问题可视为具有非欧几里德距离函数的二维最近邻问题。从查询点到圆心的有效距离是
D =&amp; sqrt;(d 2 + R2 - r2)
其中 d 是实际距离, R 是球半径(所有球的conmon), r 是圆半径。< / p>
解决此问题的另一种方法是构建一组圆power diagram。功率图是平面细分。有一些方法可以有效地回答“给定点属于平面细分的哪个单元格”形式的查询,例如,使用Kirkpatrik's point location data structure。
这两种方法相似,如果不相同,因为在功率图中,点相对于圆的功率是距离公式中的D的平方(R = 0)。