NP问题

复杂性理论中最具有理论意义的当数NP完全性问题(NPC问题)。所谓“NPC完全性(NP-completeness)”问题是这样一个问题:由于“P=NP是否成立”这个问题难以解决,从NP类的问题中分出复杂性最高的一个子类,把它叫做NP完全类。

已经证明,任取NP类中的一个问题,再任取NP完全类中的一个问题,则一定存在一个具有多项式时间复杂性的算法,可以把NP类问题转化为NP完全类问题。这就表明,只要能证明NP完全类中有一个问题是属于P类的,也就证明了NP类中的所有问题都是P类的,即证明了P=NP。
已经被证明的NPC问题有哪些?

1. 团问题
每一对顶点之间都有一条边连接起来,这样的结构称为团。求最大团问题是NPC问题。
2.顶点覆盖问题
确定某个点后,与这个点相连接的顶点都称为被该顶点覆盖了。求最少个数确定点使整个图都被覆盖问题也是NPC问题。
3.哈密尔顿回路问题
找到一条路,将一个图上的所有顶点,不重复的走一遍,再回到起点。也是NPC问题。
4.旅行商问题
和哈密尔顿回路问题差不多,就是每条边上增加了一个权值。同样是NPC问题。

如何证明一个问题是否为NPC问题?

1.首先证明该问题为NP问题,即多项式时间内可验证的。
2.找到一种NPC问题以及一种多项式时间内的规约算法,将NPC问题规约为待证问题。

另外,把NP类问题的补集视为co-NP,那么是否有co-NP=NP?一般认为有如下关系
在这里插入图片描述
何为NP困难问题(NP-hard)?NP-hard定义是这样的:

1.如果所有NP问题在多项式时间内都能规约到此问题;
2.但此问题不一定是NP问题。

同时已经证明了,所有的NP类问题都可以多项式规约到任何一个NP-hard问题。正如上文中提到“只要能证明NP完全类中有一个问题是属于P类的,也就证明了NP类中的所有问题都是P类的”。那么,此处也可利用NP-hard与NPC问题的关系将NPC问题进行转换,可很容易验证某个NPC问题的解的正确性。

综上,在现阶段大多数理论计算机科学家们眼中的P、NP和NPC三者之间的关系是这样的,P和NPC都完全包含在NP内,且P∩NPC=∅。总之,P问题一定是NP问题,NPC问题一定为NP问题,NPC问题也一定为NP-hard问题。但是,NP-hard问题不一定为NPC问题,同样P?=NP也待证明。
在这里插入图片描述
通常可以从以下几个方面来寻求解决办法:
1.动态规划与分支限界方法:对于许多NP完全问题来说,用动态规划和分支限界方法常可以得到较高的解题效率。
2.概率分析:对于许多NP完全问题,其困难实例出现的概念率很小,因此对这类NP完全问题常可以设计出平均性能很好的算法。
3.近似算法:通常可以设计出解NP完全问题的多项式时间的近似算法,以近似解来代替最优解。
4.启发式算法:在用别的方法都不能奏效时,也可以采用启发式算法来解NP完全问题。这类方法根据具体问题的启发式搜索策略来求问题的解,在实际使用时可能很有效,但有时很难说清楚它的道理。

References:
[1] 吕国英, 李茹. 算法设计与分析(第3版)[M]. 北京:清华大学出版社, 2015. 40-41
[2] Thomas H.Cormen, Charles E.Leiserson. 算法导论[M]. 北京:机械工业出版社, 2013. 616-646
[3] 陈玉福.计算机算法设计与分析讲义,2017

以下转自知乎:
作者:王宇
链接:https://www.zhihu.com/question/27039635/answer/101730260
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

