版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文部份转载于https://blog.csdn.net/u012176591/article/details/51470999 感谢作者博主的辛苦付出。
一、p问题、NP问题、NPC问题、NP-hard问题的关系。
1.首先解释一下什么是P问题,什么是NP问题,什么是NPC问题,什么是NP-hard问题。
- P问题(Polynomial):这个应该最易理解,就是一个问题可以通过确定性图灵机在多项式(Polynomial)的时间的得到解决。例如排序问题。(确定性图灵机,遇见分支确定执行某个分支,目前所有计算机的原型)
- NP问题(Nondeterministic Polynomial time Problem):简单的说就是一个问题可以通过非确定图灵机在多项式时间得到解决。(非确定性图灵机,遇见分支遍历所有的分支程序,执行所有分支情况,目前不存在)。所以简单的说NP问题就是在目前无法通过有效的算法在多项式时间求解的问题,但是可以在多项式时间内进行求解结果的验证。例如旅行商问题。
- NPC问题(NP Complete):NP完全问题,所有NP问题在多项式时间内都能规约(Reducibility)到它的NP问题,即解决了此NPC问题,所有NP问题也都能得到解决。
- NP-hard(NP hard):NP难问题,所有NP问题在多项式时间内都能规约(Reducibility)到它的问题,但不一定是NP问题。
2.规约——一种技巧
归约(reduction): 归约是证明NP-hard问题的一种常用方法,通常用<=这个符号来表示。如P<=Q,这个就表示P is reducible to Q , or Q is the reduction from P or P is reduced to Q(P问题可以归约到Q问题,or可以把P归约到Q) 。这里的reduction的符号可以当成是 比较难易程度的小于等于号,意味着P至少比Q容易,或者Q至少比P难。
归约主要做的就是以下两个转化(注意两个转化都要在polynomial的时间内完成)【已知P是个NP-hard问题,证新问题Q 亦是NP-hard问题】,
1. 把P的输入转化到Q的输入;
2. 把Q的输出转化到P的输出。
下图展示了上述规约过程。其中T1 在多项式时间将 P的输入Pinput 转化成Q的输入Qinput ; T2在多项式时间将 Q的输出Qoutput转化成P的输出Poutput 。也就是说NP-hard问题P 可以依赖于对问题Q 的解决而解决。那么Q 至少比P要难,即P<=Q。
二、证明该问题属于什么类型的问题
下面来列出了一些常见的证明问题及其证明套路。
- 证明NP问题。这个容易,即给你一个结果,你能在polynomial的时间内验证该结果的正确性。
- 证明NP-hard问题。我们要证明一个问题是NP-hard的时候,我们通常要做的是找到一个已被证明了的NPC问题,并把这个NPC问题归约到该问题上去(即NPC<=NP-hard)。
- 证明NP-Complete问题。分以下两步:
- 第一步证明这个问题属于NP;
- 第二步,证明这个问题是NP-hard的。
下图列出了几个已被发现NP-Complete问题(更全面的NP-Complete问题列表,见链接A compendium of NP optimization problems,以及List of NP-complete problems),及其规约关系。可以看出所有的NP问题都可以规约到SAT(即NP<=SAT),也就是说SAT至少与NP问题一样难,或者如果解决了3SAT问题,所有的NP问题就解决了。同样的,SAT<=3SAT,3SAT<=Independent Set,Independent Set<=Vertex Cover OR Clique。(SAT和3SAT都是NPC问题)
规约关系具有传递性,所以有3SAT<=Vertex Cover,NP<=NP-Complete。 事实上,由于NP-Complete⊂⊂ NP 且 NP<=NP-Complete,可以推导出 所有的NP-Complete 可以相互规约,也就是所有的NP-Complete都是等价的。