--- title: Go言語に接尾辞配列(Suffix Array)が組み込まれていた tags: [] categories: ["Programming", "Golang", "index", "suffixarray"] date: 2013-08-06T15:50:31Z updated: 2013-08-06T15:50:31Z --- Go言語の標準ライブラリをぱらぱらっとみていたら気になる物が `index/suffixarray` その名の通り接尾辞配列(Suffix Array)実装ですね。 こんなものが標準で組み込まれているなんてさすがGoogle製。 (ちなみに[以前Javaで実装してました][1]) `suffixarray.New([]byte)`でインデックスをビルドして、 `Lookup([]byte, int)`で検索。第2引数は最大取得件数で-1にすれば全件取得。 返り値は第1引数の文字列から始まる部分文字列の位置の配列。 試してみた。 package main import ( "fmt" "index/suffixarray" ) func main() { input := "abracadabra" index := suffixarray.New([]byte(input)) // "abracadabra"のうちraから始まる文字列を表示 fmt.Println("begin from 'ra'") fmt.Print("\t") for _, value := range index.Lookup([]byte("ra"), -1) { fmt.Print(input[value:], " ") } fmt.Println() // "abracadabra"のうちabから始まる文字列を表示 fmt.Println("begin from 'ab'") fmt.Print("\t") for _, value := range index.Lookup([]byte("ab"), -1) { fmt.Print(input[value:], " ") } fmt.Println() // "abracadabra"のうちbrから始まる文字列を表示 fmt.Println("begin from 'br'") fmt.Print("\t") for _, value := range index.Lookup([]byte("br"), -1) { fmt.Print(input[value:], " ") } fmt.Println() } 実行結果 $ go run suffixarray.go begin from 'ra' ra racadabra begin from 'ab' abra abracadabra begin from 'br' bra bracadabra Javaのときと同じですね。 Suffix Arrayの初歩について学ぶには↓がおすすめです。 珠玉のプログラミング―本質を見抜いたアルゴリズムとデータ構造 「続・アルゴリズムを学ぼう」にも解説されているらしい。 続・アルゴリズムを学ぼう [1]: http://blog.ik.am/entry/view/id/78/title/%E6%8E%A5%E5%B0%BE%E8%BE%9E%E9%85%8D%E5%88%97%28Suffix%20Array%29/