准备写个详细点的,为了避免有基础的看得烦,先简单来说:最简单的解释:P:算起来很快的问题NP:算起来不一定快,但对于任何答案我们都可以快速的验证这个答案对不对NP-hard:比所有的NP问题都难的问题NP-complete:满足两点: 1. 是NP hard的问题 2. 是NP问题接下来是比较严谨的定义:问题:对于一个包含由0和1组成的字符串集合S,以某个01字符串x作为输入,要求某个图灵机判断x在不在S里面。这里的图灵机可以先想象成平时我们用的计算机,S也可以被看成我们要解决的问题。注意我们的问题非常简单,就是要判断某个字符串x是否在某个集合S里面,下面是定义:P:有一个图灵机在多项式时间内能够判断x是否在S里面NP:有一个图灵机M,如果某个字符串x在S里面,那么存在一个验证字符串u(注意这个u是针对这个x的,而且长度必须是x长度的多项式关系),M以x和u作为输入,能够验证x真的是在S里面。NP-hard:如果某个问题S是NP-hard,那么对于任意一个NP问题,我们都可以把这个NP问题在多项式时间之内转化为S,并且原问题的答案和转化后S的答案是相同的。也就是说只要我们解决了S,那么就解决了所有的NP问题。NP-complete:一个问题既是NP-hard,又在NP里面;也就是说 1. 解决了这个问题我们就解决了所有NP问题 2. 这个问题本身也是个NP问题好,下面先来解释为什么会有人搞出来这么莫名其妙的定义。这真是说来话长。。。如果想要充分理解整个理论的动机,就逃不开理解图灵机。1. 图灵机是什么?想象你只有纸带和一个类似于打字机一样的,能够沿着纸带写0或1的自动写字装置(只能顺着纸带写不能跳跃),并且这个机器也能读在某个位置上的字符是0还是1,现在要求你用这样一套东西去实现一个算法,你会怎么做?observe,这就是计算机发明前数学家们手头的工具。粗略的说,这就是图灵机定义的来源。另外我们还需要这个机器能够记录它之前做了什么事情,比如如果用这个机器算100+111,我们需要把纸带移到个位数,再开始加法,但我们需要及其能够记住 纸带已经到个位数 这件事,这样才能达到自动化,所以这个机器应该能够保存几个状态。这时有个问题:状态的数目可以根据输入变化吗?应该是不可以的,因为如果要机器能够自动执行某个算法,我们不希望换个输入就又要把机器重新制造一遍,这样简直比单独手算每个输入还麻烦,所以状态的数量应该是在造机器的时候就定死的(常数)。好奇的同学可能会问:那么状态数量就一定不能变化吗?答案是:如果变化,就不是一个图灵机模型了;图灵机只是很多种计算模型的一种,之所以它这么出名,是因为现代计算机就是一个通用图灵机,我们天天都在用。比如如果我们允许状态的数量根据输入长度变化,那么这就变成了一个boolean circuit,这个具体是什么就不展开了。思考题:能否用上面定义的图灵机来实现一个简单的加法器呢?2. 图灵机为什么这么重要?如上所说,图灵机只是很多种计算模型中的一种。在计算理论之初,很多数学家提出过很多计算模型,图灵证明了其它很多计算模型都等价于图灵机(如果一个问题可以被其他计算模型解决,那么也可以被图灵机解决,反之亦然),时间的差距是多项式级别的(简单的理解为可忽略的差距)如果你做了上面的思考题,那么对图灵机的运作模式应该有一定的感觉了。应该可以隐约感受到:所有的算法都是可以用这样简陋的图灵机实现的。那么问题来了:有没有一个图灵机可以执行所有的算法呢?这个脑洞来源于:图灵机本身无非包含纸袋,状态,字符表(简单的看成0和1),这样一个图灵机当然可以用二进制表示成一串字符,那么我可以构造一个“超级”图灵机N,每当我要计算某个问题S,不但把x输入进去,同时也把某个图灵机M输入进去,这个超级图灵机N就可以根据M的构造模仿M的执行模式,判断x是否在S里面。如果这样一个图灵机存在,那我们就获得了可怕的力量:有一个机器可以执行任意可以用图灵机标识的的算法了(你的电脑就是这样一台机器)!3. 为什么是多项式时间对啊为什么不用指数时间或者常数时间的区别来表示两个计算模型之间的等价呢,尤其是常数时间看起来更自然啊?比如刚才的加法器,如果你试着多增加几个状态,或者不光用01来表示数字,而是用十进制表示数字,你会发现你的计算速度有了多项式时间的提升!在理论体系里面我们不希望这么微小的变化就给我们带来本质上的提升,所以我们用多项式时间定义等价。有的同学可能会问:那很大的多项式怎么办?比如几百次方之类的。。。一般来说常用的多项式算法(也就是P,能够被图灵机在多项式时间内计算),都是低次幂的。然而更合理的解释是:有的算法由于有高次幂,所以就不常用了,比如galactic algorithm,有很好的asymptotic behavior,但因为常数项太大所以从未被使用:Galactic Algorithms实用性和理论研究上确实有不同,理论研究更多的是针对某个计算模型(一般来说就是图灵积)而讲的有效率。4. 关于NP:为什么验证一个答案的正确性这么重要?因为最开始的时候都是数学家在搞这个,对于数学家来说如果有一个机器能帮助他们证明各种定理那就爽了。数学家经常干的两件事:1. 给出证明 2. 验证某个证明是不是对的。直觉上肯定验证更容易一些,但如果somehow可以证明NP=P,也就是说 验证 和 给出证明 其实在数学上是等价的,那么这个证明很可能给出了如何把 验证一个证明是否正确(NP)转化为 如何给出一个证明(P)的方法,从此以后数学家只要思考如何验证证明的正确性就能自动得到证明了,那不爽炸了。那个时候密码学的重要性只是崭露头角,但即使是在数学上的重要性,也足够让这个定义吸引人了。5. 关于NP-complete,为什么要单独把NP里最难的问题拿出来最开始的时候,大家不知道NP的定义是存在所谓 最难的 这么一个东西的,各类问题没有固定的比较标准。搞不好就没有这么一个最难的东西。直到一个叫Cook的数学家做了点CS的工作,最后还悲惨的没拿到教职,用教授的话说:“He’s in the wrong department.” 他证明了任何一个NP形式的问题都可以转换成 3SAT (某个NP问题),3SAT 就是说有n个variable,m个clause,每个clause都是某三个variable 或(|) 在一起, 最后再把所有的clause 和(&) 在一起, 问题是:“有没有一种对于这n个variable的取值可以让整个boolean formula的值为true?” 3SAT 这个问题的优点在于它非常的直观清晰。最开始这篇文章没得到什么重视,直到一个非常出名的计算机科学家Levin看到了这篇文章,突然意识到如果这么多问题都等价于 3SAT 问题,那这就很好地揭示了为什么之前那么多算法问题都找不到快速的(多项式级)算法,因为都和3SAT一样难嘛;另外可以用 3SAT 作为对各种计算问题的分界线,那以后只要发现是NP-complete的问题,大家就不用对于每个问题找解法了。由此衍生了很多对于complexity class的研究,而cook-levin这种把NP问题化为3SAT的思想一次又一次起到了至关重要的作用。6. 常见误区:NP=指数级算法?不是的。NP强调的是:易于验证答案的正确性而指数级算法是指得:存在一个图灵机可以在指数时间内给出答案如果熟悉了NP的定义,会发现明显指数级问题包含NP问题(?)因为根据上面的定义,只要验证对一个输入x是否存在一个u能够被某个图灵机M验证就好了,那么在指数时间内,我们可以定义一个hardcode了所有M的信息的图灵机N,N尝试所有可能的u,看有没有哪个u能迫使M接受x。由于u是多项式长度,这种尝试可以在指数时间内结束。至今为止,我们也只知道NP是包含在指数(EXP)这个class里面的,但不知道它们相不相等。这也是整个复杂度理论很蛋疼的一点:真包含关系极其难以证明。有的时候真的让人很怀疑最初的分类方法是不是合理的,究竟是这些问题就没法被很完美的定义,还是只是我们不够聪明呢?

