P、NP、NP-Complete、NP-Hard问题

P问题

如果一个问题在多项式时间复杂度内能够解决,即求出正确答案,那么这个问题就是P问题

多项式时间复杂度是指O(1)、O(n)、O(nlogn)、O(n^2)、O(n^3)...O(n^a)等

指数复杂度O(a^n)和阶乘O(n!)复杂度属于非多项式时间复杂度

直观的理解,如果一个问题是多项式复杂度,则可以使用计算机很快求出来,如果是非多项式复杂度则随着数据规模增大,使用计算机都需要大量的时间,上年,几十年,甚至几百年更大

一般我们面向的问题都是P问题,包括简单的排序、查找,动态规划等问题

NP问题

对于一个问题,如果给定一个解法,在多项式时间复杂度内能够验证这个解法是否正确,那么这个问题就是NP问题

显然,验证一个解远比求出一个正确解所需要的时间要少。验证属于逆向思维,通过代入求解,只需求解一次,正向求解需要从条件本身出发一步一步求出最后结果

比如学习算法时经常有这样的练习题:找到一个数,这个数某几位和某几位经过一些运算法则,得的预期的结果。对于这样的问题,如果给定一个数,那么直接按照约定规则判定即可,可以一步到位,时间复杂度为O(1),即为NP问题

P问题肯定属于NP问题,因为一个问题已经可以在多项式复杂度内解决,那么就一定可以在多项式复杂度内验证一个解;反之,NP问题则不一定是P问题,NP问题的定义范围要比P问题大,比如存在一种指数复杂度O(a^n)或阶乘O(n!)复杂度问题,它属于非多项式时间复杂度,在多项式时间内可以验证一个解,但无法求出正解,此时该问题是NP问题,但不是P问题

NP=P问题

相对解决P问题和NP问题,一个更具有挑战性的问题是能否将NP变为P问题,即NP=P,若能找到一种方法将NP问题变为P问题,将会大大地推动数学研究的进步,借助计算机,以前很多不可能的问题将会快速解决,极大解放生产力

数学家认为:解决NP=P问题的核心在于归约,即将一个问题A转换为求问题B,问题B又可转换为求问题C,依次下去,所有的NP问题最终都可以转换为一个最大的问题,只要证明这个最大的问题可以转换为P问题,问题就解决了

NPC(NP-Complete)问题

在研究NP=P的过程中,如果找到的这个最大的问题本身也是一个NP问题,那么这个问题就是NPC问题

NPH(NP-Hard)问题

在研究NP=P的过程中,如果找到的这个最大的问题不一定是NP问题(不一定在多项式复杂度内验证一个解是否正确),那么这个问题就是NPH问题

NPH问题是目前最难的问题,也就是目前的技术条件下,你无法在规定时间内求出它的正确解法,比如TPS旅行商问题(经典的排列组合),当城市数量规模较大时,组合数将是天文数字,根本就无法比较所有的可能方案,所以会有遗传算法、退火算法的等智能优化算法,其目的都是在有限的时间内找到较优解,即使你输出了一个解,但也无法证明它是最优的,因为你没有遍历所有的情况,只能说这个解是算法运行过程中产生的有限组合中的最优解法

你可能感兴趣的:(其他,动态规划,算法,线性代数)