次は、誰かによって私に与えられた練習の面接の質問です。範囲のセットを考えると範囲Sと重複範囲Rのセットが与えられた場合、S内の最小のサブセットを見つけて、encompases R
:これまでで
(例えばS = {(1, 4), (30, 40), (20, 91) ,(8, 10), (6, 7), (3, 9), (9, 12), (11, 14)}
と対象範囲R(例えばR = (3, 13)
与えられた - 3から13に行くの範囲を意味する)にアルゴリズムを書きます。目標範囲をカバーする最小の範囲の範囲を見つけます。範囲内のすべての範囲は、スパニングとみなすために重複する必要がありますターゲット範囲全体。 (この例では、答えは{(3, 9), (9, 12), (11, 14)}
だろう。
私は、これは貪欲なアルゴリズムを使用して行われるだろうと考えたのですか?この問題を解決する最良の方法は何ですか。上の例では、我々はすべてのためになります3と交差する数字のうち最大のものを選んでください。次に、私たちが選んだものと同じことをします。(3、9)を選んだので、今度は(9,12)を選びました。同じことをして、次の範囲が12と交差することが分かりました最大値は(11,14)です。
その反復の後、私たちは14が13よりも大きい(私たちの範囲の最大値)ので、私たちは止めることができます。
私はこのアルゴリズムで問題を抱えています、どのように効率的に交差する範囲を照会するのですか?線形探索を試みると、アルゴリズムはO(n^2)
になります。私の次の考えは、ループを通過するたびに私たちのリストから交差する範囲のいずれかを横切ることでした。したがって、最初の反復では、(1,4)と(3,9)が交差します。次の反復では、(9,12),(3,9)および(8,10)のクロスを繰り返します。だから、最後の反復によって、私たちが見なければならないのは、{(30,40)、(20,91)、(6,7)}です。最小> 13、最大で<のすべてをクロスすることで、これをさらに効率的にすることができます3.問題はまだ十分ではないかもしれないということです。私たちの範囲の境界内に重複したシーケンスがたくさんあるという潜在的な問題がまだあります。 {(6,7)、(6,7)、(6,7)、(6,7)、(6,7)}のような範囲のリストには、たとえそれらが私たちにとって役に立たなくても。一意の値を格納するだけであっても(集合内にすべてを入れることによって)、実際に大きな範囲を持つことができます。範囲の範囲はターゲット範囲内ですが、範囲内には範囲が1つありますターゲット範囲全体。
私たちの範囲を照会する効率的な方法は何でしょうか?あるいは、おそらく、この問題を解決するより効率的なアルゴリズムは何でしょうか?
は、有効な解決策は、一例では(8,10) 'の代わりに'(9,12) ''などがもらえますか? –
セットのメンバーは重複する必要があります。彼らがそうしなければ、彼らは全範囲に及ばないでしょう。したがって '(8、10)'をインクルードすると '(9、12)'をインクルードする必要があります。しかし、これを行った場合、サイズ3ではなくサイズ4のセットになります。したがって、これは '(3、13)'の範囲をカバーする範囲の最小セットではなくなりました。 – Ephraim