2016-10-18 6 views
2

(1,7,13,14,50)のようにすでにソートされている整数のリストが与えられたとします。リストには重複が含まれないことに注意してください。ソートされたリストを一定時間に追加/更新することはできますか?

これを保存できるデータ構造がありますが、一定の時間内に新しい要素(適切な場所に)を追加できますか? add(10)は(1,7,10,13,14,50)を返します。

同様に、(7から19に変更するなど)要素を更新し、それに応じて一定の時間内に順序を変更することはできますか? (7,19)利回り(1,13,14,19,50)を変更する。

クラスの場合、できるだけ早くこれらの操作を実行するデータ構造を記述する必要がありますが、一定の時間を実行できるかどうかを知りたければ、理想的な実行時間は何ですか?

+0

あなたはまだ要素を見つけるために 'O(n)'が必要です。 HashMapは 'O(1)'を使って要素の位置を特定します。 – user2004685

+0

_ソートされたリストを一定時間に追加/更新することは可能ですか? "_ vs _"はできるだけ早くこれらの操作を実行します。 "_はちょっと矛盾です。私の理解によれば、「一定の時間」とは、操作が必要な場所に関係なく、常に同じ時間量がかかることを意味します。 「可能な限り速い」ソリューションは、すべてのケースの約50%、「一定時間」のソリューションの方が高速になります。 –

+0

あなたはどのような問題を解決しようとしていますか?あなたは本当にソートされたリストを維持する必要がありますか?または、アイテムを効率的に挿入および更新できるデータ構造が必要ですか? –

答えて

2

これは、一定時間O(1)で挿入するには、データ構造のいずれかの場合にのみ最適なケースとして発生します。ハッシュテーブルは一般的に挿入時間が最適ですが、衝突があり、別々の連鎖がある場合、常にO(1)になるとは限りません。複雑さが無限になるように、ハッシュをソートしないでください。

バイナリツリーは挿入時間が長く、ボーナスとして、新しいノードを挿入するときに既にソートされています。しかしこれは平均O(logn)時間を要する。ツリーが空の場合、挿入するための最良のケースはO(1)です。一般的にはhttp://bigocheatsheet.com/

0

者は、これらの操作の複雑さに関する詳しい情報は、こちらを参照して、ほんの一例でしたか?いいえ。新しい要素を挿入する場所や挿入後にリストを並べ替える場所を決定するには、リストの内容の分析を実行する必要があります。リストの要素の読み込み(一般的にはリストの長さの一部を繰り返します) 。これは(一般的に)これは、リスト内にいくつの要素があるかに依存します。定義によると定数ではありません。したがって、特別な場合を除いて、一定時間ソートされたインサートは単に不可能です。

0

バイナリツリーTreeSetが適切です。 Arrays.binarySearchとArrays.copyを持つ配列は、ここではintを持ち、Integerというラッパークラスは必要ありません。

本物の一定時間では、O(1)は、スペースで支払う必要があります。 BitSetを使用してください。 17を追加するには、単に17をtrueに設定します。次のセットビットを見つけるなどの最適化されたメソッドがあります。

しかし、この場所では最適化が本当に必要なのか疑問です。ファイルI/Oは、より多くの報酬を得るかもしれません。

+1

'BitSet'が合理的かどうかは、彼の番号の範囲に依存します。あなたが言うように、あなたは宇宙で支払います。範囲が32ビットの整数の場合、半ギガバイト(2^32ビットは2^29バイト)が必要です。 –

+0

@JimMischel非常に本当です。 ID範囲の場合、それはちょうどよいでしょう。常に地図を見る... –

関連する問題