【发布时间】:2017-11-18 23:33:43
【问题描述】:
我有一组成对的数字,需要有效地找到包含给定值的成对集合。
给定以下数字对的表示形式
public class Line
{
public double Start { get; set; } //is always < end
public double End { get; set; }
}
垂直的红线是相交标准(只是一个简单的数字,比如 10.123)
我正在寻找一种有效的算法,该算法仅返回与红色相交的黑线,假设搜索执行的频率大于 Line 添加到集合的频率。 (显然假设集合很大)
到目前为止,我的最佳解决方案是
- 在创建到两个排序列表时插入行。一个排序在
Start,另一个排序在End - 对起始有序列表进行二分搜索,以查找起始大于交集条件的第一行的索引。 (理论上,包括该索引和该索引之后的所有线都不相交)
- 对最终有序列表重复 (2) 中的类似逻辑
- 比较索引并选择剩余迭代次数最少的列表来解决
- 手动遍历所选列表的其余部分以查找交叉点
【问题讨论】:
-
lines.Where(l => l.Start <= criteria && l.End >= criteria)会不会太低效?还是我过于简单化了? -
这需要点击集合中的每个项目。
-
根据有多少范围,将范围划分为范围桶(一个范围可以在多个范围桶中)可能会导致比二分查找更少的比较,并且可能更容易并行化跨度>
-
也许你想要Interval tree?
-
@dbc Ahh Interval Tree 完美地描述了我的确切问题,谢谢。我会找到一些实现并运行一些性能测试。它肯定比我的滚动解决方案更快。作为答案发布,我会接受。