Suffix Arrayとは

HOME>>メモ>>アルゴリズム>>Suffix Array>>Suffix Arrayとは

Suffix Array

接尾辞配列(Suffix Array)とは,接尾辞(Suffix)を辞書順にソートしたものです.

例として「abracadabra$」という文字列を考えてみましょう. ($は文字列の終わりを表す特殊な文字) Suffixとは,文字列のある位置から末尾までの文字列のことです. 「abracadabra$」の場合,以下のように全部で11通りの Suffix があります.

開始位置Suffix
0abracadabra$
1bracadabra$
2racadabra$
3acadabra$
4cadabra$
5adabra$
6dabra$
7abra$
8bra$
9ra$
10a$
11$

これを辞書順(ここではabc順)に並べ替えたものが Suffix Array です.

開始位置Suffix
11$
10a$
7abra$
0abracadabra$
3acadabra$
5adabra$
8bra$
1bracadabra$
4cadabra$
6dabra$
2racadabra$
9ra$

Suffix は元の文字列と開始位置さえわかれば特定できるので, 表の開始位置の列だけ覚えておけば Suffix Array を表すことができます.

アルゴリズム

もっとも簡単なアルゴリズムは Suffix Array の定義をそのまま実装することです. たいていの言語でソート関数が組み込まれているので,それを使うことができます. しかし,一般的なソートアルゴリズムはどんなに効率がいいものでも$O(n \log n)$回の Suffix の比較が必要となります. Suffix の比較には $O(n)$ の計算量が必要なので,全体で $O(n^2 \log n)$の計算量となります.

短い文章なら十分な速度ですが,長い文章では非効率です. 次は少し工夫したバケットソートを見て見ることにしましょう.

やってみた

もっとも単純なアルゴリズムをJavaScriptで実装してみました. 入力欄にテキストを入力すると Suffix Array を生成してくれます. さらに,検索欄にテキストを入力すると,先頭がその文字列で始まる Suffix を検索し,強調表示してくれます. このような Suffix は二分検索で高速に求めることができるので,全文検索などに応用することができます.

入力:
検索: