P类问题: 即可以找到多项式级别的算法来解决它。
NP类问题: 不能找到多项式级别或者不知道能否找到多项式级别的算法来解决它,但是可以对其一个问题的解在多项
式时间内进行验证,此类问题称为NP类问题。显然,P类问题属于NP类问题,但两者是否相等,即P=NP?是尚未解
决的难题。
NPC类问题:即NP-complete问题,此类问题包含两个条件。(1)首先它是一个NP问题;(2)所有的NP问题均可以归化
为这个问题。证明过程应该先证明此类问题是一个NP问题,然后其中一个已知的NPC问题都可以归化为它即可。对
于第二步,主要是利用的归化的传递性,一个已知的NPC问题,肯定是由所有的NP问题可以归化而来的,若这个已
知的NPC问题可以归化为另一个问题,那么这个问题一定也是NPC问题。
既然所有的NP问题都能归化为NPC问题,那么只要任意一个NPC问题找到了一个多项式的算法,那么所有的NP
问题都能用这个算法解决了(可根据归化的定义得到)。但是,给NPC问题找到一个多项式算法几乎不可能,所以“正是
NPC问题的存在,使多数人相信P≠NP”。NPC问题只能用指数级甚至阶乘级复杂度搜索。
NP-hard问题: 它满足NPC问题定义的第二条但是不满足第一条,即NP-hard问题要比NPC问题的范围广。NP-hard问
题同样难以找到多项式级的算法,且它不一定是NP问题。即使NPC问题发现了多项式级的算法,NP-hard问题可能仍
然无法得到多项式级的算法。
归化(Reducibility)的概念:如果能找到一个变化规则,对任意一个程序A的输入,都能按这个法则变化成程序B的输
入,且两程序的输出相同。那么可以说问题A可归化(或者说“约化”)为问题B。归化具有传递性:若问题A可归化为问题
B,问题B可归化为问题C,则问题A可归化为问题C。
另外,归化的一个重要的意义是:归化问题的时间复杂度往往不低于被归化问题的时间复杂度。即对于上述描述,有O(A)≤O(B)≤O(C)。