关于计算机科学:NP,NP-Complete和NP-Hard之间有什么区别?

What are the differences between NP, NP-Complete and NP-Hard?

NP、NP完全和NP硬的区别是什么?

我知道网络上有很多资源。我想看看你的解释,原因是它们可能与外面的有所不同,或者有一些我不知道的东西。


我假设您正在寻找直观的定义,因为技术定义需要相当长的时间来理解。首先,让我们记住一个初步的必要概念来理解这些定义。好的。

  • 决策问题:回答"是"或"否"的问题。

现在,让我们定义这些复杂性类。好的。磷

P是一个复杂度类,它代表了可以在多项式时间内解决的所有决策问题的集合。好的。

也就是说,给定问题的一个实例,答案是或否可以在多项式时间内确定。好的。

例子好的。

给定一个连通图G,它的顶点可以用两种颜色着色,这样就没有边缘是单色的了吗?好的。

算法:从一个任意的顶点开始,把它涂成红色,把它的所有相邻点涂成蓝色,然后继续。当顶点用完或强制使边的两个端点都为同一颜色时停止。好的。NP

NP是一个复杂度类,它表示所有决策问题的集合,对于这些问题,答案为"是"的实例具有可在多项式时间内验证的证明。好的。

这意味着,如果有人给我们一个问题的实例和一个证书(有时称为证人),证明答案是肯定的,我们可以在多项式时间内检查它是否正确。好的。

例子好的。

