【Algorithm】P·NP·NPC关系概述

预备概念简述.

1.Tractable & Intractable.

在问题的计算复杂性研究中,无数专家学者都很关注的一个问题就是——对于一个给定的问题,是否有一个多项式时间的算法可以将其解决。
这里我们讨论一下,什么叫“一个多项式时间的算法”。当一个算法在解决给定问题时,它在最坏情况下的时间复杂度T(n)=O(p(n)),这里的p(n)是一个关于问题输入规模n的多项式函数。注意这里的O记号,这一记号意味着如果算法在log(n)级别的时间内解决了问题,我们也可以称它“在多项式时间内解决了问题”。

【Definition】Problems that can be solved in polynomial time are called tractable,and problems that cannot be solved in polynomial time are called intractable.

上述定义来自Anany Levitin的《Introduction to the Design and Analysis of Algorithms》第401页。Levitin给出的定义将我们遇到的问题分成了两类:

  1. 易处理的(tractable)
  2. 难以处理的(intractable)

Levitin给出这样一个分类标准的理由有很多。首先,对于一些难解问题的任意实例,我们根本无法在一个可以接受的时间内给出它的解,除非这个实例的规模相当地小。其次,尽管易解问题这一集合内部也有着巨大的差异——源于多项式p(n)的具体形式,但实际上几乎没有哪一个实用算法的时间复杂度会超过3次多项式。并且,这类算法的时间复杂度中通常也不会有很大的系数。再次,以“多项式”为分类标准可以使得多项式的重要性质——多项式的和依旧是多项式。最后,这样的分类也催生了一门学科的诞生——Computational Complexity,这一学科致力于通过发掘问题固有的难点来对问题进行分类。

2.Decision-Problem & Deterministic-Algorithm.

我们所了解的许多问题,都可以在多项式时间内进行求解。例如最大公约数GCD问题、排序问题、查找问题、模式串匹配问题、图的连通性问题、图的最小生成树问题以及最短路径问题等等,都属于上面提到的(tractable)易解问题。不严格地说,这些可以在多项式时间内求解的问题就可以被称为P问题。
那么严格的定义是什么呢?

【Definition】Class P is a class of decision problems that can be solved in polynomial time by deterministic algorithm.

定义中提到了两个概念——决策问题(decision problem)和确定性算法(deterministic algorithm)。首先,决策问题就是那些可以用“是/否”来回答的问题。其次,如果一个算法A在整个执行过程中,每一步都只有一个选择,则称A是确定性算法。A对同样的输入,输出结果一定相同。将P问题的概念限制在决策问题的范围中是有其道理的,有一些问题它们通常的描述并不是决策问题的形式,但它们可以被规约成决策问题的形式,从而更加便于研究。例如图的最小着色问题,我们平时会这样发问:使得图G中相邻两个点着色不同的最小色数是多少?现在我们换个思路,我们考虑这样一个问题:是否存在使用m(m=1,2,…)种颜色可以完成图G着色的涂色方案?后面一种问题就是m着色问题,这显然是一个决策问题。

3.Decidable & Undecidable.

看到这里,很多人会疑惑:是不是所有的决策问题都可以得到一个确定的答案呢?例如我向老师提问1+1是否等于3呢,老师会很确定地告诉我“不是”。决策问题都是可以确定的吗?答案是否定的。决策问题可以被分成两大类:可确定的(decidable)与不可确定的(undecidable)。不可确定的那一部分决策问题是无法被任何算法求解的,而可确定的决策问题则是可以被算法求解的。所以P问题的定义中强调:可以在多项式时间内被确定性算法求解的决策问题
不可确定问题中一个很著名的例子——Halting Problem,停机问题由Alan Turing先生在1936年提出。

【Halting Problem】Given a computer program and an input to it, determine whether the program will halt on that input or continue working indefinitely on it.

我们考虑反证法来这一问题属于不可确定问题。假定Halting Problem是确定性问题,而且A是一个求解这一问题的算法。我们记给定的程序为P,输入为I,所以有下述的表达式:
在这里插入图片描述
这一证明的巧妙之处在于,我们让程序P本身作为输入,并且我们利用A(P,P)这一算法的输出结果来构建另一个程序Q,Q的表现形式如下:在这里插入图片描述
然后我们将Q程序的输入换成Q程序本身,也就是:
在这里插入图片描述
现在我们提出的问题就是,这样的Q程序是否会停止呢?如果认为Q会停止,那么A(Q,Q)=1,也就意味着Q(Q)并没有停止;如果认为Q不会停止,那么A(Q,Q)=0,也就意味着Q(Q)已经停止了。这就是Truing停机问题的矛盾所在,也证明了存在一部分问题,它们是不可以确定的。
类似的悖论问题还有——理发师悖论:一位理发师只给那些不为自己理发的人理发,那么他是否要为自己 理发呢;罗素(Russell)集合悖论:定义集合S={x|x不属于S},那么S自身是否应该在S中呢?

