接尾辞配列は、すべての部分文字列がいずれかの接尾辞の接頭辞であるため、既に必要なことを実行します。具体的には、サフィックス配列が与えられた場合
abcd bcd cd d
部分文字列「bc」を探していると仮定すると、「bc」で始まるすべての接尾辞を探すことで見つけることができます (この場合、「bcd」は 1 つだけです)。接尾辞配列は辞書順にソートされるため、特定の接頭辞を共有するすべての接尾辞を見つけることは、接尾辞配列全体のバイナリ検索に対応し、結果は接尾辞配列のエントリの 1 つの連続した範囲になります。
ただし、LCP (longest-common prefix) 配列やウェーブレット ツリーなどの補助データ構造と組み合わせたサフィックス配列を使用する最適化された検索方法があります。そのような方法の説明については、Navarro の 2007 年の調査を参照してください (DOI 10.1145/1216370.1216372)。
以下のコメントを考慮して、各接尾辞をそれが表す部分文字列の数と組み合わせることをお勧めします。上記のような単純な例では、これは
4 abcd
3 bcd
2 bc
1 d
たとえば、最初のサフィックス「abcd」は、4 つの部分文字列「a」、「ab」、「abc」、「abcd」を表すためです。ただし、文字列「abcabxdabe」などのより複雑な例では、サフィックス配列の最初の 2 つのエントリは次のようになります。
10 abcabxdabe
1 abe
2 番目のエントリは部分文字列 "a"、"ab"、および "abe" を表しますが、"a" と "ab" は最初のエントリでも表されるためです。
エントリが表す部分文字列の数を計算する方法は? --> サフィックスの長さから、前のサフィックスと共通する最長のプレフィックスの長さを引いたもの。たとえば、「abe」の例では、3 (その長さ) から 2 (「ab」の長さ、前のエントリと共有する最長のプレフィックス) を引いたものです。したがって、これらの数値はサフィックス配列を介して 1 回のパスで生成でき、LCP (最長共通プレフィックス) 配列も生成した場合はさらに高速になります。
次のステップは、累積カウントを生成することです。
10 abcabxdabe
11 abe
16 abxdabe
...
そして、蓄積されたカウントを利用する効率的な方法を見つけます。たとえば、13 番目の部分文字列を辞書的に取得したい場合は、累積カウントが 13 以上の最初のエントリを見つける必要があります。これは、上記の「16 abxdabe」になります。次に、前のエントリと共有する接頭辞を削除し (「xdabe」が生成されます)、2 番目の文字の後の位置にジャンプします (前のエントリはカウント 11 を累積し、13-11==2 であるため)。 abxd" を辞書的に 13 番目の部分文字列として指定します。