整数因子分解是NP。这就是给定整数nm的问题,1 < f < m有整数f吗,以致f除以n(fn的一个小因子?好的。

这是一个决策问题,因为答案是"是"或"否"。如果有人给我们一个问题的实例(所以他们给我们一个整数nm)和一个整数f1 < f < m,并且声称fn的因数(证书),我们可以通过performin在多项式时间内检查答案。g部门n / f。好的。全类

NP完全是一个复杂度类,它表示np中所有问题X的集合,对于这些问题,可以在多项式时间内将任何其他np问题Y减少到X。好的。

直观地说,这意味着如果我们知道如何快速解决X,我们可以快速解决Y。精确地说,如果有多项式时间算法fYY的实例在多项式时间内转换为Xx = f(y)的实例,那么Y的答案可以还原为X,前提是并且仅当f(y)的答案为是。好的。

例子好的。

3-SAT。这是一个问题,在这个问题中,我们得到了3个分句析取(ORS)的连词(ands),形式的语句好的。

1
2
3
4
(x_v11 OR x_v21 OR x_v31) AND
(x_v12 OR x_v22 OR x_v32) AND
...                       AND
(x_v1n OR x_v2n OR x_v3n)

其中,每个x_vij都是一个布尔变量,或者对有限预定义列表(x_1, x_2, ... x_n)中的变量求反。好的。

可以证明,每一个NP问题都可以简化为3-SAT,证明这是技术性的,需要使用NP的技术定义(基于非确定性图灵机)。这就是库克定理。好的。

使NP完全问题重要的是,如果能找到一个确定性多项式时间算法来解决其中的一个问题,那么每个NP问题都可以在多项式时间内解决(一个问题可以将它们全部规则化)。好的。NP硬

直观地说,这些问题至少和NP完全问题一样困难。注意,NP硬问题不一定是NP中的问题,也不一定是决策问题。好的。

这里的精确定义是,一个问题X是np困难的,如果有np完全问题Y的话,那么Y在多项式时间内可还原为X。好的。

但由于在多项式时间内,任何一个NP完全问题都可以归结为其它任何一个NP完全问题,所以所有的NP完全问题都可以归结为多项式时间内的任何一个NP困难问题。然后,如果多项式时间内有一个NP硬问题的解,则多项式时间内所有NP问题都有一个解。好的。

例子好的。

停顿问题是一个NP难题。这就是给定程序P和输入I的问题,它会停止吗?这是一个决策问题,但它不在NP中。很明显,任何NP完全问题都可以归结为这个问题。作为另一个例子,任何NP完全问题都是NP难问题。好的。

我最喜欢的NP完全问题是扫雷问题。好的。P=NP

这是计算机科学中最著名的问题,也是数学科学中最重要的突出问题之一。事实上,克莱研究所提供了100万美元来解决这个问题(斯蒂芬·库克在克莱网站上的报道相当不错)。好的。

很明显,p是np的一个子集。有待解决的问题是NP问题是否具有确定性多项式时间解。人们普遍认为他们没有。这是一篇关于p=np问题的最新(和重要性)的杰出文章:p与np问题的现状。好的。

关于这个问题最好的书是加利和约翰逊的《计算机和难对付性》。好的。好啊。


我环顾四周,看到了很多很长的解释。下面是一个小图表,可能有助于总结:

注意难度是如何从上到下增加的:任何np都可以降为np完全,任何np完全可以降为np硬,都在p(多项式)时间内。

如果你能在p时间内解决一类更困难的问题,那就意味着你找到了如何在p时间内解决所有更容易的问题(例如,证明p=np,如果你想知道如何在p时间内解决任何np完全问题)。

1
2
3
4
5
6
7
8
____________________________________________________________
| Problem Type | Verifiable in P time | Solvable in P time | Increasing Difficulty
___________________________________________________________|           |
| P            |        Yes           |        Yes         |           |
| NP           |        Yes           |     Yes or No *    |           |
| NP-Complete  |        Yes           |      Unknown       |           |
| NP-Hard      |     Yes or No **     |      Unknown ***   |           |
____________________________________________________________           V

关于YesNo分录的说明:

  • *一个np问题,也是p,在p时间内是可解的。
  • **NP硬问题也是NP完全问题,可以在P时间内验证。
  • ***NP完全问题(所有这些问题构成NP硬的子集)可能是。其余的np hard不是。

我还发现这个图在查看所有这些类型如何相互对应方面非常有用(注意图的左半部分)。


这是对所问问题的非常非正式的回答。

3233能写成另外两个大于1的数的乘积吗?有什么方法可以绕着K的七座桥走一条路吗?奈斯伯格不搭两次桥吗?这些是具有共同特征的问题的例子。如何有效地确定答案可能并不明显,但是如果答案是"是",那么会有一个简短而快速的检查证明。在第一种情况下,非平凡的因式分解为51;在第二种情况下,是用于行走桥梁的路线(符合约束条件)。

决策问题是一组只有一个参数变化的有"是"或"否"答案的问题。假设问题composite="n是复合的":n是整数或euler path="图形G有欧拉路径吗?":G是一个有限图。

现在,一些决策问题需要高效的算法,即使不是显而易见的算法。欧拉发现了一个有效的算法来解决像"K的七座桥"这样的问题。Nigsberg"在250多年前。

另一方面,对于许多决策问题,如何得到答案并不明显——但是如果你知道一些额外的信息,那么很明显,如何去证明你得到了正确的答案。复合运算是这样的:试算除法是一种显而易见的算法,而且运算速度很慢:要将10位数作为因子,你必须尝试类似于100000个可能的除数。但是,例如,如果有人告诉你61是3233的除数,那么简单的长除法是一种有效的方法来证明它们是正确的。

复杂性类NP是决策问题的一类,其中"是"的答案短于状态,快速检查证明。像复合材料。一个重要的点是,这个定义并没有说明问题有多困难。如果你有一个正确的,有效的方法来解决一个决策问题,只写下解决方案中的步骤就足够了。

算法的研究还在继续,新的聪明的算法也一直被创造出来。今天你可能不知道如何有效地解决一个问题,但明天可能会有一个有效的(如果不明显的话)解决方案。事实上,研究人员直到2002年才找到一种有效的复合材料解决方案!有了这些进步,人们真的很想知道:这是不是有点像一个假象?也许每一个有助于有效证明的决策问题都有一个有效的解决方案?没人知道。

也许这一领域的最大贡献是发现了一类特殊的NP问题。通过对电路模型进行计算,斯蒂芬·库克发现了一个NP变种的决策问题,这个问题可以证明比其他所有NP问题都难或难。布尔可满足性问题的一个有效解可用于求解NP中的任何其他问题。不久之后,RichardKarp展示了其他一些决策问题也可以达到同样的目的。从某种意义上说,这些问题是NP中最困难的问题,被称为NP完全问题。

当然,NP只是一类决策问题。许多问题并不是以这种方式自然地表述的:"找到n的因子"、"在图g中找到访问每个顶点的最短路径"、"给出一组变量赋值,使下面的布尔表达式为真"。虽然人们可能会非正式地谈论一些"NP"中的问题,但从技术上讲,这些问题没有多大意义——它们不是决策问题。其中一些问题甚至可能具有与NP完全问题相同的能力:对这些(非决策)问题的有效解决将直接导致对任何NP问题的有效解决。像这样的问题叫做NP困难。


除了其他很好的答案,下面是人们用来显示NP、NP完全和NP硬之间差异的典型模式:

enter image description here


P(多项式时间):顾名思义,这些问题可以用多项式时间来解决。

NP(非确定性多项式时间):这是可以用多项式时间验证的决策问题。这意味着,如果我声称有一个特定问题的多项式时间解,你要求我证明它。然后,我给你一个证明,你可以很容易地在多项式时间验证。这种问题叫做NP问题。注意,这里我们不讨论这个问题是否有多项式时间解。但我们讨论的是在多项式时间内验证给定问题的解。

NP难:这些至少和NP中最难的问题一样难。如果我们能在多项式时间内解决这些问题,我们就能解决任何可能存在的NP问题。注意,这些问题不一定是NP问题。也就是说,我们可能/可能不会在多项式时间内验证这些问题的解决方案。

NP完全:这是NP和NP都很难解决的问题。也就是说,如果我们能解决这些问题,我们就可以解决任何其他的NP问题,并且这些问题的解可以在多项式时间内得到验证。


在不涉及技术细节的情况下,解释P V.NP等问题的最简单方法是将"单词问题"与"多项选择问题"进行比较。

当你试图解决一个"单词问题"时,你必须从头开始寻找解决方案。当你试图解决一个"多项选择问题"时,你有一个选择:要么像解决"单词问题"一样解决它,要么试着插入给你的每个答案,然后选择适合的候选答案。

通常情况下,"多项选择问题"比相应的"字词问题"容易得多:替换候选答案并检查它们是否适合可能比从头开始寻找正确答案需要的努力少得多。

现在,如果我们同意多项式时间的努力"容易",那么P类将由"容易的词问题"组成,而NP类将由"容易的多项选择问题"组成。

p v.np的本质是一个问题:"有没有任何简单的多选问题,不容易像单词问题一样?"也就是说,是否有一些问题很容易验证给定答案的有效性,但很难从零开始找到答案?

既然我们直观地理解了NP是什么,我们就必须挑战我们的直觉。事实证明,在某种意义上,"多重选择问题"是所有问题中最难解决的:如果一个人能找到这些"最难的问题"中的一个的解决方案,他就能找到所有NP问题的解决方案!当库克40年前发现这一点时,它完全出乎意料。这些"最困难的"问题被称为NP困难。如果你找到其中一个的"单词问题解决方案",你会自动找到每个"简单多选问题"的"单词问题解决方案"!

最后,NP完全问题是同时存在NP和NP困难的问题。根据我们的类比,它们同时是"简单的多选问题"和"最难的问题都是单词问题"。


我想我们可以更简洁地回答。我回答了一个相关的问题,并从那里抄了我的答案。

但首先,一个NP困难问题是一个我们不能证明多项式时间解存在的问题。一些"问题p"的np硬度通常通过在多项式时间内将已经证明的np困难问题转化为"问题p"来证明。

To answer the rest of question, you first need to understand which NP-hard problems are also NP-complete. If an NP-hard problem belongs to set NP, then it is NP-complete. To belong to set NP, a problem needs to be

(i) a decision problem,
(ii) the number of solutions to the problem should be finite and each solution should be of polynomial length, and
(iii) given a polynomial length solution, we should be able to say whether the answer to the problem is yes/no

Now, it is easy to see that there could be many NP-hard problems that do not belong to set NP and are harder to solve. As an intuitive example, the optimization-version of traveling salesman where we need to find an actual schedule is harder than the decision-version of traveling salesman where we just need to determine whether a schedule with length <= k exists or not.


NP完全问题是指NP硬问题和复杂类NP中的问题。因此,为了证明任何给定的问题都是NP完全的,你需要证明问题既在NP中,又在NP中是困难的。

NP复杂性类中的问题可以在多项式时间内非确定性地解决,并且可以在多项式时间内验证NP问题的可能解决方案(即证书)的正确性。

K派问题的非确定性解决方案的一个例子如下:

1)从图中随机选择K节点

2)确认这些k节点形成一个集团。

上述策略在输入图的大小上是多项式的,因此K组问题是NP问题。

注意,在多项式时间内,所有确定性可解的问题也都是NP。

显示一个问题是NP硬的通常涉及使用多项式时间映射从其他NP硬问题减少到您的问题:http://en.wikipedia.org/wiki/reducation_uu(复杂性)


对于这个特定的问题有很好的答案,所以没有必要写我自己的解释。因此,我将尝试为不同类型的计算复杂性提供一个优秀的资源。

对于那些认为计算复杂性只与p和np有关的人来说,这里是关于不同计算复杂性问题的最详尽的资料。除了OP提出的问题外,它还列出了大约500种不同类型的计算问题,以及描述该类的基础研究论文列表。


据我所知,NP难题并不比NP完全问题"难"。事实上,根据定义,每个NP完全问题是:

  • 在NP中
  • NP难
  • enter image description here

    -- Intro. to Algorithms (3ed) by Cormen, Leiserson, Rivest, and Stein, pg 1069


    找到一些有趣的定义:

    氧化镁