我将使用Scala语法来提出这个问题,即使问题实际上与语言无关。
假设我有两个列表
val groundtruth:List[Range]
val testresult:List[Range]
我想要找到所有与groundtruth
中的某个元素重叠的testresult
元素。
可以按照以下方法实现:
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
测试更有效?
P.S. 该算法应在使用以下表达式生成的 groundtruth
和 testresult
上工作。换句话说,对于列表中的范围之间的关系没有任何保证,Range
的平均大小为 100 或更大。
(1 to 1000).map{x =>
val midPt = r.nextInt(100000);
((midPt - r.nextInt(100)) to (midPt + r.nextInt(100)));
}.toList