查找与点重叠的所有区间

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一定要慎重选择。