4.小总结.

至此我们已经提出了四个重要概念:

  • 易解问题-Tractable
  • 难解问题-Intractable
  • P问题
  • 决策问题-Decision Problem
    a.确定性问题-Decidable
    b.不确定问题-Undecidable

我们参照P问题的定义:确定性的问题(可以被算法求解)、易解的问题(可以在多项式时间内求解),也就是说P问题是Tractable & Decidable的。那么我们不仅发问,是否有一些问题,它是确定性的问题,但却不是易解的问题呢,也就是说,Intractable & Decidable的问题。答案是肯定的,有一部分确定性的问题,它们尚未找到多项式时间内的算法来求解,但也并没被证明不可能拥有多项式时间内的问题。我们给出这样问题的几个例子:

  • Hamiltonian Circuit Problem——给定一个图,哈密尔顿回路是否存在。
  • Traveling Salesman Problem——找出最短的哈密尔顿回路。
  • Knapsack Problem——找出最大价值的物品子集。
  • Partition Problem——给定一个正整数集合,将其分为两个和相等的子集。
  • Bin-Packing Problem——装箱问题,给定一组小于1的正有理数序列,代表物品,将他们装入大小为1的箱子中,要求箱子的个数最少。
  • Graph-Coloring Problem——图的最小着色问题。
  • Integer Linear Programming Problem——整系数线性规划问题。

上述提到的问题中,有的已经是决策问题了,而那些不是决策问题的,都有着它们的决策问题版本,类似我们前面举例用到的图的最小着色问题。注意,上面提到的这些问题,它们只是暂时Intractable的,因为我们并没有找到它们的多项式时间算法,但它们也并不是就被证明了没有这样的可能。这一切的盖棺论定,都在等待着一个巨大难题的最终落定。

NP问题.

在给出NP问题的定义之前,我们还需要介绍一个概念——非确定性算法(nondeterministic algorithm).

【Definition】A nondeterministic algorithm is a two-stage procedure that takes as its input an instance L of a decision problem and does the following.
1.Nondeterministic(“guessing”) stage: An arbitary string S is generated that can be thought of as a solution to the given instance L, and S may be complete gibberish as well.
2.Deterministic(“verification”) stage: A deterministic algorithm takes both L and S as its input and ouputs yes if S represents a solution to instance L. If S is not a solution to instance L, the algorithm either returns no or is allowed not to halt at all.

非确定性算法分为两个阶段:猜测和验证。在猜测阶段,我们认为串S可能是是问题实例L的解,当然S也有可能不是L的解;然后在验证阶段,算法要能够确认S是不是问题实例L的解,如果是算法要输出yes,否则输出no(或者干脆不停止运行也可以)。当非确定性算法能够对于每一个正确解S都输出yes时,对于每一个错误解S都输出no,我们说这样的一个非确定性算法能够解决决策问题。最后,我们对验证过程的时间复杂度给出多项式时间这一限制,就得到了非确定性多项式时间算法(Nondeterministic Polynomial Algorithm)的概念。
至此我们可以给出NP问题的定义:

【Definition】Class NP is a class of decision problems that can be solved by nondeterministic polynomial algorithms. This class of problems is called nondeterministic polynomial.

对比P问题的定义——那些能够在多项式时间内被确定性算法求解的决策问题,NP问题的定义变化在于能够被非确定性多项式时间算法求解(关键也就是能够在多项式时间内验证一个解的正确与否)。思考之下,我们不难发现,P问题和NP之间的关系:
在这里插入图片描述
对于任意一个P问题,我们可以在非确定性算法的验证阶段中使用这一P问题的多项式时间确定性算法将其求解出来,并且直接忽略掉猜测阶段,很显然P问题必然会是NP问题。但NP问题这一集合中,还包含着诸如Hamiltonian Circuit Problem、Partition Problem、Graph-Coloring Problem等等一些组合数学难题。另外我们也可以指出,像Halting Problem那种不可确定的决策问题,它根本不属于NP问题。
P问题是NP问题子集这一性质引发了人们的思考:
在这里插入图片描述
这一问题至今尚未得到证明,作为千僖难题的Top 1,这一问题吸引了无数计算机科学家前赴后继的研究探索。在研究这一问题的过程中,我们发现在NP问题集合中,有一类特殊的问题——NP-Complete问题,也就是NP完全问题,这类问题的出现,似乎让我们看到了证明上示图中难题的曙光。

