使用字典,BFS是最优的,但所需的运行时间与其大小(V+E)成正比。对于n个字母,字典可能有~a^n个条目,其中a是字母表大小。如果字典包含除应该在链末尾的单词之外的所有单词,则您将遍历所有可能的单词,但不会找到任何内容。这是图形遍历,但大小可能呈指数增长。
您可能想知道是否可能更快地浏览“智能”结构并在多项式时间内完成它。答案是,我认为不能。
问题:
您可以快速(线性地)检查单词是否在字典中,给定两个单词u,v并检查是否存在序列u->a1->a2->...->an->v。
是NP难题。
证明:取一个3SAT实例,例如
(p或q或not r)且(p或not q或r)
您将从0 000 00开始,并要检查是否可能转到2 222 22。
第一个字符将是“我们完成了”,接下来的三个位将控制p,q,r,接下来的两个位将控制子句。
允许的单词包括:
- 以0开头且只包含0和1的任何内容。
- 以2开头且合法的任何内容。这意味着它由0和1组成(除了第一个字符为2外,所有子句位根据变量位正确设置,并且它们设置为1(因此显示公式是可满足的)。
- 以至少两个2开头,然后由0和1组成(正则表达式:222*(0+1)*,例如22221101但不是2212001)。
要从0 000 00生成2 222 22,必须按照以下方式进行:
(1)翻转适当的位 - 例如,在四个步骤中翻转为0 100 111。这需要找到3SAT解决方案。
(2)将第一位更改为2:2 100 111。在这里,您将验证这确实是3SAT解决方案。
(3) 将 2 100 111 改为 2 200 111,然后改为 2 220 111,再改为 2 222 111,然后改为 2 222 211,最后改为 2 222 221,最终改为 2 222 222。
这些规则强制执行了你不能作弊(检查)。只有当公式可满足时,才能到达2 222 22,并且检查它是NP难题。我觉得这可能会更难(可能是#P或FNP),但是我认为NP难度已经足够了。
编辑:您可能会对不相交集数据结构感兴趣。这将获取您的字典并分组可以从彼此到达的单词。您还可以存储从每个顶点到根或其他顶点的路径。这将为您提供一条路径,不一定是最短的路径。