最長の重複しないシーケンスを見つけるアルゴリズムに非常に似た質問があります。
リンクされた質問との唯一の違いは、最長シーケンスを表す重複しないタプルのセットを見つける代わりに、最大カバレッジを表す重複しないタプルのセットを見つける必要があることです。タプルの長さは最大です (タプルの長さは、次の文でタプルlast - first + 1
の定義が与えられています)。
リンクされた問題とは異なる方法でタプルを表現します。の代わりに(starting index, length)
、タプルを(first, last)
;として表します。たとえば、タプル(3,7)
は数値のセットを表します[3, 4, 5, 6, 7]
。(エンドポイントが一致していても、タプルは別のタプルとオーバーラップします。つまり、オーバー(2,6)
ラップ(6,8)
するため、ソリューションに両方を表示することはできません。)
例として、 でソートされた次のタプルのセットを考えてみましょうfirst
:
[(0,100), (2,50), (30,150), (60,95), (110,190), (120,150), (191,200)]
ここでの最大セットは[(0,100), (110,190), (191,200)]
、 のカバレッジになり101 + 81 + 10 = 192
ます。(このソリューションのタプルは重複していないことに注意してください。)
これを解決するための最も複雑でないアルゴリズムの例は何ですか?また、そのアルゴリズムの複雑さはどのくらいですか? (これが で解決できれば最高ですがO(N)
、それが可能かどうかは現時点ではわかりません。)
補遺:振り返ってみると、私がここで尋ねている質問は、重み付き間隔スケジューリング問題と同等であることがわかりました。これは、間隔スケジューリング問題の特殊なケースです。
以下の@j_random_hackerの答えは、実際には、重み付けされた間隔のスケジューリング問題に対する既知の解決策であり、時間の複雑さはO(N log(N))
.