考虑一维的大量浮点间隔, 例如
[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.
答案 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
。