查找与点重叠的所有区间
Finding All Intervals That Overlap a Point
考虑一维的大量浮点区间,
例如
[1.0, 2.5], 1.0 |---------------|2.5
[1.5, 3.6], 1.5|---------------------|3.6
.....
希望找到包含给定点的所有区间。例如给定 point = 1.2,算法应该 return 第一个区间,如果给定 point = 2.0,它应该 return 上例中的前两个区间。
在我处理的问题中,这个操作需要重复大量的时间间隔。因此,不需要强力搜索,性能是一个重要因素。
在搜索之后,我看到这个问题是在计算几何的上下文中使用区间跳跃列表解决的。我想知道是否有任何简单、高效的 C++ 实现可用。
编辑:为了更准确地说明问题,有 N 个区间,对于 M 个点,应该确定每个点包含哪些区间。 N 和 M 是大数,其中 M 大于 N。
建议使用CGAL range trees:
维基百科说 interval trees(一维范围树)可以 "efficiently find all intervals that overlap with any given interval or point"。
如果您的间隔分布允许,则可能值得考虑网格化方法:选择一些网格大小 s
并创建列表数组。每个 k
-th 列表枚举与 "cell" [k.s, (k+1).s[
.
重叠的间隔
然后查询相当于找到包含查询点的单元格(在 O(1)
中)并报告有效包含它的列表中的所有间隔(在 O(K)
中)。
预处理时间和存储都是 O(I.L+G)
,其中 I
是间隔数,L
是网格大小的平均间隔长度,G
网格单元总数。 s
一定要慎重选择。
考虑一维的大量浮点区间, 例如
[1.0, 2.5], 1.0 |---------------|2.5
[1.5, 3.6], 1.5|---------------------|3.6
.....
希望找到包含给定点的所有区间。例如给定 point = 1.2,算法应该 return 第一个区间,如果给定 point = 2.0,它应该 return 上例中的前两个区间。
在我处理的问题中,这个操作需要重复大量的时间间隔。因此,不需要强力搜索,性能是一个重要因素。
在搜索之后,我看到这个问题是在计算几何的上下文中使用区间跳跃列表解决的。我想知道是否有任何简单、高效的 C++ 实现可用。
编辑:为了更准确地说明问题,有 N 个区间,对于 M 个点,应该确定每个点包含哪些区间。 N 和 M 是大数,其中 M 大于 N。
建议使用CGAL range trees:
维基百科说 interval trees(一维范围树)可以 "efficiently find all intervals that overlap with any given interval or point"。
如果您的间隔分布允许,则可能值得考虑网格化方法:选择一些网格大小 s
并创建列表数组。每个 k
-th 列表枚举与 "cell" [k.s, (k+1).s[
.
然后查询相当于找到包含查询点的单元格(在 O(1)
中)并报告有效包含它的列表中的所有间隔(在 O(K)
中)。
预处理时间和存储都是 O(I.L+G)
,其中 I
是间隔数,L
是网格大小的平均间隔长度,G
网格单元总数。 s
一定要慎重选择。