【发布时间】:2025-12-01 21:20:09
【问题描述】:
我将使用 Scala 语法来问这个问题,即使这个问题确实与语言无关。
假设我有两个列表
val groundtruth:List[Range]
val testresult:List[Range]
我想找到testresult 中与groundtruth 中的某些元素重叠的所有元素。
我可以这样做:
def overlaps(x:Range,y:Range) = (x contains y.start) || (y contains x.start)
val result = testresult.filter{ tr => groundtruth.exists{gt => overlaps(gt,tr)}}
但这需要O(testresult.size * groundtruth.size) 的运行时间。
有没有更快的算法来计算这个结果,或者有什么数据结构可以让exists测试更高效?
附:该算法应该适用于使用如下表达式生成的groundtruth 和testresult。换句话说,不能保证列表中范围之间的关系,Ranges 的平均大小为 100 或更大。
(1 to 1000).map{x =>
val midPt = r.nextInt(100000);
((midPt - r.nextInt(100)) to (midPt + r.nextInt(100)));
}.toList
【问题讨论】:
标签: algorithm data-structures nlp overlapping-matches