作者:uraj
链接:https://www.zhihu.com/question/27039635/answer/35040172
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

P就是能在多项式时间内解决的问题,NP就是能在多项式时间验证答案正确与否的问题。用大白话讲大概就是这样。所以P是否等于NP实质上就是在问,如果对于一个问题我能在多项式时间内验证其答案的正确性,那么我是否能在多项式时间内解决它?这个表述不太严谨,但通俗来讲就是如此。再说说NP-hardness和NP-completenes. 这里涉及一个概念,不妨称为问题之间的归约。可以认为各个问题的难度是不同的,表现形式为,如果我可以把问题A中的一个实例转化为问题B中的一个实例,然后通过解决问题B间接解决问题A,那么就认为B比A更难。通过对归约过程做出限制可以得到不同类型的归约。复杂度理论里经常用到的规约叫polynomial-time Karp’ reduction。其要求是转化问题的过程必须是多项式时间内可计算的。到这为止NP-hardness和NP-completeness就很好理解了。称问题L是NP-hard,如果任意一个NP的问题都可以多项式规约到L。如果一个NP-hard的问题L本身就是NP的,则称L是NP-complete。这个定义可以推广到所有复杂度类。所以compleness的直观解释就是,我能解决这个问题就相当于具备了用相同级别的计算资源解决这个复杂度类里所有问题的能力。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值