5分でわかる(気がする)Suffix Array

SuffixArrayはしくみが単純だが簡単に全文検索を実現できる。知っておくと便利なので解説する。


例えば

banana

という文字列に対して、それぞれの文字から始まる文字列を接尾辞(Suffix)という。つまり

1: banana
2: anana
3: nana
4: ana
5: na
6: a

こういうのがSuffix。何文字目から始めたのか(Index)を先頭に書いておいた。これを辞書順に並べ替える。

6: a
4: ana
2: anana
1: banana
5: na
3: nana

このときのIndexを並べたものが接尾辞配列(SuffixArray)と呼ばれるもの。

6 4 2 1 5 3

Indexと元の文字列があればSuffixが復元できるのでこれだけ持っておけばOK。
Suffixは辞書順にソートされているので任意のキー(例えばanaとか)が単語中のどこに出てくるかを二分探索で検索できる。

# 真ん中(6/2 = 3番目)のSuffix(anana)と比較
   6: a
   4: ana
→ 2: anana    > ana
   1: banana
   5: na
   3: nana


# キー(ana)のほうが小さいので、anana以下のSuffixを捨てる。
   6: a
   4: ana

# 真ん中(2 / 2 = 1番目)のSuffix(a)と比較
→ 6: a      < ana
   4: ana


# キー(ana)のほうが大きいので、a以上のSuffixを捨てる。
   4: ana

# 残ったSuffix(ana)と比較
→ 4: ana    = ana

# 発見。周辺にキー(ana)ではじまるSuffixがないか調べる
× 6: a
○ 4: ana
○ 2: anana

# よって文字列(banana)の2,4文字目の位置に
# キー(ana)があることがわかった
  v   v
b a n a n a