コンピュータサイエンスにおいて、先行要素問題とは、与えられた要素に対して、その要素の前後にどの要素が順序通りに現れるかを効率的に問い合わせるための要素セットを維持する問題である。この問題を解決するために使用されるデータ構造には、バランスのとれた二分探索木、ファン・エムデ・ボアス木、融合木などがある。静的先行要素問題では、要素セットは変化しないが、動的先行要素問題では、セットへの挿入と削除が許される。[ 1 ]
この問題は、 U個の整数のサブセットを含む集合Sを維持することです。これらの整数はそれぞれワードサイズwで格納できるため、問題を解決するデータ構造は、これらの操作をサポートします。[ 2 ]
predecessor(x)これは、 Sの中でxより厳密に小さい最大の要素を返します。successor(x)これは、 Sの中でxより厳密に大きい最小の要素を返します。さらに、この問題の動的なバージョンを解決するデータ構造は、以下の操作もサポートしています。
insert(x)これは、xを集合Sに追加する。delete(x)これは、集合Sからxを削除する。
この問題に対する簡単な解決策の 1 つは、バランスのとれた二分探索木を使用することです。これにより、(ビッグ O 表記で)実行時間は次のようになります。先行クエリの場合。Van Emde Boas ツリーはクエリ時間で次の値を達成します。しかし、スペース。[ 1 ]ダン・ウィラードは、 x-fast トライでこのスペース使用の改善を提案したが、スペースとクエリ時間は同じで、より複雑なy-fast トライでは、必要なのは空間。[ 3 ]マイケル・フレッドマンとウィラードによって導入された融合ツリーは、クエリ時間と静的問題の先行クエリの場合。[ 4 ]動的問題は指数木を使用して解決されています。クエリ時間、[ 5 ]、および期待時間ハッシュ化を使用する。[ 6 ]
先行問題の下限を証明したり、漸近的に最適な解の実行時間を特定したりする論文が数多く発表されている。例えば、Michael BeameとFaith Ellenは、 wのすべての値に対して、クエリ時間(ビッグシータ表記)を持つnの値が存在することを証明した。同様に、nのすべての値に対して、クエリ時間が[ 1 ]下限の証明には、通信複雑性の概念が含まれる。
静的先行問題に関して、Mihai PătrașcuとMikkel Thorup は、セルプローブモデルにおける最適な探索時間の下限を次のように示しました。[ 7 ] RAMのワード長はセットには以下が含まれます整数ビットずつで、RAMでは次のように表現されます。空間の言葉、そして定義する。
の場合のためにそして最適な検索時間は そして、ファン・エムデ・ボアス木はこの限界を達成する。[ 7 ]