【发布时间】:2015-02-20 22:39:12
【问题描述】:
考虑一大组一维的浮点区间, 例如
[1.0, 2.5], 1.0 |---------------|2.5
[1.5, 3.6], 1.5|---------------------|3.6
.....
希望找到包含给定点的所有区间。例如给定point = 1.2,算法应该返回第一个区间,如果给定point = 2.0,它应该返回上例中的前两个区间。
在我正在处理的问题中,这个操作需要在大量的时间间隔内重复大量的次数。因此,暴力搜索是不可取的,性能是一个重要因素。
在搜索之后,我发现这个问题是在计算几何的上下文中使用间隔跳过列表来解决的。我想知道是否有任何简单、高效的 C++ 实现可用。
编辑:为了更准确地了解问题,有 N 个区间,对于 M 个点,应该确定哪些区间包含每个点。 N 和 M 是大数,其中 M 大于 N。
【问题讨论】:
-
为什么要跳过列表?跳过列表用作将键映射到值的有效数据结构;你只是有一个搜索问题。我想你想要一个interval tree。
-
我看不到这里需要跳过列表的地方。测试一个点是否在一个区间中基本上是 2 次比较,所以如果你有 N 个区间,你将需要 2N 次比较。这将是一个简单的 O(N) 算法,并且由于您的平均 PC 每秒可以进行几百万次比较,您应该会在眨眼之间得到答案。
-
kuroi:如果你有索引数据结构,它比 O(N) 更快
-
当然可以,但是只有几千万或更多的匹配才合理,这很可能不需要。如果有很多区间,那么在实际搜索中,专门的数据结构构建成本可能不值得节省。
-
@SaniHuttunen:点数大于区间数。
标签: c++ computational-geometry intervals skip-lists