2

私は、かなり多くのアイテム (数千のオーダー) を保存する必要があるものに取り組んでいます。

アイテムは頻繁に挿入、削除、およびアクセスされます。ただし、アイテムの値が大きいほど、挿入、削除、またはアクセスされる可能性が高くなります。

さらに、構造内の最初の "k" 項目 ("k" はかなり小さい) の非常に迅速な並べ替えをサポートしたいと考えています。

したがって、理想的には、これらの操作を行うコストは、その価値に直接相関します。

ここでは、アイテムが常にソートされたままの単純なリンク付きリストは単純なアプローチですが、すべての場合のパフォーマンスは依然として重要です。一般的なケースでは、操作が O(n) よりも優れていることが理想的です。

私はこの問題についてかなりブレインストーミングしましたが、困惑しています。

最初はビープが理想的なデータ構造かもしれないと思っていましたが、検索はビープの上部に偏っていません。代わりに、下隅から始まり、上に向かって進みます。私が必要とするものではありません。

これらの操作は O(log n) ですが、より大きな値に対してより適切に実行したいため、いくつかのフレーバーのバイナリ検索ツリーは適切なソリューションではないようです。

私が必要としているのは、右下からトラバーサルを開始できるように、ほぼ横に反転した二分探索木です。しかし、私はそれが私にとってうまくいくかどうかを確認するために頭を包み込もうとしています. O(2 log n) 最悪の場合のパフォーマンスを提供し、より大きな値では O(log n) よりも優れていると思います...しかし、完全にはわかりません。

そのようなデータ構造はありますか?それとも、発明しなければなりませんか?

4

2 に答える 2

1

確率的なデータ構造が受け入れられる場合は、(わずかに変更された) Skip listを使用します。

要素は降順で格納する必要があります。また、検索操作は、通常のスキップ リストのようにトップ リストではなく、ボトム リストの先頭要素から検索を開始するように変更する必要があります。

挿入/削除/検索操作の予想時間は O(log K) です。ここで、K は挿入/削除/検索された要素よりも大きい要素の数です。最悪の場合の時間計算量は O(K) です。

于 2013-03-01T13:20:56.747 に答える
0

ヒープを使用できないのはなぜですか? 最大のアイテムを一番上に格納し、サブリニア時間ですべての操作をサポートします。また、明らかにヒープに基づいている heapsort を使用すると、配列を部分的に並べ替える (上位 N 個の要素を取得する) ことが非常に高速になります

于 2013-03-01T13:53:40.633 に答える