从python中的随机输入字母中查找单词。使用什么算法/代码已经存在?

从python中的随机输入字母中查找单词。使用什么算法/代码已经存在?,python,ruby,word,anagram,boggle,Python,Ruby,Word,Anagram,Boggle,我正试图编写一个像这样的字解扰器,我想知道我应该用什么算法来实现它。此外,如果有人能找到现有的代码,这将是伟大的。基本上,该功能将类似于boggle解算器,但不是矩阵,只是从字符串中搜索所有可能的单词。我已经有足够的字典了 我计划用python或ruby来实现这一点。 提前感谢你们的帮助 我会用一个。这里是Python的一个实现:(归功于James Tauber)我可能对游戏缺乏了解,但除了规则中的一些复杂因素,例如引入了“小丑”(通配符)字母、缺少或额外的字母、多个单词等。。。我认为以下想法将

我正试图编写一个像这样的字解扰器,我想知道我应该用什么算法来实现它。此外,如果有人能找到现有的代码,这将是伟大的。基本上,该功能将类似于boggle解算器,但不是矩阵,只是从字符串中搜索所有可能的单词。我已经有足够的字典了

我计划用python或ruby来实现这一点。
提前感谢你们的帮助

我会用一个。这里是Python的一个实现:(归功于James Tauber)

我可能对游戏缺乏了解,但除了规则中的一些复杂因素,例如引入了“小丑”(通配符)字母、缺少或额外的字母、多个单词等。。。我认为以下想法将有助于把这个问题变成一件相对来说比较乏味的事情:-(

主旨按字母顺序为单词编制索引
例如,“计算机”被键入“Cemoptu”。随机绘图提供的任何内容都是实物排序,并用作查找可能匹配项的键。 使用perimosocordiae建议的结构,作为“叶”节点中这些排序键和相关单词/wordid的底层存储,可以在O(n)时间内完成单词查找,其中n是字母数(或由于不存在单词而平均更好)

为了进一步帮助索引,我们可以有几个表/字典,每个字母数一个。根据统计数据,元音和辅音可以分别处理。另一个技巧是自定义排序顺序,将最有选择性的字母放在第一位

游戏中的额外曲折(比如从字母子集中找到单词)主要是迭代这些字母的
,并检查字典中的每个组合


可以引入一些启发式方法来帮助删减某些组合(例如,不带元音[和给定长度]的组合是不可能的解决方案等)。由于查找成本相对较小,因此应小心管理这些启发式方法。

对于字典索引,构建一个映射(map[Bag[Char],List[String]])。它应该是一个哈希映射,这样您就可以进行O(1)个单词查找。Bag[Char]是一个单词的标识符,在字符顺序上是唯一的。它基本上是从Char到Int的哈希映射。Char是单词中给定的字符,Int是字符在单词中出现的次数

例如:

{'a'=>3, 'n'=>1, 'g'=>1, 'r'=>1, 'm'=>1} => ["anagram"]
{'s'=>3, 't'=>1, 'r'=>1, 'e'=>2, 'd'=>1} => ["stressed", "desserts"]

要查找单词,请从输入字符串中提取每个字符组合,并在此映射中查找。此算法的复杂度为O(2^n)输入字符串的长度。值得注意的是,复杂性并不取决于字典的长度。

这听起来是个不错的选择。如果使用滚动哈希函数,则在每个位置都需要一次哈希值更新和一次字典查找。您还需要创建一种处理不同单词长度的好方法,如将所有单词截断为集合中最短的单词,并重新检查可能的匹配项。将单词集拆分为单独的长度范围将减少误报量,但会增加哈希运算。

有两种方法可以做到这一点。一种是检查单词中每个候选字母的排列,以查看是否idate在你的单词词典中。这是一个O(N!)运算,取决于单词的长度

另一种方法是检查字典中的每个候选词,看看它是否包含在该词中。这可以通过聚合字典来加快速度;而不是一次检查每个候选词,而是检查所有互为字谜的词,因为如果你的词中包含任何一个词,那么所有词都是

因此,首先构建一个字典,它的键是一个已排序的字母字符串,其值是一个单词列表,这些单词是键的字谜:

>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> with open(r"c:\temp\words.txt", "r") as f:
        for line in f.readlines():
            if line[0].isupper(): continue
            word = line.strip()
            key = "".join(sorted(word.lower()))
            d[key].append(word)
现在我们需要一个函数来查看一个单词是否包含候选词。该函数假设单词和候选词都已排序,以便它可以逐个字母地检查它们,并在发现它们不匹配时快速放弃

>>> def contains(sorted_word, sorted_candidate):
        wchars = (c for c in sorted_word)
        for cc in sorted_candidate:
            while(True):
                try:
                    wc = wchars.next()
                except StopIteration:
                    return False
                if wc < cc: continue
                if wc == cc: break
                return False
        return True

最后一步在我的笔记本电脑上大约需要四分之一秒;我的字典里有195K个键(我使用的是BSD Unix Word文件)。

用两种语言写出来只是为了好玩。:)然后,和Alex Martelli一起分享一些意大利面(capelli d'angelo'vs.spaghettini);-)
>>> w = sorted("mythopoetic")
>>> result = []
>>> for k in d.keys():
        if contains(w, k): result.extend(d[k])
>>> len(result)
429
>>> sorted(result)[:20]
['c', 'ce', 'cep', 'ceti', 'che', 'chetty', 'chi', 'chime', 'chip', 'chit', 'chitty', 'cho', 'chomp', 'choop', 'chop', 'chott', 'chyme', 'cipo', 'cit', 'cite']