6

次のタスクがあります(より大きなタスクの一部として):

データ構造のような配列から要素を取得して削除する必要がありますk(kは任意のインデックスです)。配列には要素を削除するための O(n) があり、リストには要素を検索するための O(n) があります。両方の操作を O(1) 時間で実行したいと思います。

この要件を満たすには、どのデータ構造を使用すればよいですか?

説明:

index(5) の要素を削除すると、要素が index(6) から index(5) に移動します。

この特定のタスクは、topcoder srm 300 div2 500 ポイントの問題です。そのような洗練されたデータ構造は必要ありません (最大データは非常に小さいため、単純な Java メソッドで十分です)。

それで、私はこの問題のために配列に固執しているのかもしれませんか?しかし、私はそれを分析し、後で作業後に質問を編集します (本当に興味がある場合は、トップ コーダーのタスクを参照してください)。

4

4 に答える 4

8

あなたが求めていることは不可能だと思います。

ただし、インデックス作成の要件を O(log n) に緩和できる場合は、ロープがそれを満たすことができる可能性がありますが、確率的または決定的保証があるかどうかはわかりません (確率的だと思います)。

于 2013-08-05T07:55:01.423 に答える
0

要素の追加と削除でわずかなオーバーヘッドがある唯一のデータ構造はハッシュテーブルです。唯一のオーバーヘッドは、ハッシュ関数のコストです (純粋に理論的なアプローチを取る場合は、O(1) と見なされます)。

ただし、非常に効率的にしたい場合は、次のことを行う必要があります。

  • データ構造内に取得する必要がある要素の概算数を用意します (そして、この数を最初に一度に割り当てます)。
  • キーの分散方法を考慮して、衝突を回避するハッシュ関数を選択してください (衝突はハッシュテーブルの効率を損なうだけです)。

すべてを正しく行うことができれば、最適である必要があります。

于 2013-08-05T09:14:01.337 に答える