【转】关于NP,NP-hard,P,NPC等相关问题的讨论

你会常常看到网上出现“这怎么作,这不是NP问题吗”、“这个只有搜了,这已经被证实是NP问题了”之类的话。你要知道,大多数人此时所说的NP问题其实 都是指的NPC问题。他们没有搞清楚NP问题和NPC问题的概念。NP问题并非那种“只有搜才行”的问题,NPC问题才是。好,行了,基本上这个误解已 经被澄清了。下面的内容都是在讲什么是P问题,什么是NP问题,什么是NPC问题,你若是不是很感兴趣就能够不看了。接下来你能够看到,把NP问题当成是 NPC问题是一个多大的错误。算法


仍是先用几句话简单说明一下时间复杂度。时间复杂度并非表示一个程序解决问题须要花多少时间,而是当问题规模扩大后,程序须要的时间长度增加得有多快。 也就是说,对于高速处理数据的计算机来讲,处理某一个特定数据的效率不能衡量一个程序的好坏,而应该看当这个数据的规模变大到数百倍后,程序运行时间是否 仍是同样,或者也跟着慢了数百倍,或者变慢了数万倍。无论数据有多大,程序处理花的时间始终是那么多的,咱们就说这个程序很好,具备O(1)的时间复杂 度,也称常数级复杂度;数据规模变得有多大,花的时间也跟着变得有多长,这个程序的时间复杂度就是O(n),好比找n个数中的最大值;而像冒泡排序、插入 排序等,数据扩大2倍,时间变慢4倍的,属于O(n^2)的复杂度。还有一些穷举类的算法,所需时间长度成几何阶数上涨,这就是O(a^n)的指数级复杂 度,甚至O(n!)的阶乘级复杂度。不会存在O(2*n^2)的复杂度,由于前面的那个“2”是系数,根本不会影响到整个程序的时间增加。一样 地,O(n^3+n^2)的复杂度也就是O(n^3)的复杂度。所以,咱们会说,一个O(0.01*n^3)的程序的效率比O(100*n^2)的效率 低,尽管在n很小的时候,前者优于后者,但后者时间随数据规模增加得慢,最终O(n^3)的复杂度将远远超过O(n^2)。咱们也说,O(n^100)的 复杂度小于O(1.01^n)的复杂度。优化


容易看出,前面的几类复杂度被分为两种级别,其中后者的复杂度不管如何都远远大于前者:一种是O(1),O(log(n)),O(n^a)等,咱们把它叫 作多项式级的复杂度,由于它的规模n出如今底数的位置;另外一种是O(a^n)和O(n!)型复杂度,它是非多项式级的,其复杂度计算机每每不能承受。当我 们在解决一个问题时,咱们选择的算法一般都须要是多项式级的复杂度,非多项式级的复杂度须要的时间太多,每每会超时,除非是数据规模很是小。排序


天然地,人们会想到一个问题:会不会全部的问题均可以找到复杂度为多项式级的算法呢?很遗憾,答案是否认的。有些问题甚至根本不可能找到一个正确的算法 来,这称之为“不可解问题”(Undecidable Decision Problem),The Halting Problem就是一个著名的不可解问题。再好比,输出从1到n这n个数的全排列。无论你用什么方法,你的复杂度都是阶乘级,由于你总得用阶乘级的时间打 印出结果来。有人说,这样的“问题”不是一个“正规”的问题,正规的问题是让程序解决一个问题,输出一个“YES”或“NO”(这被称为断定性问题),或 者一个什么什么的最优值(这被称为最优化问题)。那么,根据这个定义,我也能举出一个不大可能会有多项式级算法的问题来:Hamilton回路。问题是这 样的:给你一个图,问你可否找到一条通过每一个顶点一次且刚好一次(不遗漏也不重复)最后又走回来的路(知足这个条件的路径叫作Hamilton回路)。这 个问题如今尚未找到多项式级的算法。事实上,这个问题就是咱们后面要说的NPC问题。ci


下面引入P类问题的概念:若是一个问题能够找到一个能在多项式的时间里解决它的算法,那么这个问题就属于P问题。P是英文单词多项式的第一个字母。哪些问 题是P类问题呢?一般NOI和NOIP不会出不属于P类问题的题目。咱们常见到的一些信息奥赛的题目都是P问题。道理很简单,一个用穷举换来的非多项式级 时间的超时程序不会涵盖任何有价值的算法。路由


