- 配列内の単語を並べ替える
- 単語が入ってきたとき => 二分探索 (log(n)) (ハッシュ テーブルを使用すると、直接一致には適していますが、隣接には適していないため、これを行っています)
- 完全に一致する場合はそれを返します
- それ以外の場合は、要求された単語と隣接する単語およびその近傍 (定義される) とのレーベンシュタイン距離を計算し、それらを戻り値のリストに追加します (満足している場合)。
- 選択された隣接する単語のリストを返します
を使用した迅速で汚い実装/usr/share/dict/words
(まだレーベンシュタイン距離の部分と選択を行う必要があります)
免責事項: http://www.perlmonks.org/?node_id=503154から借用したバイナリ検索コード
open(FILE, "<", "/usr/share/dict/words");
my @lines = <FILE>;
my $word = $ARGV[0];
sub BinSearch
{
my ($target, $cmp) = @_;
my @array = @{$_[2]};
my $posmin = 0;
my $posmax = $#array;
return -0.5 if &$cmp (0, \@array, $target) > 0;
return $#array + 0.5 if &$cmp ($#array, \@array, $target) < 0;
while (1)
{
my $mid = int (($posmin + $posmax) / 2);
my $result = &$cmp ($mid, \@array, $target);
if ($result < 0)
{
$posmin = $posmax, next if $mid == $posmin && $posmax != $posmin;
if ($mid == $posmin){
return "Not found, TODO find close match\n";
}
$posmin = $mid;
}
elsif ($result > 0)
{
$posmax = $posmin, next if $mid == $posmax && $posmax != $posmin;
if ($mid == $posmax){
return "Not found, TODO find close match\n";
}
$posmax = $mid;
}
else
{
return "Found: ".@array[$mid];
}
}
}
sub cmpFunc
{
my ($index, $arrayRef, $target) = @_;
my $item = $$arrayRef[$index];
$item =lc($item);
$target =lc($target);
$a = $item cmp $target;
return $a;
}
print BinSearch($word."\n", \&cmpFunc, \@lines)."\n";
使用法 (スクリプトが呼び出された場合find_words.pl
):
perl find_words.pl word
word は検索したい単語です。