web-dev-qa-db-ja.com

Burrows-Wheeler変換後方検索:サフィックスインデックスを見つける方法は?

パターンの多重度だけが必要な場合、BWT後方検索アルゴリズムは非常に単純です。ただし、サフィックスインデックス(つまり、パターンが発生する参照文字列内の位置)も見つける必要があります。たとえば、文字列bananaとパターンanが与えられた場合、位置1と3で2回発生します。

すべてのサフィックスを計算して並べ替えることができますが、これにより時間の複雑さがO(nlogn)に増加します。nは参照文字列の長さです。これを実行し、O(パターンの長さ)の時間計算量を維持する方法はありますか?

3
user798275

あなたが探しているアルゴリズムは kkonenの接尾辞木 です。 O(n)で実行されます。

説明するアルゴリズムはO(nlogn)ではありません。その数の文字列比較があります。極端な場合、文字列が「verylong_verylong_」である場合、比較にはO(n)がかかり、アルゴリズムは2次の複雑さになります。

1
Franky

BW変換されたテキストには、リンクリストのような操作があり、各エントリから前後に移動して隣接する文字を復元できますが、最初または最後からのオフセットを見つけるには、距離全体を移動するか、情報の一部またはすべてに情報を添付する必要があります。オフセットの決定に役立つノード。

リンクリストのインデックスにラベルを付けるために機能するスキームは、BWTでも機能します。たとえば、k番目のノードごとにラベルを付ける、または特定のタイプのノードにラベルを付ける(たとえば、テキスト内のすべてのn)。

セルフフレーミングコードの1ビットで各ノードにラベルを付けることもできます。例はツェッケンドルフエンコーディングで、コードワードの境界を除いて、1ビットが2つ連続することはありません。ランダムノードを指定して、ワード境界が見つかるまで前方または後方にトラバースし、次のワード境界まで読み取り、その間のビットをデコードしてオフセットを取得します。

0
KWillets