NP, NP- complete和NP- hard的区别是什么?
我知道网上有很多资源。我想读一下你的解释,原因是它们可能与外界的解释不同,或者有一些我不知道的东西。
NP, NP- complete和NP- hard的区别是什么?
我知道网上有很多资源。我想读一下你的解释,原因是它们可能与外界的解释不同,或者有一些我不知道的东西。
当前回答
我假设您正在寻找直观的定义,因为技术定义需要相当长的时间来理解。首先,让我们记住一个基本概念来理解这些定义。
决策问题:回答是或不是的问题。
现在,让我们定义这些复杂性类。
P
P是一个复杂度类,表示所有决策问题的集合,可以在多项式时间内解决。
也就是说,给定一个问题的实例,答案是或否可以在多项式时间内决定。
例子
给定一个连通图G,它的顶点可以用两种颜色来着色,从而没有边是单色的吗?
算法:从一个任意顶点开始,将其涂成红色,将其所有邻居涂成蓝色,然后继续。当你用尽顶点时停止,或者你被迫让一条边的两端都是相同的颜色。
NP
NP是一个复杂度类,它表示所有决策问题的集合,其中答案是“是”的实例具有可以在多项式时间内验证的证明。
这意味着如果有人给我们一个问题的实例和一个证明(有时称为证人),答案是肯定的,我们可以在多项式时间内检查它是否正确。
例子
整数因式分解是NP。这是一个给定整数n和m的问题,是否存在一个1 < f < m的整数f,使得f能整除n (f是n的一个小因子)?
这是一个决策问题,因为答案是是或不是。如果有人给我们一个问题的实例(他们给了我们整数n和m)和一个1 < f < m的整数f,并声称f是n的因数(证书),我们可以通过执行n / f的除法在多项式时间内检查答案。
非完全多项式
NP- complete是一个复杂度类,它表示NP中所有问题X的集合,其中可以在多项式时间内将任何其他NP问题Y减少到X。
直观地说,这意味着如果我们知道如何快速解决X,我们就可以快速解决Y。准确地说,Y可约为X,如果有一个多项式时间算法f在多项式时间内将Y的实例Y转换为X = f(Y)的实例X,其性质是Y的答案是yes,当且仅当f(Y)的答案是yes。
例子
3-SAT。在这个问题中,我们得到了一个3子句析取(or)的连词(and),这种形式的语句
(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-hard
直观地说,这些问题至少和np完全问题一样难。注意,NP难问题不一定是NP问题,也不一定是决策问题。
这里的精确定义是,如果存在一个np完全问题Y,那么问题X是np难的,这样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 vs NP问题的现状。
这方面最好的书是加里和约翰逊合著的《计算机与顽固性》。
其他回答
对于这个特别的问题有很好的答案,所以没有必要写我自己的解释。所以我会试着提供关于不同类型计算复杂度的优秀资源。
对于那些认为计算复杂度只是关于P和NP的人来说,这里有关于不同计算复杂度问题的最详尽的资源。除了OP提出的问题,它还列出了大约500种不同类型的计算问题,并给出了很好的描述,还列出了描述这类问题的基础研究论文。
NP完全问题是那些既NP- hard又属于NP复杂度类的问题。因此,为了证明任何给定的问题是NP完全的,你需要证明这个问题既是NP问题,又是NP难问题。
NP复杂度类的问题可以在多项式时间内非确定性地解决,NP复杂度类问题的可能解(即证书)可以在多项式时间内验证其正确性。
k团问题的非确定性解的一个例子是这样的:
1)从图中随机选择k个节点
2)验证这k个节点组成了一个团。
上述策略在输入图的大小上是多项式,因此k团问题属于NP。
注意,所有在多项式时间内确定可解决的问题也都属于NP。
说明一个问题是np困难的通常包括使用多项式时间映射从其他np困难问题减少到你的问题:http://en.wikipedia.org/wiki/Reduction_(complexity)
解释P和NP的最简单的方法是比较“文字问题”和“多项选择题”。
当你试图解决一个“应用题”时,你必须从头开始寻找解决方案。 当你试图解决一个“多项选择题”时,你有一个选择:要么像解决“应用题”一样解决它,要么试着把给你的每个答案都代入,然后选择一个合适的候选答案。
通常情况下,“多项选择题”比相应的“应用题”容易得多:替换候选答案并检查它们是否合适,可能比从头开始寻找正确答案要省力得多。
现在,如果我们同意花费多项式时间的努力是“简单”的,那么P类将由“简单的应用题”组成,NP类将由“简单的多项选择题”组成。
P和NP的本质是一个问题:“有没有简单的选择题不像应用题那么简单?”也就是说,是否存在这样的问题:验证给定答案的有效性很容易,但从头开始寻找答案却很困难?
现在我们已经直观地理解了NP是什么,我们必须挑战我们的直觉。事实证明,在某种意义上,“多项选择题”是最难的:如果一个人能找到其中一个“最难的”问题的解决方案,那么他就能找到所有NP问题的解决方案!40年前,当库克发现这一点时,完全出乎意料。这些“最难的”问题被称为np难问题。如果你找到其中一个的“应用题解答”,你就会自动找到每一个“简单多项选择题”的“应用题解答”!
最后,NP完全问题是那些同时是NP和NP难的问题。按照我们的类比,它们既“像选择题一样简单”,又“像应用题一样最难”。
除了其他很好的答案,下面是人们用来显示NP、NP- complete和NP- hard之间区别的典型模式:
我四处寻找,看到了许多冗长的解释。 这里有一个小图表,总结起来可能有用:
请注意难度是如何从上到下递增的:任何NP都可以简化为NP完全,任何NP完全都可以简化为NP困难,所有这些都需要P(多项式)时间。
如果你能在P时间内解决一个更难的问题,那就意味着你找到了如何在P时间内解决所有更简单的问题的方法(例如,证明P = NP,如果你知道如何在P时间内解决任何NP-完全问题)。
____________________________________________________________ | 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
“是”或“否”条目说明:
同样是P的NP问题可以在P时间内解决。 ** np -难问题,也是np -完全问题,在P时间内可验证。 *** np -完全问题(所有这些都构成了NP-hard的子集)可能是。其余的NP困难则不是。
我还发现这个图非常有用,可以看到所有这些类型是如何相互对应的(请更加注意图的左半部分)。