P和NP问题
首先,他们都是对算法问题的复杂程度进行归类的。也就是比较时间复杂度。直观理解,目的在于评价问题的难度。哪些比哪些更难?
首先我们先要定义什么是难,什么是简单?
时间复杂度:随着输入规模(n)变大,所需要的操作数的增速。
如O(n^2)表示随输入规模,所需要的操作数平方地增长。其中O表示这个算法的时间复杂度不高于某某(也就是最差不会差于)
假如O里面是一个多项式,比如
a
0
+
a
1
n
1
+
a
2
n
2
+
.
.
.
a_0 + a_1 n^1+ a_2 n^2 + ...
a0+a1n1+a2n2+...
就称复杂度是多项式时间的。假如某个问题存在多项式时间内求解的算法,就认为这个算法是简单的。
P(polynomial)问题:可在多项式时间求解的问题。
NP(Non-determinisc Polynomial)问题:可在多项式时间内验证的问题。
NP问题的回答只是YES or NO,就是给定一个解,判断是不是对的。
字面理解的话,Non-determinisc的意思就是非确定性的,也就是不是给出一个确定的解,而只是验证解。
首先,P问题肯定要比NP问题简单,因为既然已经得到了解,那么很容易就能验证那个解了。此外,所有的P问题都是NP问题,即P问题包含于NP问题。
但是NP问题不一定是P问题。N==NP?是世界七大难题之一。
NP-hard和NP-complete问题
在某次研讨会上,有位数学家大佬给出了一堆证明,证明了所有的NP问题都可以在多项式时间内转化为某一个问题。
NP-hard问题:存在某个问题,所有的NP问题都可以在多项式时间内转化为该问题,这个问题被称为NP-hard问题。
为什么叫NP-hard呢?因为假如所有NP问题都能转化为该问题,那么当该问题得到解决以后,所有的NP问题都被解决了。但是目前就人类的水平来说,仍然存在着许多不能解决的NP问题。有人就猜测,它们之所以不能被解决的原因,正是由于这个NP-hard问题是难的,所以其他问题才没法解决。也就是说,NP-hard比其他所有NP问题都难,或者至少一样难。(直观的理解,NP-hard这个问题是所有NP问题的难点所在。)
但是应该指出,NP-hard问题本身不一定是NP问题。所以就引出了NP完全问题。
NP完全问题(NP-Complete):存在某个NP问题,所有的NP问题都可以在多项式时间内转化为该问题,这个问题被称为NP完全问题。
所以NP完全问题只是比NP-hard多了一个条件,即它自己也得是NP问题。
他们的包含关系大致是这样的(不一定正确):