精华内容
下载资源
问答
  • NP完全问题 相关

    2017-11-20 09:26:34
    根据维基百科整理的NP问题相关材料,涉及计算复杂性分析,最优化技术等等。
  • NP困难问题的理解

    万次阅读 2011-03-24 21:51:00
    刚看了一点NP问题以及NP困难问题的定义,看的有点头晕。用自己的话说起来就是这样:NP问题的全称是:Non deterministic Ploynomial问题,即非确定性多项式问题。 多项式时间(Polynomial time)在计算复杂度理论中...

    刚看了一点NP问题以及NP困难问题的定义,看的有点头晕。用自己的话说起来就是这样:

    NP问题的全称是:Non deterministic Ploynomial问题,即非确定性多项式问题。

       多项式时间(Polynomial time)在计算复杂度理论中,指的是一个问题的计算时间m(n)不大于问题大小n的多项式倍数。

       什么是非确定性问题呢?有些计算问题是确定性的,比如加减乘除之类,你只要按照公式推导,按部就班一步步来,就可以得到结果。但是,有些问题是无法按部就班直接地计算出来。比如,找大质数的问题。有没有一个公式,你一套公式,就可以一步步推算出来,下一个质数应该是多少呢?这样的公式是没有的。再比如,大的合数分解质因数的问题,有没有一个公式,把合数代进去,就直接可以算出,它的因子各自是多少?也没有这样的公式。这种问题的答案,是无法直接计算得到的,只能通过间接的“猜算”来得到结果。这也就是非确定性问题。而这些问题的通常有个算法,它不能直接告诉你答案是什么,但可以告诉你,某个可能的结果是正确的答案还是错误的。这个可以告诉你“猜算”的答案正确与否的算法,假如可以在多项式时间内算出来,就叫做多项式非确定性问题。

        NP问题就是非确定性的多项式问题,也就是说,可以在多项式时间内验证一个解是否正确的问题是NP问题。P问题是能在多项式时间内求出其解的问题,所有的P问题都是NP问题,但是是否P=NP,目前还没有被证明。

       不是所有的NP问题都是难解的问题,比如数组排序的问题就是P类问题,但是P属于NP问题,所它也是NP问题,但是他并不难解。

      NP困难问题:对于一个判定问题A,如果所有的NP问题都可以多项式时间规约到A,那么这个问题就是NP困难问题。

      NPC问题:对于一个NP问题A,如果所有的NP问题都可以多项式时间规约到A,那么这个问题就是NP困难问题。

       NPC,也成NP完全问题,它是NP问题的一个子类,比如哈密尔顿回路问题就是NPC问题。它是这样描述的,给定N个顶点,以及任意两个顶点之间的距离,求出一条回路,使其经过每个顶点,且回路的总距离最短。这个问题可以通过枚举求出解,但是他的时间复杂度是(N-1)!,随着N的增大,要计算解是不可能的。

       NPC有一种性质,那就是如果能证明NPC问题可以再多项式时间内求出其解,则所有的NP都可以在多项式时间内求解了,即P=NP成立所以,我们一般认为NPC问题是难解的问题,因为他不太可能存在一个多项式时间的算法(如果存在则所有的NP问题都存在多项式时间算法,这太不可思议了,但是也不是不可能)。

       NP完全问题的证明:要证明一个判定问题是NP完全的,只要在NP完全类中找到一个问题A,将这个问题归约到待证明问题即可.要证明问题是NP完全是很困难的,因为很多问题之间的转化过程是很难想到的.第一个被证明的NP完全问题是可满足性问题,它是判定一个合取范式的布尔公式F是否存在真值指派的问题.在很多NP完全问题的证明中,我们都可以用这个问题来归约,这里不再详述.

    展开全文
  • P问题NP问题NP完全问题NP问题

    万次阅读 多人点赞 2018-05-24 14:24:38
    在讲P类问题之前先介绍两个个概念:多项式,时间复杂度。(知道这两概念的可以自动跳过这部分)1、多项式:axn-bxn-1+c恩....就是长这个样子的,叫x最高次为n的多项式....咳咳,别嫌我啰嗦。。有些人说不定还真忘了啥...

    在讲P类问题之前先介绍两个个概念:多项式,时间复杂度。(知道这两概念的可以自动跳过这部分)

    1、多项式:axn-bxn-1+c

    恩....就是长这个样子的,叫x最高次为n的多项式....

    咳咳,别嫌我啰嗦。。有些人说不定还真忘了啥是多项式了。。例如第一次看到的鄙人→_→

    2、时间复杂度

    我们知道在计算机算法求解问题当中,经常用时间复杂度和空间复杂度来表示一个算法的运行效率。空间复杂度表示一个算法在计算过程当中要占用的内存空间大小,这里暂不讨论。时间复杂度则表示这个算法运行得到想要的解所需的计算工作量,他探讨的是当输入值接近无穷时,算法所需工作量的变化快慢程度。

    举个例子:冒泡排序。

    在计算机当中,排序问题是最基础的,将输入按照大小或其他规则排好序,有利于后期运用数据进行其他运算。冒泡排序就是其中的一种排序算法。假设手上现在有n个无序的数,利用冒泡排序对其进行排序,

    ①首先比较第1个数和第2个数,如果后者>前者,就对调他们的位置,否则不变

    ②接着比较第2个数和第3个数,如果后者>前者,就对调他们的位置,否则不变

    ③一直向下比较直到第n-1和第n个数比较完,第一轮结束。(这时候最大的数移动到了第n个数的位置)

    ④重复前三步,但是只比较到第n-1个数(将第二大的数移动到第n-1个数位置)

    ⑤持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

    举个实例:5,4,3,2,1,对其进行排序,先是比较5跟4变成4,5,3,2,1,第一轮结束后变成43215,可以计算,当对其排序完正好要经过4+3+2+1=10次比较,当然这是最复杂的情况,即完全反序。可以知道对于n个数,至多要经过1+2+...+n-1即(n^2-n)/2次比较才能排好序。这个式子里n的最高次阶是2,可知道当n→∞时,一次性对其比较次数影响很小,所以我们把这个算法的时间复杂度比作:o(n^2)。取其最高次,可以看出,这是一个时间复杂度为多项式的表示方式。

    时间复杂度排序o(1)<o(n)<o(lgn)<o(n^2)<o(n^a)<o(e^n)(a>2,n表示输入的数据个数,o(1)为常数级别)


    好了,介绍完上面的概念就可以开始讲关于什么叫P类问题了。以上个例子冒泡排序为例,我们知道了,在排序这个大问题里,是可以找到一种时间复杂度为多项式o(n^2)的算法(如冒泡排序法)来求解排序问题的,所以我们说排序问题是一个有多项式时间算法的问题。

    所以我们称,

    P类问题:存在多项式时间算法的问题。(P:polynominal,多项式)


    然后扯个题外话,为什么我们要研究这个?因为计算机处理的输入常常不是那么几十个几千个那么一点点,想象一下,当计算机处理的数据达到100万个的时候,时间复杂度为o(n^2)和o(e^n)的算法,所需的运行次数简直是天壤之别,o(e^n)指数级的可能运行好几天都没法完成任务,所以我们才要研究一个问题是否存在多项式时间算法。而我们也只在乎一个问题是否存在多项式算法,因为一个时间复杂度比多项式算法还要复杂的算法研究起来是没有任何实际意义的。


    好了,接下来我们介绍NP,先给定义,

    NP类问题:能在多项式时间内验证得出一个正确解的问题。(NP:Nondeterministic polynominal,非确定性多项式)

    P类问题是NP问题的子集,因为存在多项式时间解法的问题,总能在多项式时间内验证他。


    注意定义,这里是验证。NP类问题,我用个人的俗话理解就是,不知道这个问题是不是存在多项式时间内的算法,所以叫non-deterministic非确定性,但是我们可以在多项式时间内验证并得出这个问题的一个正确解。举个例子,

    著名的NP类问题:旅行家推销问题(TSP)。即有一个推销员,要到n个城市推销商品,他要找出一个包含所有n个城市的环路,这个环路路径小于a。我们知道这个问题如果单纯的用枚举法来列举的话会有(n-1)! 种,已经不是多项式时间的算法了,(注:阶乘算法比多项式的复杂)。那怎么办呢?我们可以用猜的,假设我人品好,猜几次就猜中了一条小于长度a的路径,我画画画画,好的,我得到了一条路径小于a的环路,问题解决了,皆大欢喜。可是,我不可能每次都猜的那么准,也许我要猜完所有种呢?所以我们说,这是一个NP类问题。也就是,我们能在多项式的时间内验证并得出问题的正确解,可是我们却不知道该问题是否存在一个多项式时间的算法,每次都能解决他(注意,这里是不知道,不是不存在)。

    所以这就引出了这类讨论的一个千年问题:是否 NP类问题=P类问题?

    即,是否所有能在多项式时间内验证得出正确解的问题,都是具有多项式时间算法的问题呢?

    太让人震惊了,要是解决了这个问题,那岂不是所有的NP问题都可以通过计算机来解决?


    圣战的结果是,有的存在,有的不存在。=_=

    在这场圣战中,人们还发现了很多的东东,也就是我们接下来要介绍的NPC问题(啊喂,我不是游戏NPC)和NPH问题。

    (PS :网络上经常有人说,这不是个NP问题吗,其实很多时候他们说的应该是NPC问题,而不是NP问题)

    为了证明这个千古难题,科学家想出了很多办法。其中之一就是问题的约化。所谓问题约化就是,可以用问题B的算法来解决A ,我们就说问题A可以约化成问题B。举个例子,一元一次方程的求解,跟二元一次方程的求解,我们知道,只要能求解二元一次方程,那就可以用二元一次方程的解法来求解一元一次方程,只需要将一元一次方程加上y,并附加一个方程y=0就可以将一元一次方程变形为一个二元一次方程,然后用二元一次方程的解法来求解这个方程。注意,这里二元一次方程的解法会比一元一次的复杂。所以我们说,只需要找到解二元一次方程的规则性解法,那就能用这个规则性解法来求解一元一次方程。从这里也可以看出,约化是具有传递性的,如A约化到B,B约化到C,A就可以约化到C,同时不断约化下去,我们会发现一个很惊人的特性,就是他一定会存在一个最大的问题,而我们只需要解决了这个问题,那其下的所有问题也就解决啦!这就是我们所说的NPC问题的概念!!!

    引到NP问题里就是,对于同一类的所有的NP类问题,若他们都可以在多项式时间内约化成最难的一个NP类问题,(我们直观的认为,被约化成的问题应具有比前一个问题更复杂的时间复杂度)当我们针对这个时间复杂度最高的超级NP问题要是能找到他的多项式时间算法的话,那就等于变向的证明了其下的所有问题都是存在多项式算法的,即NP=P!!!!给出NPC问题定义。

    (3)NPC类问题(Nondeterminism Polynomial complete):存在这样一个NP问题,所有的NP问题都可以约化成它。换句话说,只要解决了这个问题,那么所有的NP问题都解决了。其定义要满足2个条件: 

    首先,它得是一个NP问题;

    然后,所有的NP问题都可以约化到它。

    要证明npc问题的思路就是: 

    先证明它至少是一个NP问题,再证明其中一个已知的NPC问题能约化到它。

    (4)NP难问题(NP-hard问题):

        NP-Hard问题是这样一种问题,它满足NPC问题定义的第二条但不一定要满足第一条(就是说,NP-Hard问题要比 NPC问题的范围广,NP-Hard问题没有限定属于NP),即所有的NP问题都能约化到它,但是他不一定是一个NP问题。

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

    以上四个问题他们之间的关系可以用下图来表示: 
    这里写图片描述


    展开全文
  • 时间复杂度以及NP问题详解

    千次阅读 2020-05-29 11:25:03
    什么是P问题NP问题和NPC问题 这或许是众多OIer最大的误区之一。 你会经常看到网上出现“这怎么做,这不是NP问题吗”、“这个只有搜了,这已经被证明是NP问题了”之类的话。你要知道,大多数人此时所说的NP问题...

    什么是P问题、NP问题和NPC问题

        这或许是众多OIer最大的误区之一。
        你会经常看到网上出现“这怎么做,这不是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!)型复杂度,它是非多项式级的,其复杂度计算机往往不能承受。当我们在解决一个问题时,我们选择的算法通常都需要是多项式级的复杂度,非多项式级的复杂度需要的时间太多,往往会超时,除非是数据规模非常小。

     下面引入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类问题的关系。

        很显然,所有的P类问题都是NP问题。也就是说,能多项式地解决一个问题,必然能多项式地验证一个问题的解——既然正解都出来了,验证任意给定的解也只需要比较一下就可以了。关键是,人们想知道,是否所有的NP问题都是P类问题。我们可以再用集合的观点来说明。如果把所有P类问题归为一个集合P中,把所有 NP问题划进另一个集合NP中,那么,显然有P属于NP。现在,所有对NP问题的研究都集中在一个问题上,即究竟是否有P=NP?通常所谓的“NP问题”,其实就一句话:证明或推翻P=NP。
        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。
        什么叫做逻辑电路呢?一个逻辑电路由若干个输入,一个输出,若干“逻辑门”和密密麻麻的线组成。看下面一例,不需要解释你马上就明白了。

        这是个较简单的逻辑电路,当输入1、输入2、输入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问题还有许多有趣的东西,有待大家自己进一步的挖掘。攀登这个信息学的巅峰是我们这一代的终极目标。现在我们需要做的,至少是不要把概念弄混淆了。

    展开全文
  • NP问题真的很难理解

    万次阅读 多人点赞 2019-06-26 10:50:17
    希望通过这篇文章可以不仅让计算机相关专业的人可以看懂和区分什么是P类问题什么是NP问题,更希望达到的效果是非专业人士比如学文科的朋友也可以有一定程度的理解。 有一则程序员界的笑话,就是有一哥们去...

    希望通过这篇文章可以不仅让计算机相关专业的人可以看懂和区分什么是P类问题什么是NP类问题,更希望达到的效果是非专业人士比如学文科的朋友也可以有一定程度的理解。

     

    有一则程序员界的笑话,就是有一哥们去google面试的时候被问到一个问题是:在什么情况下P=NP,然后他的回答是”当N=1的时候”。这是我第一次听说P=NP问题,大概是在临近毕业为找工作而准备的时候。

    这几天科技类新闻的头条都被阿尔法狗大战李世石刷爆了,虽然我也不是AI专家,但是也想从普通人的角度来写点东西来聊聊这个有意思的事情,在搜集资料的时候又一次看到了NP问题,于是想开个小差,在写下一篇文章《AI是怎么下围棋的?》之前,先说说这个NP问题哈。

    最简单的定义是这样的:

    P问题:

    一个问题可以在多项式(O(n^k))的时间复杂度内解决。

    NP问题:

    一个问题的解可以在多项式的时间内被验证。

    NP-hard问题:

    任意np问题都可以在多项式时间内归约为该问题,但该问题本身不一定是NP问题。归约的意思是为了解决问题A,先将问题A归约为另一个问题B,解决问题B同时也间接解决了问题A。

    NPC问题:

    既是NP问题,也是NP-hard问题。

    这样的定义虽然简单,但是对于第一次接触P、NP的人来说,就像前一阵问你什么是“引力波”而你回答:引力波是时空的涟漪。从答案中几乎没有得到任何有意义的理解。所以接来来的内容希望不仅计算机相关专业的人可以看懂,希望达到的效果是文科生们也可以有一定程度的理解。

    现阶段虽然电脑已经非常的普及,有人用它来上网,有用它来的游戏,有用它来看片,但是很少人有还在乎电脑的本质是计算机,它在给人们的日常生活带来娱乐和方便的同时表现的其实是其庞大的计算能力。日常生活中我们使用的各种五花八门的软件,其实都是一组计算机程序,而程序则可以看作是一系列算法,而我们看到的计算机的硬件的作用就是处理这些算法。这里的所说算法不只是简单的加减乘除,而是包括下面这些要素:

    算术运算:加减乘除等运算

    逻辑运算:或、且、非等运算

    关系运算:大于、小于、等于、不等于等运算

    数据传输:输入、输出、赋值等运算

    以及通过控制结构来控制处理这些运算或操作的顺序。说到这里有点担心有些朋友已经不是很明白了,举个例子吧。

    我们如何从n个数里面挑出最大的数。这个简单吧,就只需要一个一个数的对比过去就行了。具体说也就是先比较n和n-1,记下比较大的那个数,接着我们再比较记下的这个数和n-2,又记下比较大的数,这样一直比到最后一个数。这整个比较的过程我们就可以把其叫作算法,而这个算法就包含了上述的这些要素。给我们的n个数就是算法的输入数据,我们要挑选出最大的那个数就是算法的输出数据,当中我们判断大小的时候必然采用了一些基础的算术运算或关系运算。

    希望说到这里大家能够基本理解什么是算法,因为接下来我要花一点时间说说什么是算法的时间复杂度。要计算或解决一个问题,该问题通常有一个大小规模,用n表示。我们还是引用上面的例子,从n个数里面找出最大的那个数,这个n就是该问题的规模大小。怎么找呢?我们要通过比较n-1次才能得到结果,这个n-1次就可以理解为所花的时间,也就是时间复杂度。再比如,将这n个数按从大至小排序,n是其规模大小,若是我们按照这样的方法:第一次从n个数里找最大,第二次从n-1个数里找最大,以此类推,需要的比较次数就是n(n-1)/2。我们所用的方法称之库为算法,那么n(n-1)/2就是该算法的时间复杂度。对于时间复杂度,当n足够大时,我们只注重最高次方的那一项,其他各项可以忽略,另外,其常数系数也不重要,所以,n(n-1)/2我们只重视n的平方这一项了,记为O(n^2),这就是该算法对该问题的时间复杂度的专业表示。

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

    Ok,写到这里总算要引入正题了,容易看的出,前面的几类时间复杂度可以分为两种级别:一种是O(1),O(log(n)),O(n^a)等,我们把它叫做多项式级的复杂度,因为它的规模n出现在底数的位置;另一种是O(a^n)和O(n!)型复杂度,它是非多项式级的,其复杂度往往计算机都不能承受。

    是时候引入P、NP问题的概念了:如果一个问题可以找到一个能在多项式的时间复杂度里解决它的算法,那么这个问题就属于P问题。而NP问题的理解并不是NotP,NP问题不是非P类问题。NP问题是指可以在多项式的时间里验证一个解的问题,NP问题的另一个定义是,可以在多项式的时间里猜出一个解的问题。P类问题相信不用举太多的例子来说明了,上面提到的找最大数,排序等问题都是P类问题,而要更好的理解NP问题需要另外举一个例子。

    大整数因式分解问题-比如有人告诉你数9938550可以分解成两个数的乘积,你不知道到底对不对,但是如果告诉你这两个数是1123和8850,那么很容易就可以用最简单的计算器进行验证。

    最短路径问题-某顶点出发,沿图的边到达另一顶点所经过的路径中,各边上权值之和最小的一条路径——最短路径。

    如上图,比如告诉你从点0到点5的最短路径是22,要验证的话只需要0->1,加上1->5,13+9=22,时间复杂度是常量O(n),假如从上图的六个点扩大到n个点的话,验证过程所需要的算法时间很杂度也都是O(n)。如果没有告诉你最短路径是多要,要用算法来求解的话,我们可以这样来“猜测”它的解:先求一个总路程不超过 100的方案,假设我们可以依靠极好的运气“猜出”一个路线,使得总长度确实不超过100,那么我们只需要每次猜一条路一共猜n次。接下来我们再找总长度不超过 50 的方案,找不到就将阈值提高到75…… 假设最后找到了总长度为 90 的方案,而找不到总长度小于90的方案。我们最终便在多项式时间O(n^k)内“猜”到了这个旅行商问题的解是一个长度为 90 的路线。

    是否有不是NP问题的问题呢?有。就是对于那些验证解都无法在多项式时间复杂度内完成的问题。比如问:一个图中是否不存在Hamilton回路?

    从图中的任意一点出发,最终回到起点,路途中经过图中每一个结点当且仅当一次,则成为哈密顿回路。

    验证Hamilton回路只需要把给定的路径走一次看是不是只每个结点只经过一次,而验证不存在Hamilton回路则需要把每条路径都走一遍否则不敢说不存在Hamilton回路。

    之所以要特别的定义NP问题,就在于我们不会去为那些无法在多项式时间复杂度内验证的问题去在多项式的时间复杂度内求它的解,有点拗口,但是多看几遍应该明白,通俗的讲就是对于一个问题告诉你答案让你去验证都需要很长很长时间,可以相像要用算法去求解的话必定需要更长时间。

    那么反过来说,所有的P类问题都是NP问题。也就是说,能多项式地解决一个问题,必然能多项式地验证一个问题的解——既然正解都出来了,验证任意给定的解也只需要比较一下就可以了,大不了再算一次给你看也只需要多项式的时间复杂度。关键是,人们想知道,是否所有的NP问题都是P类问题,也就是说是否所有可以用多项式时间验证的问题,也可以在多项式时间内求解。我们可以用集合的观点来说明。如果把所有P类问题归为一个集合P中,把所有NP问题划进另一个集合NP中,那么,显然有P属于NP。现在,所有对NP问题的研究都集中在一个问题上,即究竟是否有P=NP?通常所谓的“NP问题”,其实就一句话:证明或推翻P=NP。

    说到这里什么是P类问题什么是NP类问题就讲完了。可能有一些人还不是很清楚,再用通俗但不是很严谨的表述来总结一下。

    P类问题就是指那些计算机比较容易算出答案的问题。

    NP类问题就是指那些已知答案以后计算机可以比较容易地验证答案的问题。

    接下来要进入的话题是为什么P=NP难证明,觉得枯燥的看到这里已经很好了,起码能分清楚P和NP问题了吧,接下来的内容将比较烧脑。

    我们先来看一副集合示意图,这副图反映的是P=NP或P!=NP时候的两个集合的效果,其中就出现了NP-Hard和NPC两个新的概念。要说明为什么目前为止P是否等于NP还没有结论,不得不先弄清楚NPC和NP-Hard。

    在引入NPC之前我们先来学习一个概念-归约。简单地说,一个问题A可以归约为问题B的意思是说,可以用问题B的解法解决问题A,或者说,问题A可以“变成”问题B。举个例子,现在有两个问题:求解一个一元一次方程和求解一个一元二次方程。那么我们说,前者可以归约为后者,因为知道怎么样解一个一元二次方程那么一定能解出一元一次方程,因为一元一次方程是一个二次项系数为零的一元二次方程。“问题A可归约为问题B”,那么很容易理解问题B比问题A难,要解决问题B的时间复杂度也就应该大于或等于解决问题A的时间复杂度。而且归约有一项重要的性质:传递性。如果问题A可归约为问题B,问题B可归约为问题C,则问题A一定可归约为问题C,这应该很容易理解吧。现在再来说一下归约的标准概念:如果能找到这样一个变化法则,对任意一个程序A的输入,都能按这个法则变换成程序B的输入,使两程序的输出相同,那么我们说,问题A可归约为问题B。

    从归约的定义中我们看到,一个问题归约为另一个问题,时间复杂度增加了,问题的应用范围也增大了。通过对某些问题的不断归约,我们能够不断寻找复杂度更高,但应用范围更广的算法来代替复杂度虽然低,但只能用于很小的一类问题的算法。那么如果把一个NP问题不断地归约上去,那么最后是否有可能找到一个时间复杂度最高,并且能“通吃”所有的NP问题的这样一个超级NP问题?答案居然是肯定的。也就是说,存在这样一个NP问题,所有的NP问题都可以归约成它,并且这种问题不只一个,它有很多个,它是一类问题。这一类问题就是传说中的NPC问题,也就是NP-完全问题。所以NPC问题的定义非常简单。同时满足下面两个条件的问题就是NPC问题。首先,它得是一个NP问题;然后,所有的NP问题都可以归约到它。

    既然所有的NP问题都能归约成NPC问题,那么只要任意一个NPC问题找到了一个多项式的算法,那么所有的NP问题都能用这个算法解决了,那么NP也就等于P了。因此,目前NPC问题还没有多项式的有效算法,只能用指数级甚至阶乘级复杂度的算法来解决,那么意思就是如果能够找到一个能用多项式时间复杂度解决的NPC问题就证明了P=NP了。

    而说到NP-Hard问题。NP-Hard问题是这样一种问题,它满足NPC问题定义的第二条但不一定要满足第一条,就是说所有的NP问题都能归化到它,但它本身并不一定是个NP问题,也就是即使有一天发现了NPC问题的多项式算法,但NP-Hard问题仍然无法用多项式算法解决,因为它不是NP问题,对

    于答案的验证都很困难。

    下面引用Matrix67文章里的逻辑电路的例子来说明NPC问题。

    逻辑电路问题是指的这样一个问题:给定一个逻辑电路,问是否存在一种输入使输出为True。

    什么叫做逻辑电路呢?一个逻辑电路由若干个输入,一个输出,若干“逻辑门”和密密麻麻的线组成。看下面一例,不需要解释你马上就明白了。

    这是个较简单的逻辑电路,当输入1、输入2、输入3分别为True、True、False或False、True、False时,输出为True。

    有输出无论如何都不可能为True的逻辑电路吗?有。下面就是一个简单的例子。

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

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

    逻辑电路问题属于NPC问题。这是有严格证明的。它显然属于NP问题,并且可以直接证明所有的NP问题都可以归约到它。证明过程相当复杂,其大概意思是说任意一个NP问题的输入和输出都可以转换成逻辑电路的输入和输出(想想计算机内部也不过是一些0和1的运算),因此对于一个NP问题来说,问题转化为了求出满足结果为True的一个输入(即一个可行解)。

    类似这样的NPC问题,目前还没有找到在多项式复杂度内可以求解的算法,所以说一旦这样的问题都变得多项式复杂度内可解的话,很多问题都可以通过现有的计算机技术进行求解。就比如电脑下围棋,验证一局棋的结果显然是很简单的,但要保证每局都能赢的话目前的方法需要电脑穷举出所有的可能性,并根据每一步棋的变化搜索出最终达到胜利的下棋路径,目前的计算机性能显然是达不到的。因为围棋的状态空间复杂度达到了10的172方,而围棋的博弈树复杂度达到了10的300次方,光看数字可能不直观,一句话就是围棋的变化多过宇宙的原子数量!

    所以对于围棋这样的游戏人工智能如果要战胜人类需要实现下面两个条件中的任何一个:

    计算机性能无限强大,可以穷举所有可能性;

    研究出新的算法,在不穷举的情况下也能保证赢;

    目前 Google 的 AlphaGo所做的只不过是通过优化算法提高穷举效率,同时利用现有的大数据与云计算来提升计算性能而已 。下面一篇文章将更详细的介绍AI是如何下围棋的,敬请期待。

    展开全文
  • 看算法的时候经常会碰到NP问题NP问题(NPH)和NP完全问题(NPC)等术语,每次碰到的时候都似懂非懂,这次专门在网上搜了一些资料看,做一下记录,权当加深印象。 NP是指Non-deterministic Polynomial-time,即非...
  • 算法中的P问题NP问题NP完全问题NP问题

    万次阅读 多人点赞 2017-11-11 09:42:32
    在讨论算法的时候,常常会说到这个问题的求解是个P类问题,或者是NP问题等等,于是我特地搜了这方面的资料,自己总结了下,估计研究算法的大家应该都知道,要是我总结的哪里不对,欢迎一起探讨~ 在讲P类...
  • 哈哈哈~ ✨✨✨ 第八章:贪婪算法 8.1集合覆盖问题 8.2NP完全问题 8.2.1旅行商问题 8.2.2如何识别Np完全问题 8.3小结 二级目录 三级目录 最后的福利 8.1集合覆盖问题 假如你办了个广播节目,要让所有的州的听众都能...
  • 对于“NP问题”的理解

    万次阅读 多人点赞 2015-07-27 22:21:10
    (2)非确定性算法(Nondeterminism):设A是求解问题Π的一个算法,它将问题分解成两部分,分别为猜测阶段和验证阶段,其中猜测阶段:在这个阶段,对问题的输入实例产生一个任意字符串y,在算法的每一次运行时,串y
  • 算法:NP问题NP完全问题(NPC),NPhard问题

    万次阅读 多人点赞 2016-12-14 22:51:03
    在做计算机算法关于NP完全问题这一章的作业的时候,发现有很多概念理解的不是很透彻,然后就反复看老师的讲义,在网上查阅各种资料,花了很多时间来弄懂这块的内容。发现书上的概念太正式,定义太标准,不容易很快...
  • 一、3-SAT 是 NP 完全问题、 二、团问题NP 完全问题、 三、团问题NP 完全问题 证明思路
  • P问题NP问题、NPC问题NP hard问题

    万次阅读 多人点赞 2019-01-17 17:33:13
    NPC问题既是NP问题的子集,又是NP hard问题的子集,所以NPC问题NP问题NP hard问题的交集。 NP hard问题和NPC问题都要求能够在 多项式时间 内 规约 成另外一个问题。这里 规约 的意思是 将一个特殊问题一般化...
  • 浅谈P/NP问题

    万次阅读 2019-09-18 18:43:47
     NPC问题是在P问题NP问题上的一个重大进展,问题是,想要在NPC问题上找到一个多项式时间内的算法出奇地困难,难倒人们甚至不相信存在这样的算法,就像孙悟空的“一窍通,百窍通”一样,反正我没见过谁能做到。...
  • 不同于前面所有文章中的各个具体的问题和算法,NP完全性是一个很抽象的大概念,其包括但不仅限于标题中提到的P问题NP问题、NPC问题NP问题。这里我简单谈谈我对书上的内容和一些例子的理解。 P问题 首先来谈谈P...
  • 理解P问题NP问题

    2019-08-14 00:13:57
    NP-hard:比所有的NP问题都难的问题 NP-complete:满足两点: 是NP hard的问题NP问题 最简单的例子: 123,456,789,001是不是质数?对于这个问题,计算机科学家可以用现有算法快速得到答案——123,456,789,001...
  • 一、独立集问题、 二、独立集问题NP 完全问题证明思路、 二、证明独立集问题NP 完全问题
  • 如题。这里记录:P问题NP问题NP完全问题NP问题的概念。
  • NP问题

    2019-05-18 14:40:45
    复杂性理论中最具有理论意义的当数NP完全性...所谓“NPC完全性(NP-completeness)”问题是这样一个问题:由于“P=NP是否成立”这个问题难以解决,从NP类的问题中分出复杂性最高的一个子类,把它叫做NP完全类。 ...
  • NP完全问题

    千次阅读 2018-05-14 20:07:21
    如果一个算法的最差时间效率属于 O ( p ( n )) ,其中 p (n ) 是问题输入规模 n 的一个多项式函数,我们说该算法能够在多项式的时间内对问题求解。 我们把可以在多项式时间内求解的问题称为易解的,而不能在多项式时间...
  • 算法基础:NP完全问题

    万次阅读 多人点赞 2019-03-05 16:57:37
    对于NP完全问题的定义,百度百科是这样给出的:NP完全问题(NP-C问题),是世界七大数学难题之一。 NP的英文全称是Non-deterministic Polynomial的问题,即多项式复杂程度的非确定性问题。简单的写法是 NP=P?,问题就...
  • 困难问题,在 运筹学 和 理论计算机科学 中非常重要。 最早的旅行商问题的数学规划是由Dantzig(1959)等人提出,并且是在最优化领域中进行了深入研究。许多优化方法都用它作为一个测试基准。尽管问题在计算上很...
  • P问题NP问题、NPC问题以及NP-hard问题理解与区分
  • P问题NP问题NP-C问题NP-H问题
  • P问题NP问题NP问题

    千次阅读 2019-03-06 11:06:43
    有一则程序员界的笑话,就是有一哥们去google面试的时候被问到一个问题是:在什么情况下P=NP,然后他的回答是”当N=1的时候”。这是我第一次听说P=NP问题,大概是在临近毕业为找工作而准备的时候。 这几天科技类...
  • P类问题NP问题与NPC类问题

    千次阅读 多人点赞 2018-10-08 18:51:09
    你会经常看到网上出现“这怎么做,这不是NP问题吗”、“这个只有搜了,这已经被证明是NP问题了”之类的话。你要知道,大多数人此时所说的NP问题其实都是指的NPC问题。他们没有搞清楚NP问题和NPC问题的概念。NP问题...
  • 什么是P问题NP问题和NPC问题

    千次阅读 2017-04-17 11:48:56
    你会经常看到网上出现“这怎么做,这不是NP问题吗”、“这个只有搜了,这已经被证明是NP问题了”之类的话。你要知道,大多数人此时所说的NP问题其实都是指的NPC问题。他们没有搞清楚NP问题和NPC问题的概念。NP问题
  • P,NP, NPC, NP-Hard问题的关系详解

    千次阅读 2019-01-13 18:44:41
    我想试着把p, np, npc, np-hard问题给大家讲清楚了。讲不清楚,你给我留言,砸我招牌砸我店。 在介绍之前,先说一下什么是确定性问题,什么是非确定性问题。 确定性: 比如小学学的加减乘除之类的,你只要按部就班的...
  • Peter Cordes..6不,经典计算机可以解决NP问题,而不是快速解决大问题.实际表现并不是P与NP问题的关键所在.我认为(但不确定)可能存在一些经典多项式时间问题,量子计算机可以比具有可比技术水平的经典计算机更快地解决...
  • 设计一个函数f(x),把问题A的输入转换成问题B的一个输入,这样就能用问题B的解法来求解。(输出真或假) 转换函数f(x)的设计必须要保证问题B的输出结果和相应的问题A上的答案保持一致。 这样就是一个归约技术,将这...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,549
精华内容 6,619
关键字:

np困难问题