我有一组配对数字,需要有效地找到包含给定值的一组数字。
给定以下数字对的表示
public class Line
{
public double Start { get; set; } //is always < end
public double End { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
垂直的红线是交集标准(只是一个简单的数字,如 10.123)
我正在寻找一种有效的算法,基于搜索执行频率大于向Line集合添加的频率的假设,该算法仅返回与红色相交的黑线。(显然假设集合很大)
到目前为止我的不太理想的解决方案是
Start,另一个按 排序End您的Line班级代表\xe2\x84\x9d中的一个区间。您有大量这样的间隔,并且希望在比线性时间更好的时间内找到与某个点重叠的间隔。
满足您的要求的一种可能的解决方案是区间树:
\n\nO(log n + m)时间,其中n是间隔总数,m是与找到的查询点重叠的数量。O(n log n).O(n)空间。Codeplex的示例实现(我尚未测试)。对于其他人,请参阅C# Interval 树类。
\n\n有关与相关结构线段树的比较,请参阅线段树、区间树、二叉索引树和范围树之间有什么区别?。
\n