我知道它们的完全对应关系意味着NP-complete问题是NP问题中最难的问题,而co-NP-complete问题是co-NP问题中最难的问题,但两者之间有什么区别呢?我的教科书说:“肯定和否定被颠倒了”,这并没有给我留下太多线索。
当你想证明一个问题的难度时,你需要将其转化为决策问题,也就是“是/否”类型的问题。例如,在集合覆盖问题中,我们可能会问“是否可以仅使用X个子集覆盖所有元素?”其中X是某个任意数。我们可以证明这个问题存在于NP中,因为它很容易验证;你提供X个子集,我检查所有元素是否在多项式时间内都被覆盖。如果我们能有效地回答“是”这个决策问题,那么我们就可以最小化X,从而有效地解决整个集合覆盖问题(从而证明P=NP)。Co-*(Co-NP、Co-NP-complete)专注于回答补充决策问题的“否”。例如,集合覆盖问题的补充决策问题将是“对于每个组合的X个子集,是否不可能覆盖所有元素?”回答“否”要求你提供一个反例。总之:NP关注某些决策问题的“是”答案。Co-NP则专注于同样的决策问题的“否”答案,但是是对应的补充问题。
其他人已经说了一些,我想再补充一点(因为我自己也感到有些困惑),NP = co-NP 的问题是询问是否每个决策问题都存在一个“yes”回答可以在多项式时间内检查,并且也存在一个“no”回答可以在多项式时间内检查。这有点令人困惑,因此这里有一个例子:旅行商问题的决策形式(“给定图形G,是否存在长度为L或更短的路径,该路径至少访问每个顶点一次?”)属于NP:如果我说“是的,存在一条长度为L或更短的路径,该路径至少访问每个顶点一次”,那么我证明的方式是给你一条长度为L或更短且至少访问每个顶点一次的路径,你检查我的解决方案的方法是获取我的路径,检查它是否至少访问每个顶点一次,以及它的长度是否小于等于L。之所以该问题属于NP,是因为进行这种检查需要多项式时间(即非常快)。该问题的补集将是“给定图形G,是否不存在长度为L或更短的路径,该路径至少访问每个顶点一次?”回答“否”表示基本上是与上述问题相同。我将会说“不,不存在长度为L或更短的路径(双重否定很令人困惑),该路径至少访问每个顶点一次。为了证明这一点,这里有一条长度为L或更短且至少访问每个顶点一次的路径。因此,在G中不存在长度为L或更短的路径,该路径至少访问每个顶点一次。” 当人们说任何NP问题的补集都属于co-NP时,这就是他们的意思。那么,如果NP = co-NP,这意味着什么?它意味着如果一个问题属于NP(可以轻松检查“yes”答案),那么它也属于co-NP(可以轻松检查“no”答案)。(再次强调,我们正在谈论问题本身,而不是问题的补集:我们已经知道任何NP问题的补集属于co-NP。我们正在讨论原始问题。)但对于旅行商问题,这不是很明显:如果我说“否,G中没有长度为L或更短的路径,该路径恰好访问每个顶点一次”,我将如何证明这一点?当答案是“是”时,我可以轻松地向你证明这一点(只需给你路径,以便你自己检查即可)。但是如果我的答案是“否”,我们不知道有什么简单方法可以检查我是否正确。我只能说“相信我,我已经检查过了。”发现NP = co-NP会令人惊讶,因为这意味着我可以给你某种证明,并且你可以快速检查并看到我是正确的。
NP是指那些决策问题的类别,对于这些问题,如果有合适的证书,就可以有一个多项式时间算法来验证“是”实例。 CoNP是指那些决策问题的类别,对于这些问题,如果有合适的证书,就可以有一个多项式时间算法来验证“否”实例。我们不知道coNP是否与NP不同。对于coNP中每个问题都有一个NP问题,反之亦然。例如,SAT问题是“是否存在一种布尔分配使得该公式评估为True?”相应的补问题位于coNP中,它问:“所有布尔分配是否都使该公式评估为False?”