直观理解P问题,NP问题,NP-hard问题,NP-Complete问题

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问题。

他们的包含关系大致是这样的(不一定正确):
直观理解P问题,NP问题,NP-hard问题,NP-Complete问题_第1张图片

你可能感兴趣的:(#,算法与数据结构,算法,机器学习,python)