如果您证明解决字谜查找(不超过多项式次数)可以解决子集和问题 - 这将是计算机科学的一场革命(您将证明 P=NP)。
显然找到字谜是多项式时间问题:
检查两条记录是否是彼此的字谜就像排序字母并比较结果字符串(即C*s*log(s)
时间,其中s
- 记录中的字母数)一样简单。您最多会有n
这样的检查,其中n
- 字典中的记录数。所以显然运行时间 ~C*s*log(s)*n
受到输入大小多项式的限制 - 您的输入记录和字典相结合。
编辑:
只有当字谜查找问题被定义为在可能的完整短语的字典中查找输入短语的字谜时,上述所有内容才有效。
虽然上面原始问题中的字谜发现问题的措辞......
现在假设我们有一个包含 n 个单词的字典。现在,字谜生成问题可以描述为在字典中找到一组单词(n 个单词),这些单词用完输入的所有字母。
...似乎暗示了一些不同的东西 - 例如,字典中多个条目的某种组合也是输入的可能字谜的有效选择。
然而,这似乎立即有问题且不清楚,因为(1)通常短语不仅仅是随机单词的序列(它应该作为一个完整的短语有意义),(2)通常短语中的单词需要也是符号的分隔符 - 所以它不是清除输入中是否需要分隔符(空白字符)以允许字典中的单独条目以及单个字典条目中是否允许分隔符。
因此,在我上面的最初答案中,我应用了“语义剃刀”,将问题定义解释为唯一明确且有意义的“字谜发现”。
但我们也可以这样解释作者的定义:
给定 n 个字母序列的字典(单独的字典条目可能包含相同的序列)和一个目标字母序列 - 找到字典条目的任何子集,如果连接在一起将是目标字母序列的精确重排,或者确定这样的子集不存在.
^^^- 尽管这个问题作为“字谜查找问题”不再真正有意义,但它仍然很有趣。这与我上面考虑的问题非常不同。
还有一件事尚不清楚 - 字母表的灵活性。具体来说,问题定义还必须指定字母集是固定的还是允许在指定字典和所述字母的目标序列时为问题的每个新解决方案重新定义它。这很重要——能力和复杂性取决于此。
该问题的变体具有为每个解决方案单独定义字母表(可用字母数)的能力,实际上等效于子集和问题。这使它成为NP完全的。
我可以证明我们的问题与子集和问题的自然数变体等价,定义为
给定自然数的集合(多集)(允许重复数)和目标自然数 - 找到任何与目标数完全相加的子集合或确定此类子集合不存在。
不难看出,大多数线性步数足以将一个问题输入转换为另一个问题输入,反之亦然。因此,一个问题的解决方案恰好转化为另一个问题的一个解决方案加上主要是线性开销。
这个仅正数的子集和变体等效于作者给出的零和子集和变体(参见例如子集和维基百科文章)。