请您思考:
1、哪个是基础问题?
2、如果从集合的角度考虑,它们会是什么关系?
3、区别它们关系的核心是什么?
一、相关知识
1、复杂度有两种级别
多项式级别:类似于 ,规模 出现在底数的位置,我们称为多项式级的复杂度
非多项式级别:类似于 ,规模 出现在底数的位置,我们称为非多项式级的复杂度
非多项式复杂度 远远大于多项式复杂度。
2、规约(Reducibility)
使用规约,最重要的是找到一个规则,用这个规则来规约父问题和子问题。
1、含义
一个问题A可以规约为问题B的含义即是,可以用问题B的解法解决问题A,或者说,问题A可以“变成”问题B。直观意义:
,也就是说,问题A不比问题B难。
这很容易理解。既然问题A能用问题B来解决,倘若B的时间复杂度比A的时间复杂度还低了,那A的算法就可以改进为B的算法,两者的时间复杂度还是相同。正如解一元二次方程比解一元一次方程难,因为解决前者的方法可以用来解决后者。
2、举例
现在有两个问题:求解一个一元一次方程和求解一个一元二次方程。那么我们说,前者可以约化为后者,意即知道如何解一个一元二次方程那么一定能解出一元一次方程。我们可以写出两个程序分别对应两个问题,那么我们能找到一个“规则”,按照这个规则把解一元一次方程程序的输入数据变一下,用在解一元二次方程的程序上,两个程序总能得到一样的结果。这个规则即是:两个方程的对应项系数不变,一元二次方程的二次项系数为0。按照这个规则把前一个问题转换成后一个问题,两个问题就等价了。
二、概念介绍
1、P问题
如果一个问题可以找到一个能在多项式复杂度里解决它的算法,那么这个问题就属于P问题。
2、NP问题
NP问题是指可以在多项式复杂度里验证一个解的问题。NP问题的另一个定义是,可以在多项式的复杂度里猜出一个解的问题。
3、NPC问题(NP完全问题)
(1)同时满足:
- 得是一个NP问题;
- 所有的NP问题都可以约化到它。
(2) 举例
旅行商问题和集合覆盖问题都是NP完全问题。
(3)如何识别NP完全问题
元素较少时算法的运行速度非常快,但随着元素数量的增加,速度会变得非常慢。
涉及“所有组合”的问题通常是NP完全问题。
不能将问题分成小问题,必须考虑各种可能的情况。这可能是NP完全问题。
如果问题涉及序列(如旅行商问题中的城市序列)且难以解决,它可能就是NP完全问题。
如果问题涉及集合(如广播台集合)且难以解决,它可能就是NP完全问题。
如果问题可转换为集合覆盖问题或旅行商问题,那它肯定是NP完全问题。
4、NP-Hard问题
它满足NPC问题定义的第二条但不一定要满足第一条(就是说,NP-Hard问题要比 NPC问题的范围广)
三、四者关系
很显然,所有的P类问题都是NP问题。也就是说,能多项式地解决一个问题,必然能多项式地验证一个问题的解——既然正解都出来了,验证任意给定的解也只需要比较一下就可以了。
关键是,人们想知道,是否所有的NP问题都是P类问题(注意:跟“所有的P类问题都是NP问题”表述的顺序是不同的)。
我们可以再用集合的观点来说明。如果把所有P类问题归为一个集合P中,把所有 NP问题划进另一个集合NP中,那么,显然有P属于NP。现在,所有对NP问题的研究都集中在一个问题上,即究竟是否有P=NP?通常所谓的“NP问题”,其实就一句话:证明或推翻P=NP。
从NPC定义上看,所有的NP问题都能约化成NPC问题,那么只要任意一个NPC问题找到了一个多项式的算法,那么所有的NP问题都能用这个多项式复杂度算法解决了,同时,P问题也是多项式复杂度算法解决的,所以NP也就等于P 了。因此,给NPC找一个多项式算法太不可思议了。那么,前文说,“正是NPC问题的存在,使人们相信P≠NP”。我们可以就此直观地理解,NPC问题目前没有多项式的有效算法,只能用指数级甚至阶乘级复杂度的搜索。
四、总结
所有P问题都是NP问题,反之则不一定。npc问题是np问题的子集,也是p问题和np问题的差异所在。如果找到一个多项式内能被解决的npc问题的解决方法,那么P=NP。