天天看点

P/NP/NPC/NP-hard

要说起P和NP是什么东西,得先从算法的多项式时间复杂度谈起: 

 时间复杂度是指执行算法所需要的计算工作量。 时间复杂度并不是表示一个程序解决问题需要花多少时间,而是当问题规模扩大后,程序需要的时间长度增长得有多快。

如果一个算法,它能在以输入规模为参变量的某个多项式的时间内给出答案,则称它为多项式时间算法。 

P/NP/NPC/NP-hard

 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类不交。 

P/NP/NPC/NP-hard

  1. 若A ∈ NP,则 A 存在非多项式时间算法(猜测解、验证解) 
  2. 对猜测解、验证解的过程进行分析,构造一个SAT问题 。

继续阅读