1

最後のn個の一意の番号を順番に覚えておきたい。

これが私が意味することです:n=4としましょう。

私の現在のリストは5 3 4 2、6を追加すると、になります3 4 2 6。代わりに3を追加すると、リストはに変わり5 4 2 3、3が前に移動します。

私はこのようにします:番号をキューに保存します。新しい番号を追加するときは、キューを検索して番号を探します。番号が見つからない場合は、最後の番号をポップして、新しい番号を前に押します。番号が見つかった場合は、その位置の番号を削除してから、新しい番号を前に押します。

明らかに、キュー操作用に最適化された(std::dequeC ++のように)キュー内の任意の位置から数値を削除すると、非常に時間がかかります。リンクリストを使用すると、リストの検索に時間がかかります。この種のタスクを実行するためのアルゴリズムとデータ構造のより良い組み合わせはありますか?

それが何か違いを生むのであれば、私は必ずしも「最後のn個の一意の番号を順番に覚えている」ことを気にしません。特に、追加時にリストから削除された要素(存在する場合)を知る必要があります。

4

1 に答える 1

4

二重にリンクされたリストを使用できます。キーが番号自体であり、値がその番号を含むリンクリストのノードを指すポインタであるハッシュテーブルに記憶されるn個の番号を追加できます。

次に 、キューを検索して番号を変更し、その番号がハッシュテーブルにあるかどうかを確認する手順を説明します。ハッシュテーブルは、キューを使用するライナー時間ではなく、一定時間になります。

二重リンクリストの最初の要素を指すポインターpと、リストの最後の要素を指すポインターqを格納すると、説明するポップおよびプッシュ操作を一定時間で実行できます。

あなたのステップ番号が見つかった場合、削除する番号の位置がすでにあるので、その位置の番号を削除することは一定時間で実行できます(位置とは、ハッシュテーブルから取得するポインターを意味します)。

アップデート:

それに応じて新しい番号を削除および追加するには、ハッシュテーブルを更新する必要があることに注意してください。

于 2012-06-08T23:48:05.740 に答える