- 如果一个问题存在一个能在多项式的时间里解决它的算法,那么这个问题就属于P问题,如冒泡排序。
- NP问题不是非P类问题,是指可以在多项式的时间里验证一个解是否正确的问题。
- P问题存在多项式时间的算法来找到问题答案,因此肯定可以在多项式时间内验证一个解是否正确,所以P问题集合肯定是NP问题集合子集。
- 但是,是不是所有NP问题都存在能在多项式时间内寻找到答案的算法呢?也就是NP是不是包含于P,继而NP=P呢?如,汉密尔顿回路,目前而言,能在多项式时间内验证一个解是否正确,但是,目前尚未发现能在多项式时间内找到回路的算法。所以,该问题目前来讲是个NP问题,尚未进入P问题的行列。未来,能否找到该问题的多项式时间算法,尚不可知。
- NPC问题的出现,使得很多研究者认为NP!=P。
- 约化:如果一个问题p1能够将其“放大”成为一个更为一般的问题p2,则如果找到了p2的解法,则p1可解。比如如果知道一元二次方程的解法,一元一次方程解法也就有了,因为只要把一元二次方程二次项的系数设置为0,就是一元一次方程的解法了。这个从“小”到“大”,从“特例”到“一般”的过程就是约化。显然,大问题时间复杂度肯定比小问题时间复杂度高。
- 实际上,是能够找到通吃若干小NP问题的大NP问题的,甚至是通吃所有NP问题的超级NP问题,这些超级NP问题就是NPC问题,NPC问题数量很多。找到一个NPC问题的多项式时间解法,则所有NP问题就都找到了多项式时间解法。
- NPC问题的定义:一、它是一个NP问题;二、“所有”NP问题都可以约化到它。
- NPC问题的证明:第一步,证明其是一个NP问题;第二步,证明一个“已知的NPC问题”能够约化到它。逻辑电路问题是一个已证明的NPC问题(给定一个逻辑电路,问是否存在一种输入使输出为True,这即逻辑电路问题),随后就衍生了一大堆NPC问题。
- NP-hard问题:满足NPC问题定义的第二条,但不满足第一条。即使NPC问题发现了多项式级的算法,NP-Hard问题有可能仍然无法得到多项式级的算法。事实上,由于NP-Hard放宽了限定条件,它将有可能比所有的NPC问题的时间复杂度更高从而更难以解决。