接尾辞配列

接尾辞配列（せつびじはいれつ）やサフィックス・アレイ（）とは、文字列の接尾辞（開始位置を異にし終端位置を元の文字列と同じくする部分文字列）の文字列中の開始位置を要素とする配列を、接尾辞に関して辞書順に並べ替えて得られる配列である。接尾辞木の配列版。主に文字列探索、全文検索などに利用される。1990年に Udi Manber と Gene Myers が発表した。
概要.
長さ11の文字列
を例に取って説明する。先頭から一文字ずつ削ってみればわかるように、この文字列は "abracadabra", "bracadabra", "racadabra", ……, "ra", "a" という11の接尾辞を持つと考えられる。この11の接尾辞を、それぞれの開始位置(1～11)とともに配列に順次格納し、接尾辞について辞書順に並べ替えると以下のようになる。表中の最長共通接頭辞（LCP）は、直前の接尾辞と、接尾辞の先頭から何文字か共通する文字がある場合の最大文字数。
元の文字列があれば、接尾辞の開始位置を指定することですべての接尾辞を余すことなく得ることができる。この接尾辞を辞書順に並べたときの開始位置の配列が接尾辞配列となる。
"abracadabra"に対する接尾辞配列は、表のように、(11, 8, 1, 4, 6, 9, 2, 5, 7, 10, 3) となる。接尾辞 "a" の開始位置は11で、接尾辞 "abra" の開始位置は8だからである。
"abracadabra"に対して、12番目の接尾辞として空文字を考えることができる。しかし、これは常に先頭に配置されることになるので特に情報を持たないので、省略しても問題ない。
構築法.
接尾辞配列を構築する最も容易な方法は、効率的な比較ソートを利用することである。この場合、formula_1回の接尾辞の比較が必要になるが、接尾辞の比較は formula_2の時間が必要となる。従って全体的な計算時間は formula_3となる。より精巧なアルゴリズムでは、部分ソートの結果の重複した比較を避けることで formula_1に改善できる。接尾辞木から変換する事で formula_2 で変換する事も出来る。
2009年に Ge Nong らが SA-IS 法を発表した。これにより計算量は formula_2、メモリ使用量は formula_7 （kは文字の種類数）となり、100行程度のC言語のプログラムで実装できる。Yuta Mori が論文発表と同時に SA-IS 法の実装を公開しており、論文でも言及されている。
検索方法.
接尾辞配列を使えば検索対象文字列の出現位置を高速に検索することができる。接尾辞配列においては、文字列が出現する位置を求めることはつまり、その文字列で始まっている接尾辞を求めることと同じである。接尾辞配列は辞書順にソートされているので、検索対象となる文字列の検索には、高速な二分探索アルゴリズムが利用できる。formula_8を検索文字列の長さとすると、単純な実装では二分探索で formula_9の計算時間になる。
直前の接尾辞と、接尾辞の先頭から何文字か共通する文字がある場合、その最大文字数を最長共通接頭辞（LCP, Longest Common Prefix）と呼ぶが、あらかじめ求めておいたLCPにより無駄な比較を省き検索を高速化することができる。このとき、formula_10 の時間で検索できる。
ブロックソート.
接尾辞配列のソートアルゴリズムを利用して ブロックソート (Burrows-Wheeler 変換, BWT) を行うこともできる。技術的に、ブロックソートには接尾辞ではなく巡回シフトした文字列の辞書順のソートが要求される。このため、すべての文字列に番人としての文字"$"などを加えて巡回シフトを行うことで、接尾辞配列と同等の結果を得られる。
歴史.
接尾辞配列は、接尾辞木と比べメモリ消費の少ない手法として、ジーン・マイヤーズとウディ・マンバーによって開発された。これにより圧縮された接尾辞配列とBWTベースの圧縮全文インデックスへの傾向が強まることとなった。
2000年に、圧縮全文インデックスとして、圧縮接尾辞配列やFM-Indexが登場する。
実装.
接尾辞配列を利用した文字列検索ソフトウェアとして、山下達雄の「SUFARY」（最終更新2002年）や、namazuの作者である高林哲の「Sary」（最終更新2005年）がある。