我搜索的方法来加扰的话一个完整的例如未加扰的话单词表比较:比较加扰的加扰单词一览PHP词语
加扰的字是“lonbayb”,并在词表某处被单词“巴比伦”。该脚本应该显示我解读的字
任何想法如何解决这个问题?
我搜索的方法来加扰的话一个完整的例如未加扰的话单词表比较:比较加扰的加扰单词一览PHP词语
加扰的字是“lonbayb”,并在词表某处被单词“巴比伦”。该脚本应该显示我解读的字
任何想法如何解决这个问题?
要洗牌的话使用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秒。请参阅旧版本的修订版。
想到一个简单的解决方案,就是在比较之前按字母顺序排列加扰和非加扰的单词中的字母。我称之为“洗牌”:
"babylon" ==> "abblnoy"
在实际应用中,你应该从你的参考单词表创建第二个词表,具有其条目洗牌这样的单词表参考。
然后当您查看一个新单词并想知道它是否在列表中时,以相同的方式随机播放,并且您可以在混洗参考列表中进行简单搜索。如果您按字母顺序在混洗参考列表中对单词进行排序,您甚至可以对其进行二分搜索。或者你把混洗后的参考字放入一个哈希集合或B树......任何很容易快速搜索。
是的,你可以建立一个数据库表,每个单词的排序和未排序的版本。当你想检查一个单词时,只需对它的字符进行排序并将其放入SQL中的WHERE子句中即可。如果有的话,你甚至会自动得到多个结果。 – selfawaresoup 2009-12-20 18:23:56
当然,但仅限于超过几兆字节的巨大单词列表。对于其他任何事情,我都会使用内存数据结构,并且性能远远优于数据库相关的繁忙工作。 – 2009-12-20 21:15:19
哦,我的。在我的回答中,我有些无奈地选择了“洗牌”这个词,以避免与“排序”混淆,这可能会掩盖我的意思。我没有意识到'str_shuffle'是一个完全不同的完全不同的PHP函数,即随机*改变字符的顺序。现在我正在考虑如何解决我可能无意中造成的混淆。 – 2009-12-20 21:19:35
没关系。他仍然可以使用'str_shuffle'来混洗这些单词,因为'count_chars'会按字母顺序返回它们。不需要1:1的地图。 – Gordon 2009-12-20 21:23:11