質問は実際には言語に依存しませんが、Scala 構文を使用してこの質問をします。
2つのリストがあるとします
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テストをより効率的にできるデータ構造はありますか?
PSアルゴリズムは、次のような式で動作しgroundtruth、testresult生成されるはずです。つまり、リスト内の範囲間の関係について保証はなく、Rangeの平均サイズは 100 以上です。
(1 to 1000).map{x =>
val midPt = r.nextInt(100000);
((midPt - r.nextInt(100)) to (midPt + r.nextInt(100)));
}.toList