查找与点重叠的所有间隔

Finding All Intervals That Overlap a Point

本文关键字:重叠 查找      更新时间:2023-10-16

考虑一维中的一组大型浮点区间,例如

 [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。

建议使用CGAL范围树:

维基百科表示,区间树(一维范围树)可以"有效地找到与任何给定区间或点重叠的所有区间"。

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

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

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