找到的话是从输入随机的字母蟒蛇。什么样的算法使用/代码已经在那里?

StackOverflow https://stackoverflow.com/questions/1570242

我想代码一词的解扰喜欢这一个 在这里, 并且想知道什么我应该使用算法来实现这一点。此外,如果任何人都可以找到现有的码为此,这将是巨大的。基本功能,是要像一个惊奇的解,但没有作为一个矩阵,只是在寻找的所有词的可能性,从一个字符串。我已经有足够的词典。

我是规划这样做在任何一蟒蛇或红宝石。在此先感谢您的帮助的家伙!

有帮助吗?

解决方案

我会使用一个 Trie树。下面是用Python实现: http://jtauber.com/2005/02/trie.py (信用给James堡)

其他提示

我可能是缺少一个对比赛的理解,但限制一些并发症的规则,例如与介绍的"小丑"(通配符的)的信件,丢失或额外的信件,多话等等。我认为下面的想法将有助于把这个问题有点较无趣的事情。:-(

主要的想法 索引词 下令 顺序字母.
例如"计算机"获得键作为"cemoprtu".不管是什么随机图纸提供进行排序,并用作关键要找到可能的匹配。使用 trie 结构作为建议通过perimosocordiae,作为基本的储存对于这些按键而相关词语(s)/wordIds在"叶"节点,字 查找可以在O(n)时间, 其中n为数字母(或者更好,平均由于非现有的话)。

为了进一步帮助索引我们可以有几种表/词典,每一个数字母。还根据统计数据的元音和辅音字母可以分开处理。另一个把戏会有一个自定义的排列顺序,将其置于最有选择性的第一个字母.

额外的曲折的游戏(例如发现的话由一个子集的信件)是主要的一个问题 迭代 功率设定 这些字母的 和检查字典中每个组合。

一些启发式可以被引入 帮助修剪一些的组合(例如组合没有元音[和定长度]是不可能的解决方案等。一个应该管理这些试探仔细的查找成本相对较小。

有关的字典索引,构建地图(地图[袋[字符],列表[字符串]])。这应该是一个哈希地图,这样你可以得到O(1)字查找。甲袋[字符]为是唯一的,最多字符顺序的单词的标识符。它基本上是一个哈希表的字符来诠释。焦炭是在字给定字符和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)的输入字符串的长度。值得注意的是,复杂性不依赖于字典的长度。

此声音如拉宾-卡普串搜索将是一个好的选择。如果您使用滚动哈希函数,然后在每个位置需要一个哈希值更新和一个字典查找。您还需要创建一个很好的方式,以应付不同的字长,就像截断所有单词,以最短的字设置和复查可能的匹配。分裂字组成单独的长度范围会减少在提高散列工作的费用误报的量。

有两种方法可以做到这一点。一是要检查每一个字母排列的候选人在这个词来看看候选人是在你的词汇字典。这是一个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

现在发现,由字包含在字典中的所有候选键,并聚集所有的值到一个列表:

>>> 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']

这最后一个步骤需要约我的笔记本电脑四分之一秒;有在我的字典(我使用的BSD Unix的话文件)。

195K键
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top