![f9f25d0d4bae89e1e98de34094fe6a3d.png](https://i-blog.csdnimg.cn/blog_migrate/d723aa502f068bef9bfa492c43d93030.jpeg)
P 问题
P类问题(P:polynominal,多项式):存在多项式时间算法的问题。以排序为例,在排序这个大问题里,是可以找到一种时间复杂度为多项式o(n^2),o(nlogn)的算法(如冒泡排序法,快速排序)来求解排序问题的,所以我们说排序问题是一个有多项式时间算法的问题。所以我们称,P类问题就是存在多项式时间算法的问题。
时间复杂度:o(1)<o(n)<o(nlgn)<o(n^2)<o(n^a)<o(e^n)<o(n!)
多项式级别:o(1)<o(n)<o(nlgn)<o(n^2)<o(n^a)
非多项式级别:o(e^n)<o(n!),计算机难以承受
NP 问题
NP类问题(NP:Nondeterministic polynominal,非确定性多项式):能在多项式时间内验证得出一个正确解的问题。P类问题是NP问题的子集,因为存在多项式时间解法的问题,总能在多项式时间内验证他。
著名的NP类问题举例:
旅行家推销问题:即有一个推销员,要到n个城市推销商品,他要找出一个包含所有n个城市的环路,这个环路路径小于a。我们知道这个问题如果单纯的用枚举法来列举的话会有(n-1)! 种,已经不是多项式时间的算法了,(注:阶乘算法比多项式的复杂)。那怎么办呢?我们可以用猜的,假设我人品好,猜几次就猜中了一条小于长度a的路径,我画画,好的,我得到了一条路径小于a的环路,问题解决了,皆大欢喜。可是,我不可能每次都猜的那么准,也许我要猜完所有种呢?所以我们说,这是一个NP类问题。也就是,我们能在多项式的时间内验证并得出问题的正确解,可是我们却不知道该问题是否存在一个多项式时间的算法,每次都能解决他(注意,这里是不知道,不是不存在)。
NPC 问题
NPC类问题(Nondeterminism Polynomial complete):存在这样一个NP问题,所有的`NP`问题都可以约化成它。换句话说,只要解决了这个问题,那么所有的NP问题都解决了。其定义要满足2个条件:
- 它得是一个NP问题;
- 所有的NP问题都可以约化到它。
要证明NPC问题的思路就是: 先证明它至少是一个NP问题,再证明其中一个已知的NPC问题能约化到它。
NPH 问题
NP难问题(NP-hard问题):它满足NPC问题定义的第二条但不一定要满足第一条(就是说,NP-Hard问题要比 NPC问题的范围广,NP-Hard问题没有限定属于NP),即所有的NP问题都能约化到它,但是他不一定是一个NP问题。
NP-Hard问题同样难以找到多项式的算法,但它不列入我们的研究范围,因为它不一定是NP问题。即使NPC问题发现了多项式级的算法,NP-Hard问题有可能仍然无法得到多项式级的算法。事实上,由于NP-Hard放宽了限定条件,它将有可能比所有的NPC问题的时间复杂度更高从而更难以解决。
![7b9b078b1ef7559088c7f0f23b72a96e.png](https://i-blog.csdnimg.cn/blog_migrate/01045cb6d1a5fe9609591c566b3afc8d.jpeg)