NP完全性理论(算法分析与设计)

0.参考

http://www.matrix67.com/blog/archives/105(极好,通俗易懂)

《算法导论》NP完全性

《算法设计与分析》NP完全性理论

1.基本概念

a.时间复杂度

定义:时间复杂度并不是表示一个程序解决问题需要花费多少时间,而是当一个问题规模扩大以后,程序需要的时间长度增长得有多快

例子:冒泡排序、插入排序等,数据扩大2倍,时间变慢4倍的,属于O(n^2)的复杂度

b.多项式级复杂度与非多项式级复杂度

一种是O(1),O(log(n)),O(n^a)等,我们把它叫做多项式级的复杂度,因为它的规模n出现在底数的位置。另一种是O(a^n)和O(n!)型复杂度,它是非多项式级的,其复杂度计算机往往不能承受。

c.易解问题和难解问题

能在多项式时间内解决的问题称为易解问题,只能在指数级时间内解决的问题称为难解问题

d.确定性计算模型(如确定性图灵机)与非确定性计算模型(如非确定性图灵机)

确定性计算模型:对于输入,输出的是确定的单值

非确定性计算模型:对于输入,输出的是值集,值集中的每个元素都可以作为解

区别:确定性计算模型的每一步只有一种选择,非确定性计算模型的每一步却有多种选择

2.P问题和NP问题

a.P(polynomial,多项式)问题

定义1:如果一个问题可以找到一个能在多项式的时间里解决它的算法,那么这个问题就属于P问题。

定义2:P类问题是确定性计算模型下的易解问题

b.NP(Non-Deterministic Polynomial,非确定多项式)问题

定义1:NP问题是指可以在多项式的时间里验证一个解的问题。NP问题的另一个定义是,可以在多项式的时间里猜出一个解的问题。

定义2:NP类问题是非确定性计算模型下的易验证问题

例子:比方说,我RP很好,在程序中需要枚举时,我可以一猜一个准。现在某人拿到了一个求最短路径的问题,问从起点到终点是否有一条小于100个单位长度的路线。它根据数据画好了图,但怎么也算不出来,于是来问我:你看怎么选条路走得最少?我说,我RP很好,肯定能随便给你指条很短的路出来。然后我就胡乱画了几条线,说就这条吧。那人按我指的这条把权值加起来一看,嘿,神了,路径长度98,比100小。于是答案出来了,存在比100小的路径。别人会问他这题怎么做出来的,他就可以说,因为我找到了一个比100小的解。在这个题中,找一个解很困难(穷举),但验证一个解很容易。验证一个解只需要O(n)的时间复杂度,也就是说我可以花O(n)的时间把我猜的路径的长度加出来。那么,只要我RP好,猜得准,我一定能在多项式的时间里解决这个问题。我猜到的方案总是最优的,不满足题意的方案也不会来骗我去选它。这就是NP问题。

c.P与NP

之所以要定义NP问题,是因为通常只有NP问题才可能找到多项式的算法。我们不会指望一个连多项式地验证一个解都不行的问题存在一个解决它的多项式级的算法。相信读者很快明白,信息学中的号称最困难的问题——“NP问题”,实际上是在探讨NP问题与P类问题的关系。
很显然,所有的P类问题都是NP问题。也就是说,能多项式地解决一个问题,必然能多项式地验证一个问题的解——既然正解都出来了,验证任意给定的解也只需要比较一下就可以了。关键是,人们想知道,是否所有的NP问题都是P类问题。我们可以再用集合的观点来说明。如果把所有P类问题归为一个集合P中,把所有NP问题划进另一个集合NP中,那么,显然有P属于NP。现在,所有对NP问题的研究都集中在一个问题上,即究竟是否有P=NP?通常所谓的“NP问题”,其实就一句话:证明或推翻P=NP。

3.NPC问题

a.定义及描述

定义:满足两个条件,1)该问题是个NP问题,2)所有的NP问题都可以归约成该问题

描述:从约化的定义中我们看到,一个问题约化(归约)为另一个问题,时间复杂度增加了,问题的应用范围也增大了。通过对某些问题的不断约化,我们能够不断寻找复杂度更高,但应用范围更广的算法来代替复杂度虽然低,但只能用于很小的一类问题的算法。再回想前面讲的P和NP问题,联想起约化的传递性,自然地,我们会想问,如果不断地约化上去,不断找到能“通吃”若干小NP问题的一个稍复杂的大NP问题,那么最后是否有可能找到一个时间复杂度最高,并且能“通吃”所有的NP问题的这样一个超级NP问题?答案居然是肯定的。也就是说,存在这样一个NP问题,所有的NP问题都可以约化成它。换句话说,只要解决了这个问题,那么所有的NP问题都解决了。这种问题的存在难以置信,并且更加不可思议的是,这种问题不只一个,它有很多个,它是一类问题。这一类问题就是传说中的NPC问题,也就是NP-完全问题。

