NP和co-NP有啥区别

Posted

技术标签:

【中文标题】NP和co-NP有啥区别【英文标题】:Whats the difference between NP and co-NPNP和co-NP有什么区别 【发布时间】:2013-06-07 10:34:12 【问题描述】:

我知道他们完全对应的意思是 NP - 完全是 NP 问题中最难的,而 co-NP-complete 是指 co-NP 问题中最难的,但两者之间有什么区别?我的教科书说“是与否是颠倒的”,这并没有给我留下太多线索。

【问题讨论】:

相关:math.stackexchange.com/questions/361422/why-isnt-np-conp 还有math.stackexchange.com/questions/2334429 【参考方案1】:

只是为了补充其他人所说的(因为我自己发现这令人困惑),NP = co-NP 的问题是询问是否每个决策问题都有一个“是”的答案可以检查多项式时间也有一个“否”的答案,可以在多项式时间内检查。

这有点令人困惑,所以举个例子:旅行商问题的决策形式(“给定一个图 G,G 中是否有一条长度为 L 或更短的路径至少访问每个顶点一次?”)是在 NP 中:如果我说“是的,有一条长度为 L 或更短的路径至少访问每个顶点一次”,我证明这一点的方法是给你一条长度为 L 或更短的路径,至少访问每个顶点一次,而您检查我的解决方案的方式是走我的路径,检查它是否至少到达每个顶点一次,并且它的长度是否为 L 或更短。这个问题在 NP 中,因为执行此检查需要多项式时间(即它很快)

这个问题的补充将是“给定一个图 G,G 中是否没有长度为 L 或更短的路径至少访问每个顶点一次?”对这个问题回答“否”与上面的问题基本相同。为了证明这一点,我会说“不,没有长度为 L 或更短的路径(双重否定会令人困惑)至少访问每个顶点一次。为了证明这一点,这里有一条长度为 L 或更短的路径可以访问每个顶点至少一次。因此,在 G 中没有长度为 L 的路径至少访问每个顶点一次是真的。这就是人们说任何 NP 问题的补码在 co-NP 中时的意思。

那么,如果 NP = co-NP 意味着什么?这意味着如果问题在 NP 中(您可以轻松地检查“是”答案),它也在 co-NP 中(您可以轻松地检查“否”答案)。

(重申一下,我们不是在谈论问题的补码:我们已经知道 NP 问题的补码在 co-NP 中。我们在询问原始问题。)

但是对于旅行商问题,它是如何工作的并不明显:如果我说“不,在 G 中没有长度为 L 或更短的路径恰好访问每个顶点一次”,我将如何证明这一点?当答案是“是”时,我很容易向您证明这一点(只需给您路径,以便您自己检查)。但如果我的回答是“不”,就没有简单的方法(我们知道)来检查我是否正确。我只能说“相信我,我检查了所有这些”。发现 NP = co-NP 会令人惊讶,因为这意味着一些我可以给你的证据,你可以快速检查并确认我是对的。 p>

【讨论】:

【参考方案2】:

NP 是一类决策问题,有一个多项式时间算法可以在给定适当证书的情况下验证“是”实例。

CoNP 是一类决策问题,有一个多项式时间算法可以在给定适当证书的情况下验证“否”实例。

我们不知道 coNP 是否与 NP 不同。

对于coNP中的每个问题,NP中都有一个问题,反之亦然。例如,SAT 问题询问“是否存在使该公式评估为 True 的布尔赋值?”。 coNP 中的补码问题询问“是否所有布尔赋值都使该公式的计算结果为 False?”

【讨论】:

Co-NP 不一定是多项式可证明的,因为 Co-NP = NP【参考方案3】:

当你想证明一个问题的难度时,你必须把它变成一个叫做决策问题的东西,这意味着一个“是/否”答案类型的问题。例如,在 Set Cover 中,我们可能会问 “我们能否仅使用 X 个子集覆盖所有元素?” 其中 X 是某个任意数字。我们可以证明这个问题存在于 NP 中,因为它的解决方案很容易验证;您提供 X 个子集,我检查是否所有元素都包含在多项式时间内。如果我们可以对决策问题有效地回答“是”,那么我们可以最小化 X,从而有效地解决整个 Set Cover 问题(从而证明 P=NP)。

Co-*(Co-NP,Co-NP-complete)专注于对补充决策问题回答“否”。例如,集合覆盖的补充决策问题将是“对于 X 个子集的每个组合,是否不可能覆盖所有元素?” 对这个问题回答“否”需要您提供一个反例 -例子。

总而言之:NP 关注的是某个决策问题的“是”答案。 Co-NP 关注的是对相同但互补的决策问题的“否”答案。

【讨论】:

你的意思是你使用同一个多项式验证器来回答这两个问题吗?一个检查证书是否是一个解决方案,另一个检查它是一个反例,因此是补充问题的解决方案?如果有,这个玩文字的目的是什么? @Ahmad:我们没有,事实上也不能,使用同一个验证器来回答这两个问题。就像我们不确定 P = NP 一样,我们也不确定 NP = Co-NP。可以对“NP”回答“是”的多项式验证器可能无法轻松对补足决策问题回答“否”。 但是在您的示例中,这样的验证者似乎可以回答这两个问题。我希望您再添加一个示例,以表明对补语问题或任何其他问题回答“否”并不容易。 来自 Wikipedia on Co-NP:A decision problem X is a member of co-NP if and only if its complement X is in the complexity class NP 所以我认为,是的,可以使用同一个验证器来解决这两个问题。如果将NP改为Co-NP取问题的补码,本质上是同一个问题。我认为 Co-NP 有助于表达这样一个概念:在不改变问题的定义(取补语)的情况下,对问题提供“否”的答案是多么困难。

以上是关于NP和co-NP有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

numba 中的@jit 和@vectorize 有啥区别?

UFQFPN和QFPN封装有啥区别?

python tf.random_uniform与np.random_uniform有啥区别

numpy中的flatten和ravel有啥区别? [复制]

numpy中的flatten和ravel有啥区别? [复制]

连续数组和非连续数组有啥区别?