NPC问题.

不严格地说,如果一个NP问题,我们叫它F,NP问题集合中的任何其他问题都能够在多项式时间内规约(Polynomial Reducible)到问题F,那么这个F问题,就成为了NPC问题。那么什么叫做Polynomial Reducible呢?

【Definition】A decision problem D 1 _1 1 is said to be polynomial reducible to a decision D 2 _2 2, if there exists a function f( ) that transforms instances of D 1 _1 1 to instances of D 2 _2 2 such that:
1.f( ) maps all yes instances of D 1 _1 1 to yes instances of D 2 _2 2 and all no instances of D 1 _1 1 to no instances of D 2 _2 2
2.f( ) is computable by a polynomial time algorithm

多项式时间可规约的定义自然而然地给出了一些性质。举例来说,如果问题D 1 _1 1能够在多项式时间内归约到问题D 2 _2 2,并且D 2 _2 2是一个可以在多项式时间内求解的问题,那么问题D 1 _1 1也能够在多项式时间内被求解。因为两个多项式时间的和依旧是一个多项式时间。至此我们可以给出NP-Complete问题的严格定义:

【Definition】A decision problem D is said to be NP-Complete if:
1.D belongs to class NP;
2.every problem in NP is polynomially reducible to D.

那么NPC问题的出现,为什么带来了解决P = or ≠ NP问题的曙光呢?
设想我们证明了某一个NPC问题,它存在多项式时间的确定性算法,也就是说这个NPC问题是一个P问题。又因为NP问题集合中的所有问题都可以规约到这一个NPC问题,这也就意味着所有的NP问题,都可以在多项式时间内得到解答。这样一来,我们前面提到的很多难题——诸如Hamiltonian Circuit Problem、Partition Problem、Graph-Coloring Problem等等一些组合数学难题,都可以在多项式时间内得到求解,像最大公约数GCD问题、排序问题、查找问题那样。
That’s amazing!
所以我们希望能够找到一个NPC问题,能够将它证明为P问题。

P=NP及后续.

第一个NPC问题是由Stephen Cook在1971年证明的CNF-Satisfiability Problem. CNF问题讨论的是布尔表达式求值,每一个布尔表达式都可以表示成合取范式的形式,CNF想要知道是否存在一种真值分配使得整个表达式的值为True.继Cook发现了第一个NPC问题之后,计算机科学家相继发现了许许多多NPC问题,像我们前面提到的Hamiltonian Circuit Problem、Travelling Salesman Problem、Partition Problem、Bin-Packing Problem以及Graph-Coloring Problem,都是NPC问题。
倘若未来证明了P=NP,那么NPC会作为P问题的一个子集存在着,而类似Halting Problem那样的不可确定问题,依旧像幽灵一样徘徊在P&NP的范围之外。
如果被证明的是P≠NP,那么P和NPC会作为NP的两个不相交真子集,并且还有一些NP问题,它既不是P也不是NPC。
在这里插入图片描述
考察上图中的五个图示,哪些是和我们目前所获得的知识不冲突的呢?

  1. 首先讨论a,P=NP是尚有可能被证明的。但即使认为所有的NP问题都是P问题,也不可能所有的NP问题都是NPC问题。我们考虑一个极端情况,假设问题D对于所有的输入,它的输出都是yes,这样一个问题显然不可能是NPC问题;但它显然是P问题——都输出yes就行了。所以a图是不可能的。
  2. b图中的情况是有可能的,只要证明了P=NP。
  3. c图中的情况是不可能的,一旦证明P≠NP,那么必然存在一些NP问题,它既不是P问题,也不是NPC问题。
  4. d图中的情况也是不可能的,NPC和P有交集就必然会是b图中的情况。
  5. e图中的情况是可能的,它是c图的正确版本。

总结

P问题是多项式时间内可求解的,NP问题是多项式时间内可验证的,NPC问题是所有NP问题都可以规约到它的NP问题。同样还存在一些问题,它可以由所有的NP规约到,但它本身并不是NP问题,这样的问题是NP-hard问题,Halting Problem就属于这一集合。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值