b.证明一个问题是NP完全问题

证明一个NP问题是一个NPC问题依赖三个关键概念

1)判定问题和最优化问题

概念:让程序解决一个问题,输出一个“YES”或“NO”(这被称为判定性问题)。一个什么什么的最优值(这被称为最优化问题)。NP完全性不直接适用于最优化问题,但适合于判定问题。尽管证明一个问题是NP完全问题会使我们的目光局限于判定问题,但是我们仍然可以通过对待优化的值强加一个界,来将一个最优化问题转化成判定问题的方式来证明一个最优化问题是不是NPC问题

例子:给定一个有向图G、顶点u,v,求u到v最短路径(这是一个最优化问题,shortest path)。加上界限权值和k,问题变成了这样:给定一个有向图G、顶点u,v,和权值和k,求u到v是否存在一条或多条路径,满足路径的边权值和小于k(这是一个判定问题,path)。通过加上界限权值和k,一个最优化问题就转化成了一个判定问题

证明一个最优化问题是判定问题:在我们试图证明一个最优化问题是一个NPC问题时,就可以利用该问题与相关的判定问题之间的关系,一般来说,判定问题要“更容易一些”或“至少不会更难”(例如,我们可以先求出shorest path问题,然后再通过shortest path的解与k比较得出path问题的解)。也就是说,某个最优化问题比较容易的话,相关的判定问题也比较容易,换句话说,如果我们能够证明相关的判定问题是个NPC问题的话,那么该最优化问题也会是一个NPC问题。

2)约化(Reducibility,有的资料上叫“归约”)

定义:一个问题A可以约化为问题B的含义即是,可以用问题B的解法解决问题A,或者说,问题A可以“变成”问题B。(最优化问题可以约化为判定问题,判定问题也可以约化成为另一个判定问题)

例子:现在有两个问题:求解一个一元一次方程和求解一个一元二次方程。那么我们说,前者可以约化为后者,意即知道如何解一个一元二次方程那么一定能解出一元一次方程。我们可以写出两个程序分别对应两个问题,那么我们能找到一个“规则”,按照这个规则把解一元一次方程程序的输入数据变一下,用在解一元二次方程的程序上,两个程序总能得到一样的结果。这个规则即是:两个方程的对应项系数不变,一元二次方程的二次项系数为0。按照这个规则把前一个问题转换成后一个问题,两个问题就等价了。同样地,我们可以说,Hamilton回路可以约化为TSP问题(Travelling Salesman Problem,旅行商问题):在Hamilton回路问题中,两点相连即这两点距离为0,两点不直接相连则令其距离为1,于是问题转化为在TSP问题中,是否存在一条长为0的路径。Hamilton回路存在当且仅当TSP问题中存在长为0的回路。

另外: “问题A可约化为问题B”有一个重要的直观意义:B的时间复杂度高于或者等于A的时间复杂度。也就是说,问题A不比问题B难。这很容易理解。既然问题A能用问题B来解决,倘若B的时间复杂度比A的时间复杂度还低了,那A的算法就可以改进为B的算法,两者的时间复杂度还是相同。正如解一元二次方程比解一元一次方程难,因为解决前者的方法可以用来解决后者。

3)第一个NPC问题

根据约化技术的定义来证明一个问题是NPC问题的前提是:我们已经知道了一个NPC问题。我们将使用的这第一个问题是电路可满足性问题。

c.NPC问题的求解方式

1)枚举(回溯法)(章五)

2)动态规划法和分支限界(章三和章六)

3)概率算法(章七)

4)近似算法求解近似值(章九)

5)启发式方法求解(贪心(简单直接的启发式方法)(章四),禁忌搜索等(现代优化算法))

d.一些典型的NP完全问题


4.NP-hard问题

NP-Hard问题是这样一种问题,它满足NPC问题定义的第二条但不一定要满足第一条(就是说,NP-Hard问题要比NPC问题的范围广)。NP-Hard问题同样难以找到多项式的算法,但它不列入我们的研究范围,因为它不一定是NP问题。即使NPC问题发现了多项式级的算法,NP-Hard问题有可能仍然无法得到多项式级的算法。事实上,由于NP-Hard放宽了限定条件,它将有可能比所有的NPC问题的时间复杂度更高从而更难以解决。

你可能感兴趣的:(NP完全性理论(算法分析与设计))