ソートされたオーバーラップしない区間(ゼロベース、半開)のリストがあります。重複していない区間を歩くためのアルゴリズム
{[0, 5), [10, 20), [35, 40)}
の(すなわち右10点の位置を移動させる)Iは間隔(ここで言う、3
)及び+10
のステップ値のいずれかのポイントがあるとしましょう。 O(1)時間で私の最終的な位置を計算できるアルゴリズムはありますか? (EDIT:多分私が言うべきで、Oよりも良い何かが(N))の間隔でカバーされていない
番号が存在しない位置とみなされるので、上記の間隔のステップ+10
との位置3
は(19
の最終位置につながります+1
は4
に移動し、残りの+9
は位置10
から位置19
まで開始します)。もう1つの例は、位置が15
、開始値が-10
の場合、最終位置は0
です。
最終的な位置は、常に1つの区間で終了すると仮定することもできます。しかし、どの間隔からカウントを開始すべきか分かっているかもしれません。
もちろん、O(n)時間(n
=間隔の数)で間隔リストを繰り返し処理できます。しかし、私はこれを攻撃するより良い方法があるべきだと感じています。
P.S.この問題に名前がありますか?これは、それが適切な名前を持つ必要があるように感じるが、私はそれが何であるか分からない。
前処理ステップを使用してすべての値を配列に入れてから、O(1)でそれらをフェッチすることはできませんか?この操作を何度も(少なくともオメガ(n)回)実行すると、平均してコストはO(1)... – gdelab
あなたはバイナリツリー(非リーフ)に間隔を並べることで簡単に対数時間を得ることができますノードは、そのサブツリーの最小カバー間隔と実際の幅の合計を公開する必要があります)。私はどのように一定の時間になるかわからない。 – Useless
@Uselessあなたのコメントをより詳細な答えに変換してもよろしいですか?私は特定の詳細に興味があり、それは明らかに正しいものです。 – Codor