挿入と削除が一方的である場合の効率的な検索のためのデータ構造


8

の要素を格納するためのデータ構造が必要  です。各要素は異なる時間関連付けられてい 。  は変動し、理論的な上限がありますが、これは通常使用されるものよりも桁違いに大きくなります。t

私のアプリケーションを通して、私はそれを保証することができます:

  • 挿入された要素は、既存のすべての要素より常に新しいものです。つまり、時間関連付けられた要素が挿入された場合、ます。要素は1つずつ挿入されます。tˇtˇ>t1

  • 最も古い要素のみが削除されます。つまり、要素が削除された場合、ます。削除は主に1つずつ行われますが、誤って格納された要素の割合が1未満である限り、要素の削除が遅れても直接的な害はありません。jtj<t {1}{j}

  • 挿入と削除を除いて、私がする必要がある唯一のことは、、ある時間の2つの隣接する要素を見つけること。言い換えると、t_j <\ tilde {t} <t_kおよび∄l {\ {1、…、n \}:t_j <t_l <t_k  となるような2つの要素jと  kを見つける必要があります。tt<t<最高tjktj<t<tkl{1}tj<tl<tk

データ構造の私の基準は次のとおりです。

  1. 上記のように要素を見つけることは、可能な限り迅速でなければなりません。
  2. 挿入と取り外しはすばやく行う必要があります。
  3. データ構造は比較的簡単に実装できます。

小さな実行時オフセットについて話していない限り、各基準は次の基準よりも優先されます。

これまでの私の調査では、答えはおそらく何らかの自己均衡検索ツリーであることがわかりましたが、片側挿入または片側削除の場合に最適な情報を見つけることができませんでした。私を見つけるのにかなりの時間。また、ツリーの自己組織化の速さと速度(たとえば、AVLツリーは赤黒のツリーよりも厳格に自己組織化する)についての不完全な情報だけを見つけました。


4
これは、配列のようなバイナリ検索をキューで実行するだけです。
o11c

回答:


5

要素をシーケンスとして格納し、タイムスタンプの昇順で並べ替えます。バイナリ検索を使用して、配列内にある場合にが発生する場所を見つけます。その後、2つの隣接する要素を簡単に見つけることができます。隣接する2つの要素のは、時間で実行できます。tOlg

また、シーケンスの最後に追加し、最初から削除できる必要があります。したがって、基本的にはキューが必要です。

キューには標準的な構造があります。たとえば、償却された時間の挿入および削除操作を使用して、それらを配列に格納できます。基本的に、シーケンスの要素の配列と、開始インデックス(シーケンスの開始)と終了インデックス(シーケンスの終了)があります。最初から削除するには、開始インデックスを増やします。最後に追加するには、終了インデックスを増分します。これが既存の配列の終わりを超えて実行される場合は、サイズが2倍の新しい配列を割り当て、新しい配列にコピーします。O1

あるいは、要素をバランスのとれた二分木に格納することもできます。これにより、すべての操作で最悪の場合の時間を達成します。Olg

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.