如何在字谜中找到字典单词的程序有效?

时间:2017-01-24 19:22:43

标签: database dictionary combinations permutation

示例包括http://www.thewordfinder.com/http://www.anagram-solver.org/或各种应用程序"作弊"在基于anagram的游戏中,例如Words With Friends。

如果他们想要使用Swift创建具有类似功能的应用程序,那么会从哪里开始?

由于这似乎是投票结果,有人可以告诉我问这个问题的最佳位置在哪里吗?

1 个答案:

答案 0 :(得分:0)

将单词列表转换为前缀树(尤其是使用额外内存以避免稀疏数组的单词)应该允许人们有效地检查输入单词的所有排列,因为可以快速消除搜索的整个分支。

让我们考虑一个简化的例子。假设我们的词典包含3个单词:aababbabc。如果我们将它转​​换为前缀树,那将看起来像:

a
    ab
    b
        b
        c

缩进表示上述行的子项。我们字典中的所有字词都以a开头,后跟abb,后一种情况后跟bc。正如您所看到的,我们不会在每个字母上分支,而是在替代方案上分支。这有助于保持树的大小。

现在,如果我们迭代输入词cba的所有排列:

abc
acb
bac
bca
cab
cba

由于我们的前缀树在根级别没有匹配的条目,因此可以快速消除以a以外的字母开头的所有排列。第二次检查可以取消acb,这意味着只有abc会找到匹配项。如果将检查集成到算法中以生成排列,则可以逐步匹配并避免生成与您正在探索的树的当前分支不匹配的部分排列。

关于避免稀疏树的注释是为了避免必须使用二进制搜索来匹配当前分支的子节点。相反,一个由26个元素组成的数组,由字母的ascii值索引(选择大写或小写并保持一致),应该允许非常快速的查找,但需要额外的内存。