P,NP,NP-hard,NPC

P问题是一类问题,它们可以找到一个多项式复杂度的确定性算法。
这意味着,在给定有限的资源(计算机)内,资源运用该算法能在多项式时间内得到问题的正确解。

NP问题要比P问题更加广泛,它定义为一类问题,它们可以找到多项式复杂度的非确定算法。
P属于NP,即如果一个问题可以找到多项式复杂度的确定性算法,那一定有多项式复杂度的非确定性算法。
然而NP属于P却并没有证明,因为对于一个NP问题,我们只是找不到一个多项式复杂度的确定性算法,但并不能说一定不存在。
当然这也就是说NP=P尚未被证明。

NP问题通常要比P问题难,它意味着有限的资源内找不到一个算法能在多项式时间内解决。
于是在理论上把资源扩充到需要多少有多少。采用这样一种办法,用某种技术一步步地猜测,最后检验猜测结果,看是否是符合条件的正确解。
由于这种办法是猜出来的,因此每次运行过程都存在随机性,并且由于资源数也是不确定的,因此这种办法叫做非确定性算法。这种算法要对猜测的

最终结果进行检验,看是否符合,就是判断yes或no的问题。因此非确定性算法是决策性问题(decision problem)。
非确定算法的过程中每一步猜测都可能有许多种可能,正是由于可能性太多,因此确定性算法在多项式复杂度内完成才变得困难。然而非确定算法是

在有无限多资源的基础上的,因此在每一步的猜测上,可以分配有可能性个数那么多的计算机来同时计算,因此每次猜测时间代价就是1.然后再继续

进行下一步,每种可能性下又分出许多可能性,由于资源足够分配,得到结果又只用时间代价1.算法的运行过程可以用树的形式来看。每猜一步就算一层。在一层中,总有一个节点是位于正确解的路径的。因此只要树的层数是多项式复杂度的,或者说到达正确解(并加以验证)的层数是多项式复杂度的,那就说这

个非确定性算法是多项式复杂度的。

更准确的说,产生解的过程是多项式复杂度的,验证解的过程也是多项式复杂度的,那么这个非确定性算法是多项式复杂度的。

要构造一个非确定性算法,通常来说产生随机解的过程较简单,关键在于产生多项式复杂度的验证解的过程。因此非确定算法的复杂度常常集中于验证解过程。所以NP问题另一种解释是能找到在多项式时间内验证一个解的正确性的算法的问题。

分析非确定性算法的时间复杂度:

在这无数的并行计算中,我们只关心从开始节点到输出正确结果的那个节点之间的正确解生成路径。这段时间就是该非确定性算法的运行时间,因为输出正确解后一切计算都停止了。从分析算法上直观来看,可以把每一个猜测步骤的结果当作正确结果,每个产生猜测值的语句就相当于对应的赋值语句,复杂度为O(1)。这个算法执行完毕的时间就是该非确定性算法运行的时间。

 

NP-hard问题是一类问题,所有的NP问题都能多项式归约到它。但NP-hard问题不一定是NP问题,如停机问题。所有NP问题都能通过多项式归约将输入转化来做停机问题的输出,最后得到同样的yes/no结果。方法比如设置布尔变量为真使其循环就不会停机,为假就退出循环而停机。这样多项式归约算法就构造好了。然而停机问题并不是NP问题因为它对于随机的输入是不可验证的(以上构造输入只是很小的真子集),也就是说验证过程无法在多项式时间完成,所以不是NP问题。

NP-complete就是即是NP-hard又是NP的那类问题。由于NP-hard的归约性质,如果NPC解决了,那所有的NP问题也就解决了。

 

NPC的证明:

Cook证明了满足性问题是NPC的。我们证明NPC的方法只需要借助已知NPC的力量而不必再像Cook一样繁琐的证明。

要证明Q问题是NPC的,首先要选择一个已知的NPC问题P,通过一个多项式时间的变换函数T,将P的input转化交给Q的input,如果P,Q的结果能产生同样的yes和no(即有P<pQ,P能多项式规约到Q),那么Q问题就是一个NP-hard问题。

原因是如果Q能有一个多项式时间的算法,那么Q+T也是多项式时间的,而这个整体与P产生了同样的效果,即P可以有多项式时间的算法。而原条件是P为NPC的,所以Q不存在多项式时间算法。

然后再证明Q是NP的即可。

证明一个问题是NP的,要举出其input,说明其验证input的合法性和正确性的过程是多项式时间的,即可。

 


你可能感兴趣的:(算法,input)