接下来引入NP问题的概念。这个就有点难理解了,或者说容易理解错误。在这里强调(回到我竭力想澄清的误区上),NP问题不是非P类问题。NP问题是指可 以在多项式的时间里验证一个解的问题。NP问题的另外一个定义是,能够在多项式的时间里猜出一个解的问题。比方说,我RP很好,在程序中须要枚举时,我能够 一猜一个准。如今某人拿到了一个求最短路径的问题,问从起点到终点是否有一条小于100个单位长度的路线。它根据数据画好了图,但怎么也算不出来,因而来 问我:你看怎么选条路走得最少?我说,我RP很好,确定能随便给你指条很短的路出来。而后我就胡乱画了几条线,说就这条吧。那人按我指的这条把权值加起来 一看,嘿,神了,路径长度98,比100小。因而答案出来了,存在比100小的路径。别人会问他这题怎么作出来的,他就能够说,由于我找到了一个比100 小的解。在这个题中,找一个解很困难,但验证一个解很容易。验证一个解只须要O(n)的时间复杂度,也就是说我能够花O(n)的时间把我猜的路径的长度加 出来。那么,只要我RP好,猜得准,我必定能在多项式的时间里解决这个问题。我猜到的方案老是最优的,不知足题意的方案也不会来骗我去选它。这就是NP问 题。固然有不是NP问题的问题,即你猜到了解可是没用,由于你不能在多项式的时间里去验证它。下面我要举的例子是一个经典的例子,它指出了一个目前尚未 办法在多项式的时间里验证一个解的问题。很显然,前面所说的Hamilton回路是NP问题,由于验证一条路是否刚好通过了每个顶点很是容易。但我要把 问题换成这样:试问一个图中是否不存在Hamilton回路。这样问题就无法在多项式的时间里进行验证了,由于除非你试过全部的路,不然你不敢判定它“没 有Hamilton回路”。数学


之因此要定义NP问题,是由于一般只有NP问题才可能找到多项式的算法。咱们不会期望一个连多项式地验证一个解都不行的问题存在一个解决它的多项式级的算 法。相信读者很快明白,信息学中的号称最困难的问题——“NP问题”,其实是在探讨NP问题与P类问题的关系。it


很显然,全部的P类问题都是NP问题。也就是说,能多项式地解决一个问题,必然能多项式地验证一个问题的解——既然正解都出来了,验证任意给定的解也只需 要比较一下就能够了。关键是,人们想知道,是否全部的NP问题都是P类问题。咱们能够再用集合的观点来讲明。若是把全部P类问题归为一个集合P中,把全部 NP问题划进另外一个集合NP中,那么,显然有P属于NP。如今,全部对NP问题的研究都集中在一个问题上,即到底是否有P=NP?一般所谓的“NP问 题”,其实就一句话:证实或推翻P=NP。io


NP问题一直都是信息学的巅峰。巅峰,意即很引人注目但难以解决。在信息学研究中,这是一个耗费了不少时间和精力也没有解决的终极问题,比如物理学中的大统一和数学中的歌德巴赫猜测等。效率


目前为止这个问题还“啃不动”。可是,一个总的趋势、一个大方向是有的。人们广泛认为,P=NP不成立,也就是说,多数人相信,存在至少一个不可能有多项 式级复杂度的算法的NP问题。人们如此坚信P≠NP是有缘由的,就是在研究NP问题的过程当中找出了一类很是特殊的NP问题叫作NP-彻底问题,也即所谓的 NPC问题。C是英文单词“彻底”的第一个字母。正是NPC问题的存在,令人们相信P≠NP。下文将花大量篇幅介绍NPC问题,你从中能够体会到NPC问 题使P=NP变得多么难以想象。搜索

