2009-12-20 100 views
2

我搜索的方法来加扰的话一个完整的例如未加扰的话单词表比较:比较加扰的加扰单词一览PHP词语

加扰的字是“lonbayb”,并在词表某处被单词“巴比伦”。该脚本应该显示我解读的字

任何想法如何解决这个问题?

回答

1

要洗牌的话使用str_shuffle()。 要将混洗字符串与单词列表进行比较,可以使用count_chars()

class WordFinder 
{ 
    protected $_wordList; 
    protected $_map; 

    public function __construct(array $wordList) 
    { 
     $this->_wordList = $wordList; 
    } 

    protected function _initMap() 
    { 
     if(!is_array($this->_map)) { 
      $this->_map = array(); 
      foreach($this->_wordList as $word) { 
       $key = count_chars($word, 3); 
       if(!isset($this->_map[$key])) { 
        $this->_map[$key] = array(); 
       } 
       $this->_map[$key][] = $word; 
      } 
     } 
    } 

    public function findWords($searchWord) 
    { 
     $searchWord = count_chars($searchWord, 3); 
     $this->_initMap(); 
     if(isset($this->_map[$searchWord])) { 
      return $this->_map[$searchWord]; 
     } 
     return false; 
    }  
} 

然后做

$list = array('evil', 'live', 'vile', 'cat'); 
$finder = new WordFinder($list); 
var_dump($finder->findWords('evli')); 

,这将返回

array(3) { 
    [0]=> 
    string(4) "evil" 
    [1]=> 
    string(4) "live" 
    [2]=> 
    string(4) "vile" 
} 

编辑 我交换了这个版本的原代码,因为它执行更好大词汇表。我已经在我的2,2 Ghz Dual Core上测试了上述内容,它只需0.08秒就可以完成10000个调用findWords()的10000个字的集合。另一个版本需要207秒。请参阅旧版本的修订版。

+0

哦,我的。在我的回答中,我有些无奈地选择了“洗牌”这个词,以避免与“排序”混淆,这可能会掩盖我的意思。我没有意识到'str_shuffle'是一个完全不同的完全不同的PHP函数,即随机*改变字符的顺序。现在我正在考虑如何解决我可能无意中造成的混淆。 – 2009-12-20 21:19:35

+0

没关系。他仍然可以使用'str_shuffle'来混洗这些单词,因为'count_chars'会按字母顺序返回它们。不需要1:1的地图。 – Gordon 2009-12-20 21:23:11

6

想到一个简单的解决方案,就是在比较之前按字母顺序排列加扰和非加扰的单词中的字母。我称之为“洗牌”:

"babylon" ==> "abblnoy" 

在实际应用中,你应该从你的参考单词表创建第二个词表,具有其条目洗牌这样的单词表参考。

然后当您查看一个新单词并想知道它是否在列表中时,以相同的方式随机播放,并且您可以在混洗参考列表中进行简单搜索。如果您按字母顺序在混洗参考列表中对单词进行排序,您甚至可以对其进行二分搜索。或者你把混洗后的参考字放入一个哈希集合或B树......任何很容易快速搜索。

+0

是的,你可以建立一个数据库表,每个单词的排序和未排序的版本。当你想检查一个单词时,只需对它的字符进行排序并将其放入SQL中的WHERE子句中即可。如果有的话,你甚至会自动得到多个结果。 – selfawaresoup 2009-12-20 18:23:56

+0

当然,但仅限于超过几兆字节的巨大单词列表。对于其他任何事情,我都会使用内存数据结构,并且性能远远优于数据库相关的繁忙工作。 – 2009-12-20 21:15:19