あなたはがちょうどオブジェクトのコレクションを持っており、O(1)時間でそれらをマージしたい、と独自のデータ構造を実装する気にしない場合は、これを行うための最も簡単な方法は、使用することですアンバランスなバイナリツリー:各ノードはリーフ(値を格納する)または2つのツリーの組み合わせのいずれかであり、抽象スーパークラスまたはインタフェースを持つ2つのクラスとして実装できます。深さ優先のトラバーサルを使用して要素を抽出することができます。
これは、基本的にColinDのイテレーター連結の提案と同じですが、もっと裸の骨です。
キャッチは、このコレクションを反復処理する
はO(nは
)ではないということです!
n +
m)ここで、
mは、実行したマージの数です(1つは通過するノードなので)。これは私のソリューションとColinDの両方に当てはまります。私は、この問題に対するすべての可能な解決法が真であるかどうかはわかりません。
上記のことは気にしないでください。この方式の下では、すべてのマージ、少なくとも一つの要素を追加するので、メートル < Nので、反復コストは依然としてO(N)です。 (あなたはイテレータの連結を使用する場合は、あなたが頻繁にコストを追加すると、空のイテレータを連結していないことを確認してください。)の最初のと最後の要素へのポインタをあなたのコレクションとして2つのリンクされたリストを使用して、保存することにより
ソート済みリストの遅延マージはどのようにして発音しますか?マージされた結果はO(1)に組み込むことができ、実際に評価されるまで、償却されたO(1)をリスト上のすべての演算に追加します。 –
あなた自身LinkedListを実装することはできますが、LinkedListはそれ自体で大きな時間を費やします。 – bestsss
'Javaで2つのリンクされたリストをO(1)'のランタイムでマージすることはできません。 Javaで独自のリンクリストを実装する場合は、Javaでリンクされた2つのリストをO(1)の実行時にマージできます。このステートメントは、標準ライブラリの実装でのみ当てはまります。したがって、ステートメントには「2つのjava.util.LinkedListをO(1)のランタイムでマージすることはできません。 –