【せつびじはいれつ】

接尾辞配列 とは?

公開:
💡 どこから読み始めるかを、辞書順の索引にする

文字列の各位置から末尾までの部分文字列を辞書順に並べ、その開始位置を保存した配列。文字列検索や繰り返しの検出に使える索引。

📌 このページのポイント
banana の接尾辞を辞書順に並べる 開始位置 接尾辞 ana検索 5 a 3 ana 一致 1 anana 一致 0 banana 4 na 2 nana 検索結果の位置は、本文中の順番とは限らない
保存する番号は [5, 3, 1, 0, 4, 2]。空の接尾辞は含めない例。
ひよこ ひよこ
接尾辞って、言葉の最後に付くもの?
ペンギン先生 ペンギン先生
文字列アルゴリズムでは、ある位置から末尾までを切り出した部分を指すよ。bananaなら、位置0からbanana、1からanana、2からnana…となる。ここでは0始まりで、空の接尾辞は含めないことにするね。
ひよこ ひよこ
それをどう並べるの?
ペンギン先生 ペンギン先生
辞書順ではa、ana、anana、banana、na、nanaになる。それぞれの開始位置は5、3、1、0、4、2だよ。この番号の配列が接尾辞配列なんだ。文字列を全部複製せず、元の文字列と番号から必要な部分を参照できるよ。
ひよこ ひよこ
anaを探したいときは?
ペンギン先生 ペンギン先生
anaで始まる接尾辞が索引のどこに並ぶかを、二分探索で調べられるよ。この例ではanaとananaが該当し、元の位置は3と1。本文での出現順に欲しい場合は、得た位置を並べ直す必要があるね。
ひよこ ひよこ
二分探索なら検索はO(log n)?
ペンギン先生 ペンギン先生
比較の回数と文字の比較コストを分けよう。長さmのパターンを毎回先頭から比較する単純な二分探索なら、検索はO(m log n)と考えるよ。一致位置を全部返す時間も別に必要。索引の構築時間は選んだアルゴリズムで変わるんだ。
もっと詳しく知りたい人へ

すべての接尾辞をコピーして保存してもよいですか?

長さnの文字列では、コピーする文字数がn+(n−1)+…+1となり、O(n²)の領域を使います。開始位置を保存する表現なら、配列の要素数はnです。隣り合う接尾辞の共通接頭辞長を持つLCP配列などを組み合わせる用途もあります。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「接尾辞配列」って出てきたら「末尾までの文字列を辞書順にした、開始位置の索引」と思えればだいたいOK!

参考資料

← 用語集にもどる