NP-Completeness理解

今天大年初一,哪里也没去,在家里从新看了下IOA的NP问题。感受看明白了。算法

首先定义下:app

所谓P问题是指全部能在多项式复杂度解决的问题,好比排序算法,n*n复杂度解决问题。函数

有些问题目前没有多项式复杂度的解决方案,可是若是你给我一个解决方案,我能够在多项式时间内验证该算法是否正确。好比说bool表达式的可知足性问题,给我一个表达式,虽然我不能在多项式时间内判断它是否可知足,可是若是你给我一个答案,我能判断这个答案的正确性。这类问题就是NP问题。优化

P属于NP。这是很明显的。ui

那么P是否等于NP呢?目前看,不等于。由于存在一类NP彻底的问题。排序

NP彻底问题是NP中的一类问题,若是知足如下两个条件,那么咱们说L是NP彻底的:L是NP问题;全部的NP问题均可以“多项式归结”为L。内存

----------------------------------------------------ci

先定义什么是问题?问题就是一个映射,把“instance”(输入)映射到“solution”(输出)。it

各类问题的输出千差万别,不便于讨论,统一下,都输出true和false。这就是断定型问题,decision problem。其余那些寻找最优解的叫优化类问题。全部优化类问题均可以转变成断定型问题。io

接着是语言。既然一个问题P输出都是true或者false,若是集合L中的全部instance都让P输出true,那么咱们说P 接受L。这里有一个很重要的转变,就是把一个抽象的问题,变成了一个instance的集合。两个问题是难以相等或者转换的,可是两个集合是能够的,mapping。基于这个mapping就能够定义多项式归结。

----------------------------------------------------

什么是多项式归结?也有两层含义:

给定两个算法,A和B。x是A输入,f是一个映射函数,能把x映射成B的输入。含义1:A(x)==B(f(x));含义2:f(x)是多项式复杂度。

-------------------------------------------------------------

而后咱们要寻找一个NP彻底问题,这个问题就是Circuit-SAT。它的意思是给任意一个集成电路,判断该电路是否会输出1.咱们知道集成电路都是有若干管脚做为输入,几个管家做为输出的。这里简单起见,只有一个输出。若是咱们发现一个电路只能输出0,那么咱们可能发现了一个bug,或者简单的把它替换成常数。

怎么证实呢,从定义出发,先证实它是NP的,再证实全部的NP问题均可以归结到它(任意一个算法的输入实例均可以在多项式时间里变成一个集成电路)。

-------------

它是NP的,就是要证实存在算法A,给输入x(某个集成电路),y(某种输入方式),能够判断y是否知足x。这个复杂度是线性的,知足多项式复杂度的要求。

-----------

全部的NP问题都能归结到Circuit-SAT的问题吗?这又要解决两个问题:

1. 是否存在一个映射函数F,使得任意算法的输入x都能变成等价的一个集成电路C;

2.F是不是多项式的复杂度;

先看第一个问题,可否找到这样的F呢。下面的描述就是为了构造这个F。假定咱们要把算法W归结到Circuit-SAT。W算法的验证算法是A,给定x和y,能够判断输入为x时,y是不是一个正确的答案。举个例子,W是要判断图中是否存在长度为K的路径,x表明图的数据结果,y表明最长路径的各条边,那么A是验证的算法。

若是咱们把系统内存当成一个变量,那么每条指令的执行都会将一个内存快照(conf)变成另一个(conf),咱们能够认为这个映射是一个circuit完成的。

因为A(x,y)是多项式复杂度,因此conf的个数是多项式个。咱们把这全部的集成电路组合起来,造成一个新的集成电路C。这样咱们就把x变成了C。

也就是说,对于W而言,验证算法A(x,y)=1,当且仅当B(C,y)=1.其中B是验证集成电路的可知足性算法。

-------------

F已经找到了,那么F是不是多项式复杂度的呢?首先x是多项式的,内存大小是多项式的,集成电路个数等于执行的指令数,也是多项式的,多项式组合在一块儿,仍是多项式的。

--------------

这就证实了全部NP问题都能归结到circuit-sat问题。

其实这里还有一个language的问题,我貌似还没看懂。

------------------------------------------------------------

如何判断一个问题是NP-hard的呢,若是一个NP彻底的问题可以归结到该问题,(无论他是否是NP问题),它都是NP-hard。

因为咱们已经找到了一个NP彻底问题circuit-sat,对于目标问题W,只须要把circuit-sat问题归结到W的输入便可证实W是NP-hard的问题。这就很容易证实不少算法都是NP的。好比说Boolean表达式的可知足性。后续将会继续讨论。

 

首先

相关文章
相关标签/搜索