Perl による Suffix Array の実装
2006-04-10-2
[Programming][Algorithm]
昔作った「Perlによるsuffix arrayの実装」を発掘したので公開しておき
ます。
ソースコードです。
実行結果です。
Suffix Arrays については、[2006-04-10-3]にリンク集をまとめましたの
でどうぞ。
当時ネット上でsuffix arrayのPerl実装がどこかで公開されていたはずな
のですが、今検索すると見つけられません…。
見つけた方、ご存知の方はURLを教えてください。
追記060411: 見つかりました!ありがとうございます。
お手軽PerlでSuffixArrayに挑戦
http://www006.upp.so-net.ne.jp/ugougo/tech/lang_perl/easy_suffixarray.html
ます。
ソースコードです。
#!/usr/bin/perl -w use strict; my $t = "mississippi"; # Text - 対象テキスト my @sa = (0..length($t)-1); # Suffix Array - 初期設定 ### Suffix Array の作成 @sa = sort {substr($t, $a) cmp substr($t, $b)} @sa; # テスト出力 for (0..$#sa) { print "$_ $sa[$_] ",substr($t, $sa[$_]),"\n"; } ### バイナリサーチによる Suffix Array の検索 my $k = "ppi"; # Key - 検索キー my ($l, $u) = (0, $#sa); while ($l <= $u) { my $i = int(($l + $u)/2); my $c = $k cmp substr($t, $sa[$i], length($k)); if ($c > 0) { $l = $i + 1; } elsif ($c < 0) { $u = $i - 1; } else { print qq("$k" is found at $sa[$i]\n); last; } }
実行結果です。
% perl sa.pl 0 10 i 1 7 ippi 2 4 issippi 3 1 ississippi 4 0 mississippi 5 9 pi 6 8 ppi 7 6 sippi 8 3 sissippi 9 5 ssippi 10 2 ssissippi "ppi" is found at 8
Suffix Arrays については、[2006-04-10-3]にリンク集をまとめましたの
でどうぞ。
当時ネット上でsuffix arrayのPerl実装がどこかで公開されていたはずな
のですが、今検索すると見つけられません…。
見つけた方、ご存知の方はURLを教えてください。
追記060411: 見つかりました!ありがとうございます。
お手軽PerlでSuffixArrayに挑戦
http://www006.upp.so-net.ne.jp/ugougo/tech/lang_perl/easy_suffixarray.html