NP-C问题

在研究NP问题的过程中找到了一类非常特殊的NP问题,也即NP-完全问题(NP-C问题)。

在谈及NPC问题前,先讨论一下“归约”的概念,编码实践中归纳出的设计模式中的里氏替换原则与它有着相似的地方。

里氏替换原则要求充分发挥继承的特性:
1、子类必须完全实现父类的方法
2、子类可以有自己的个性
3、覆写或实现父类方法时输入参数可以被放大
4、覆写或实现父类方法时输出结果可以被缩小
在可计算性理论与计算复杂性理论中,所谓的归约是将某个计算问题转换为另一个问题的过程。可用归约的方法定义某些问题的复杂度类。即如果问题B存在有效的解决算法,并且该算法也可以作为解决问题A的算法,那么问题A就可归约到问题B,因此求解问题A不会比问题B的求解更困难。


image.png

当问题A可归约为问题B时,有一个直观的意义就是,问题B的时间复杂度高于或者等于问题A的时间复杂度。为什么这么说呢?
如果问题A能用问题B的算法解决,并且问题A的时间复杂度还比问题B的时间复杂度高,那么问题A的算法就可以改进为B算法,这样两者的时间复杂度就是相等的,所以有了上面的“直观意义”。
正如解一元二次方程比解一元一次方程难,因为解决前者的方法可以用来解决后者。即一元一次方程可归约为一元二次方程。
规约的标准概念:如果能找到这样一个变化法则,对任意一个程序A的输入,都能按照这个法则变换成程序B的输入,使两程序的输出相同,那么我们说问题A可归约为问题B。我们所说的“可归约”是指可多项式的约化,即变换输入的方法,问题的解决也是在多项式时间内解决的,只有这样才是有意义的。
可以看到,一个问题约化为另一个问题,时间复杂度增加了,问题的应用范围也增加了。通过对某些问题的不断约化,能够不断地寻找时间复杂度更高,但应用范围更广的一类问题的算法去替代时间复杂度低,但只能用于很小的一类问题的算法。
同时因为约化具有传递性,很容易想到对于所有的NP问题,能否最后归约到一个超级大的NP问题?解决了这个超级NP问题,那么所有的NP问题都能得到解答。问题的答案居然是肯定的,更加不可思议的是,这种超级NP问题不止一个,它有很多,它们是一类问题,这类问题就是NPC问题。
NPC问题的出现使得整个NP问题的研究得到了飞跃式的发展,我们有理由相信NPC问题是最复杂的NP问题。
如果能为任意一个NPC问题找到一个多项式的高效算法,我们就可以认为P=NP,就是因为那么多的NPC的问题至今没有一个问题能找到一个多项式的算法,使得人们普遍认为P≠NP。
更直观的讲什么是NPC问题:一个NP问题不存在多项式的高效算法时,应该说它可能属于NPC问题。为什么这样讲?因为NPC问题的第二个条件不被满足,第二个条件是什么后面会说到。
假使一个NPC问题存在一个多项式的高效算法时,即所有的NP问题都可以找到了一个多项式的高效算法,那么这个问题变成了P问题,那么P=NP。
关于NPC问题的定义需要满足下面两个条件:1、它是一个NP问题。 2、所有的NP问题都可以约化到它。要证明一个问题是NPC问题,先证明这个问题属于NP问题,再证明一个已知的NPC问题可以约化到它。这样就可以说它是NPC问题了。那么第一个已知的NPC问题是怎么来的呢?
逻辑电路问题是第一个NPC问题,它是这样描述的:给定一个逻辑电路,问是否存在一种输入使输出为True。
条件一:对逻辑电路给定一种输入,可以在多项式时间内进行验证,所以属于NP问题。

逻辑电路.jpg

当输入1、输入2、输入3分别输入true、true、false或false、true、false或true、false、false时输出为true
有输入无论如何都不会为true的逻辑电路嘛?有的


逻辑电路2.jpg

上面的逻辑电路无论输入什么,输出总为false,
逻辑电路属于NPC问题是有严格的证明的。首先它是属于NP问题的,对给定的一个输入可以在多项式的时间内进行验证。其次也可以证明所有的NP问题都能约化到它,不要认为NP问题有无穷多个将给证明造成不可逾越的困难,证明过程相当复杂,大概意思是讲,任意一个NP问题的输入和输出都可以转换为逻辑电路的输入和输出(计算机内部的0 1运算),因此对于一个NP问题来说,问题转化为了求满足结果为True的一个输入(即一个可行解)。
有了第一个NPC问题,一大堆NPC问题就出现了,后来Hamilton回路问题成了NPC问题,TSP问题也成为了NPC问题,这么多NPC问题,任何一个NPC问题找到了多项式算法的话,我们就说P=NP,也正是因为NPC问题的存在使得P=NP变得难以置信。!

P与NP问题的参考博文

你可能感兴趣的:(NP-C问题)