[算法笔记]如何证明一个问题是NPC问题
步骤(Step)
在进入正题前,我想向大家讲解一下归约(reduction)、P和NP的概念。
期望(Desiderata’):假如我们能够在多项式时间(polynomial-time)内解决问题Y,我们考虑能在当前的基础下解决其他哪些问题呢?
归约(Reduction):当问题X能够在多项式时间内被归约为问题Y,并且对于任意问题X的样例能够被如下方式解决:
·多项式个标准的的算法复杂度计算步骤
·多项式次调用解决问题Y的步骤
标记(Notation):X ≤ P Y. (当碰到这个标记时,通常可以理解为Y比X难,并且Y可以解X)
推论:
1)若X ≤ P Y并且Y可以再多项式时间内解决,那么X可以再多项式时间内解决
2)若X ≤ P Y并且X不可以在多项式时间内解决,那么Y也不能在多项式时间内解决
3)若X ≤ P Y并且Y≤ P X,记作X ≡ P Y。在这种情况下,X能够在多项式时间内被解决当且仅当Y可以在多项式时间内解决
P问题
定义(Definition):一组每一个都拥有多项式算法的决策问题(即回答为是或否)通俗地说就是可以再多项式时间内解决的问题
NP问题
定义:一组每一个都存在多项式时间证书的(certifier)的决策问题。通俗地讲,就是在多项式时间可以被证明的问题。
所以P问题也是NP问题。所谓NPC问题也就是对于任意NP问题,都能够在多项式时间内归约成这个问题。也就是说比所有的NP问题都难(当然也有一样难的)
目前大多数学者认为NP问题真包含P问题,并且与NP-Hard问题有交集,交集即为NPC问题
Figure 0
一、证明NP
首先,对任意NP问题,都能成为NPC问题,但是如果单独给我们一个问题,让我们证明它是NPC问题确实有些困难,所以我们取巧。记这个问题为Y,先证明这个问题是NP问题
二、构造
找一个NPC问题,记为X,证明:X