将空白区块搜索实现到anagram解算器的最佳实践

时间:2013-06-23 18:43:39

标签: php anagram

我目前在我的网站上有一个anagram解算器,运行良好且快速。

我使用数组结构来保存每个单词中使用的每个字母的数字值。所以基本上当有人输入字母“fghdywkjd”时,我的求解器将遍历其数据库中的每个单词,并将每个单词中的字母数量与输入的字母相关联的值匹配即。 “fghdywkjd”

我像这样构建数组

$a = array('a' => 1, 'b' => 1, 'c' => 1, 'd' => 1, 'e' => 1, 'f' => 1, 'g' => 1, 'h' => 1, 'i' => 1, 'j' => 1, 'k' => 1, 'l' => 1, 'm' => 1, 'n' => 1, 'o' => 1, 'p' => 1, 'q' => 1, 'r' => 1, 's' => 1, 't' => 1, 'u' => 1, 'v' => 1, 'w' => 1, 'x' => 1, 'y' => 1, 'z' => 1);

它会计算每个单词的值。

我正在尝试考虑向其添加空白磁贴功能的最佳方法,这不会减慢速度。

我能弄清楚如何添加此功能的唯一方法是等到我拥有所有结果然后找到每个单词并添加字母“a”并找到可能性,然后添加后者“b”等等。对于每一个巨大的词。

无论如何都有一些想法?

1 个答案:

答案 0 :(得分:2)

我可能会这样做。我会像这样设置数据库表结构:(主要原因是速度。我们可以在每个查询中按字母分割名称,但我认为这种方式更快,但我没有基准测试)。

name    a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p  q  r  s  t  u  v  w  x  y  z
----    -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
test    0  0  0  0  1  0  0  0  0  0  0  0  0  0  0  0  0  0  1  2  0  0  0  0  0  0
tests   0  0  0  0  1  0  0  0  0  0  0  0  0  0  0  0  0  0  2  2  0  0  0  0  0  0
foo     0  0  0  0  0  1  0  0  0  0  0  0  0  0  2  0  0  0  0  0  0  0  0  0  0  0

然后在PHP中我这样做:这假设单词中的字母数必须与anagram完全匹配(没有多余的字母)。

<?php
$letters = array_fill_keys (range('a', 'z'), 0);

$word = 'set'; // start with the word 'set'
$wordLetters = str_split(preg_replace("/[^a-z]/", '', strtolower($word))); // remove invalid letters, lowercase, and convert to array

$numberOfWildcards = 1; // Change this to the number of wildcards you want

foreach ($wordLetters as $letter) {
    $letters[$letter]++;
}

$query = 'SELECT `name`, 0';

foreach ($letters as $letter => $num) {
    // $query .= "+ABS(`$letter`-$num)";
    $query .= "+IF(`$letter` > $num, `$letter` - $num, 0)";
}

$query = ' AS difference
    FROM `word_table`
    WHERE 
        LENGTH(`name`) = ' . (strlen($word) + $numberOfWildcards) . '
    HAVING
        difference = ' . $numberOfWildcards;

如果您想查看正在检查的单词与数据库中的所有单词之间的区别,请删除where和having子句。

让我知道这对你有用。