- 对数组中的单词进行排序
- 当一个词进入 => 二进制搜索 (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 是您要搜索的单词。