要说起P和NP是什么东西,得先从算法的多项式时间复杂度谈起:
时间复杂度是指执行算法所需要的计算工作量。 时间复杂度并不是表示一个程序解决问题需要花多少时间,而是当问题规模扩大后,程序需要的时间长度增长得有多快。
如果一个算法,它能在以输入规模为参变量的某个多项式的时间内给出答案,则称它为多项式时间算法。
P类问题的概念:如果一个问题可以找到一个能在多项式的时间里解决它的算法,那么这个问题就属于P问题。
NP就是Non-deterministic Polynomial的问题,也即是多项式复杂程度的非确定性问题。
NP问题不是非P类问题。
NP问题是指可以在多项式的时间里验证一个解的问题。NP问题的另一个定义是,可以在多项式的时间里猜出一个解的问题。
所有非确定多项式问题的集合用NP表示.很显然所有的P类问题都是NP问题。
Cook 在1971年给出并证明了有一类问题具有下述性质:
(1)这类问题中任何一个问题至今未找到多项式时间算法;
(2)如果这类问题中存在一个问题有多项式时间算法,则这类问题都有多项式时间算法
这类问题就是所谓的NP完全问题。
NP完全问题:如果任何一个NP问题都能通过一个多项式时间算法转换为某个NP问题,那么这个NP问题就称为NP完全问题。 NPC问题的定义非常简单。同时满足下面两个条件的问题就是NPC问题。首先,它得是一个NP问题;然后,所有的NP问题都可以约化到它。
(一个问题A可以约化为问题B的含义即是,可以用问题B的解法解决问题A,或者说,问题A可以“变成”问题B。)
证明一个问题是NPC问题也很简单。先证明它至少是一个NP问题,再证明其中一个已知的NPC问题能约化到它,这样就可以说它是NPC问题了。第一个被证明是NPC问题是3SAT问题。NP困难(NP-hard,non-deterministic polynomial-time hard)问题是计算复杂性理论中最重要的复杂性类之一。某个问题被称作NP困难,当且仅当存在一个NP完全问题可以在多项式时间归约到这个问题。
因为NP困难问题未必可以在多项式的时间内验证一个解的正确性(即不一定是NP问题),因此即使NP完全问题有多项式时间内的解,NP困难问题依然可能没有多项式时间内的解。因此NP困难问题“至少与NPC问题一样难”。
1)对于判定问题A,若A∈NP且NP中的任何一个问题可在多项式时间内归约为A,则称A为NP完全问题(NP-Complete或NPC).可以表示为A ∈ NPC.
2)对于判定问题A,若NP中的任何一个问题可在多项式时间归约为判定问题A,则称A为NP困难问题(NP-hard 或NPH) .可以表示为A ∈ NPH.
NPC和NP-hard两者的区别是: 验证一个问题A是否为NP-hard无须判断A是否属于NP. 根据定义可知NPC ∈ NPH.
NP-hard不一定是NP,比NPC问题的范围广。
NPC是NP问题,是NP-hard问题。
当已知一个问题属于NPC或NPH时,如果再遇到一个新问题:
1)若已知问题多项式归约为新问题,则新问题属于NPH;
2)若还可以验证新问题属于NP,则新问题属于NPC。
每个NP问题,可以规约到NPC,不严格的讲,NPC是NP类中“最难”的问题,也就是说它们是最可能不属于P类的。所以,若任何一个NPC的问题在P内,则可以推出P = NP。不幸的是,很多重要的问题被证明为NPC问题,但没有一个有已知快速的算法,即不是P问题。计算机科学家现在相信P,NP,和NPC类之间的关系如图中所示,其中P和NPC类不交。
任何一个NP问题可以多项式归约为SAT。
基本思想: