- 对数组中的单词进行排序
- 当一个词进入 => 二进制搜索 (log(n)) 时(我们这样做是因为如果你使用哈希表,它对直接匹配有好处,但对相邻却很差)
- 如果完美匹配返回它
- 否则计算所请求单词与相邻单词及其邻居(待定义)的leventhein 距离,并将它们添加到返回列表(如果它们令人满意)
- 返回选中的相邻单词列表
快速而肮脏的实现/usr/share/dict/words
(你仍然需要做 levensthein 距离部分和选择)
免责声明:从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 是您要搜索的单词。