NP完全性

易解的(Tractable)和难解的(Intractable)

如果一个算法的最差时间效率属于O(p(n)),那么该算法能在多项式时间内求解。(p(n)是问题输入规模的一个多项式函数)
我们把可以在多项式时间内求解的问题称为易解的,而不能在多项式时间内求解的问题则称为难解的。
之所以将算法根据多项式时间进行划分,主要有如下原因:
(1) 不能在多项式时间求解的问题并不是指这类问题不存在多项式解法,而是指这类问题尚未找到多项式时间解决的解法,且无法证明该问题不存在多项式时间解法。因为这类问题无法使用多项式特性,所以要单独处理。
(2) 多项式时间可解的问题常常可以在有限的多项式次数(多项式次数很少会大于3)中求解。
(3) 多项式函数具有很多方便的特性。如两个多项式的和或组合仍然是多项式。
(4) 基于多项式函数的问题已经发展成一种称为**计算复杂性(Computational Complexity)**的理论。

P类问题、NP类问题和NPC类问题

P类问题(Polynomial)

P类问题是一类能够用(确定性的)算法在多项式时间内求解的判定问题。这种问题类型也称为多项式(Polynomial)类型。

NP类问题(Nondeterministic Polynomial)

NP类问题是指那些在多项式时间内可以被证明的问题。
多项式时间内可以被证明是指如果已知一个问题的解的证书(certificate),那么可以证明此问题在该输入规模下能在多项式时间内解决。
NP类问题是一类可以用不确定多项式算法求解的判定问题。这种问题类型也称为不确定多项式类型。
一个不确定算法是一个两阶段的过程,它把一个判定问题的实例l作为它的输入,并进行下面的操作:
(1)非确定(“猜测”)阶段:生成一个任意串S,把它当作给定实例l的一个候选解。
(2)确定(“验证”)阶段:确定算法把l和S都作为它的输入,如果S可被证明是l的一个解,就输出“是”(如果S不是l的一个解,该算法要么返回“否”,要么根本不停下来)。
如果一个不确定算法在验证阶段的时间效率是多项式级别的,那么则称这个不确定算法是不确定多项式类型的。

NPC类问题(NP-Complete)

如果一个NP问题和其他任何NP问题一样“不易解决”,那么我们认为这一问题是NPC类问题或者称之为NP完全问题
如果任何NP完全问题可以在多项式时间内解决,那么所有NP问题都有一个多项式时间算法。也就是说如果任何NP完全问题可以在多项式时间内解决,那么P=NP。但是,目前为止,NP完全问题仍未找到一个多项式时间解法。但仍不能排除NP完全问题可在多项式时间内求解的可能性。
针对NP完全问题,更好的处理策略是开发一种近似算法或解决某些已处理的问题的特例或针对小规模的输入数据进行解决。
“其他任何NP问题一样“不易解决”策略用来证明一个特定的问题是NP完全问题(归约策略)。在使用这种策略证明一个问题是NP完全问题时,依赖三个关键的概念:(1) 判定问题与最优化问题;(2) 归约;(3) 第一个NP完全问题。
(1) 判定问题与最优化问题
为简单起见,NP完全性理论把注意力集中在判定问题上。所谓的判定问题是指那些解为“是”或“否”的问题。NP完全性适合用于判定问题,不适合直接应用于最优化问题。
通过对待优化的值强加一个界,就可以将一个给定的最优化问题转化为一个相关的判定问题。因此,如果能够提供证据证明某一个判定问题是个NP完全问题,就等于证明其相关的最优化问题也是NP完全问题。因此,即使NP完全性理论限制到对判定问题的关注,它对最优化问题还是有一定意义的。
(2) 归约
归约就是将一个未知问题转换成熟悉的、有已知解的技术。
对于判定问题A,希望在多项式时间内解决该问题。假设有另一个不同的判定问题B,且已知可在多项式时间内解决它。然后假设有一个过程,可将A的任何实例α转化成B的具有以下特征的某个实例β:

  1. 转换操作可在多项式时间内完成;
  2. 两个实例的解是相同。也就是说,实例α的解是“是”,当前仅当实例β的解也是“是”。
    我们称这一过程为多项式时间归约算法(Reduction Algorithm)。
    根据多项式归约算法,可总结在多项式时间内解决问题A的方法:
  3. 给定问题A的实例α,利用多项式时间归约算法,将它转化为问题B的一个实例β。
    2)在实例β上,运行B的多项式时间判定算法。
    3)将β的解作为α的解。
    图示如下:
    NP完全性_第1张图片
    进一步地,假如有一个“判定问题”A,它不可能存在多项式时间算法。假如有一个多项式时间的归约,它可将A的一个实例转化为一个B的实例,那么B不可能存在多项式时间算法。(使用反证法可证明)
    (3) 第一个NP完全问题
    由于归约这一技巧依赖于条件“已知一个NP完全问题”才能去解决另一个不同的NP完全问题。所以需找到“第一个NP完全问题”。我们将使用的这第一个NP完全问题是“电路可满足性问题(Circuit-Satisfiability Problem)”。
    一个判定问题D是NP完全问题条件是:
  4. 这个问题属于NP类型;
    2)NP中的任何问题都能够在多项式时间内化简为D。
    这里,如果一个问题仅满足条件二,但不一定满足条件一,那么这个问题是NP难(NP-hard)的。
    根据上述NP完全问题的定义,可以按照如下步骤完成NP完全问题的证明:第一步,证明所讨论的问题属于NP问题。也就是说,可在多项式时间内检验一个任意生成的船,以确定它是不是可以作为问题的一个解。第二步,证明NP中的每一个问题都能在多项式时间内化简成所讨论的问题。为了完成这一步的证明,可以利用
    多项式化简的传递性
    , 证明一个已知的NP完全问题能够在多项式时间内转换成所讨论的问题。
    总结:相对使用NP完全性的定义证明一个问题是NP完全问题,使用NP完全性定义和多项式化简的传递性可以更加简便的证明问题是NP完全问题。

P类问题、NP类问题和NPC类问题关系

所有的P类问题同时也是NP类问题。因为如果一个问题是P类问题,那么不用任何证书就可在多项式时间内解决它。至于P类问题是否是NP类问题的真子集,在目前来说仍是一个开放的问题。可以明确的一点是,P类问题是NP类问题的子集(P⊆NP)。
如果任何NP完全问题是多项式时间可求解的,则P=NP。等价地,如果存在某一NP中的问题不是多项式时间可解的,则所有NP完全问题都不是多项式时间可解的。所以P≠NP问题的研究都是以NP完全问题为中心的。假设P≠NP,那么P、NP和NPC之间的关系如下:
NP完全性_第2张图片

参考

《算法导论》 第三十四章 NP完全性 第三版 Tomas H. Cormen etc. 殷建平 等译

你可能感兴趣的:(数据结构和算法,算法,概率论,线性代数)