为了说明NPC问题,咱们先引入一个概念——约化(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的算法,二者的时间复杂度仍是相同。正如解一元二次方程比解一元一 次方程难,由于解决前者的方法能够用来解决后者。


很显然,约化具备一项重要的性质:约化具备传递性。若是问题A可约化为问题B,问题B可约化为问题C,则问题A必定可约化为问题C。这个道理很是简单,就没必要阐述了。


如今再来讲一下约化的标准概念就不难理解了:若是能找到这样一个变化法则,对任意一个程序A的输入,都能按这个法则变换成程序B的输入,使两程序的输出相同,那么咱们说,问题A可约化为问题B。


固然,咱们所说的“可约化”是指的可“多项式地”约化(Polynomial-time Reducible),即变换输入的方法是能在多项式的时间里完成的。约化的过程只有用多项式的时间完成才有意义。


好了,从约化的定义中咱们看到,一个问题约化为另外一个问题,时间复杂度增长了,问题的应用范围也增大了。经过对某些问题的不断约化,咱们可以不断寻找复杂 度更高,但应用范围更广的算法来代替复杂度虽然低,但只能用于很小的一类问题的算法。再回想前面讲的P和NP问题,联想起约化的传递性,天然地,咱们会想 问,若是不断地约化上去,不断找到能“通吃”若干小NP问题的一个稍复杂的大NP问题,那么最后是否有可能找到一个时间复杂度最高,而且能“通吃”全部的 NP问题的这样一个超级NP问题?答案竟然是确定的。也就是说,存在这样一个NP问题,全部的NP问题均可以约化成它。换句话说,只要解决了这个问题,那 么全部的NP问题都解决了。这种问题的存在难以置信,而且更加难以想象的是,这种问题不仅一个,它有不少个,它是一类问题。这一类问题就是传说中的NPC 问题,也就是NP-彻底问题。NPC问题的出现使整个NP问题的研究获得了飞跃式的发展。咱们有理由相信,NPC问题是最复杂的问题。再次回到全文开头, 咱们能够看到,人们想表达一个问题不存在多项式的高效算法时应该说它“属于NPC问题”。此时,个人目的终于达到了,我已经把NP问题和NPC问题区别开 了。到此为止,本文已经写了近5000字了,我佩服你还能看到这里来,同时也佩服一下本身能写到这里来。


NPC问题的定义很是简单。同时知足下面两个条件的问题就是NPC问题。首先,它得是一个NP问题;而后,全部的NP问题均可以约化到它。证实一个问题是 NPC问题也很简单。先证实它至少是一个NP问题,再证实其中一个已知的NPC问题能约化到它(由约化的传递性,则NPC问题定义的第二条也得以知足;至 于第一个NPC问题是怎么来的,下文将介绍),这样就能够说它是NPC问题了。


既然全部的NP问题都能约化成NPC问题,那么只要任意一个NPC问题找到了一个多项式的算法,那么全部的NP问题都能用这个算法解决了,NP也就等于P 了。所以,给NPC找一个多项式算法太难以想象了。所以,前文才说,“正是NPC问题的存在,令人们相信P≠NP”。咱们能够就此直观地理解,NPC问题 目前没有多项式的有效算法,只能用指数级甚至阶乘级复杂度的搜索。


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

不要觉得NPC问题是一纸空谈。NPC问题是存在的。确实有这么一个很是具体的问题属于NPC问题。下文即将介绍它。


下文即将介绍逻辑电路问题。这是第一个NPC问题。其它的NPC问题都是由这个问题约化而来的。所以,逻辑电路问题是NPC类问题的“鼻祖”。

逻辑电路问题是指的这样一个问题:给定一个逻辑电路,问是否存在一种输入使输出为True。
什么叫作逻辑电路呢?一个逻辑电路由若干个输入,一个输出,若干“逻辑门”和密密麻麻的线组成。看下面一例,不须要解释你立刻就明白了。

这是个较简单的逻辑电路,当输入一、输入二、输入3分别为True、True、False或False、True、False时,输出为True。
有输出不管如何都不可能为True的逻辑电路吗?有。下面就是一个简单的例子。

 

上面这个逻辑电路中,不管输入是什么,输出都是False。咱们就说,这个逻辑电路不存在使输出为True的一组输入。


回到上文,给定一个逻辑电路,问是否存在一种输入使输出为True,这即逻辑电路问题。


逻辑电路问题属于NPC问题。这是有严格证实的。它显然属于NP问题,而且能够直接证实全部的NP问题均可以约化到它(不要觉得NP问题有无穷多个将给证 明形成不可逾越的困难)。证实过程至关复杂,其大概意思是说任意一个NP问题的输入和输出均可以转换成逻辑电路的输入和输出(想一想计算机内部也不过是一些 0和1的运算),所以对于一个NP问题来讲,问题转化为了求出知足结果为True的一个输入(即一个可行解)。

有了第一个NPC问题后,一大堆NPC问题就出现了,由于再证实一个新的NPC问题只须要将一个已知的NPC问题约化到它就好了。后来,Hamilton 回路成了NPC问题,TSP问题也成了NPC问题。如今被证实是NPC问题的有不少,任何一个找到了多项式算法的话全部的NP问题均可以完美解决了。所以 说,正是由于NPC问题的存在,P=NP变得难以置信。P=NP问题还有许多有趣的东西,有待你们本身进一步的挖掘。攀登这个信息学的巅峰是咱们这一代的 终极目标。如今咱们须要作的,至少是不要把概念弄混淆了。

相关文章
相关标签/搜索