查找重叠点的所有间隔

时间:2015-02-20 22:39:13

标签: c++ computational-geometry intervals skip-lists

考虑一维的大量浮点间隔, 例如

 [1.0, 2.5],                1.0 |---------------|2.5

 [1.5, 3.6],                      1.5|---------------------|3.6

 .....

希望找到包含给定点的所有间隔。例如,给定点= 1.2,算法应该返回第一个间隔,如果给定点= 2.0,它应该返回上面示例中的前两个间隔。

在我正在处理的问题中,这个操作需要在很多时间间隔内重复很多次。因此,不需要进行蛮力搜索,性能是一个重要因素。

在搜索之后,我看到在计算几何的上下文中使用区间跳过列表解决了这个问题。我想知道是否有任何简单,有效的C ++实现。


编辑:为了更准确地解决问题,有N个区间,对于M个点,应该确定哪个区间包含每个点。 N和M是大数,其中M大于N.

2 个答案:

答案 0 :(得分:1)

建议使用CGAL range trees

维基百科说interval trees(1维范围树)可以有效地找到与任何给定间隔或点重叠的所有间隔"。

答案 1 :(得分:1)

如果您的间隔分布允许,可能值得考虑网格化方法:选择一些网格大小s并创建一个列表数组。每个k - 列表列举了与"单元格重叠的区间" [k.s, (k+1).s[

然后查询相当于查找包含查询点的单元格(在O(1)中)并报告列表中有效包含查询点的所有间隔(在O(K)中)。

预处理时间和存储都是O(I.L+G),其中I是间隔数,L是网格大小的平均间隔长度,G是总数网格单元格。必须谨慎选择s