经常会遇到“这是NP问题吗?”,“这个只看来只能去搜了“,”这已经被证明是NP问题了”之类的话。但你是否真的知道这几个之间的区别呢?你要知道,大多数人此时所说的NP问题其实都是指的NPC问题。下面的内容都是在讲什么是P问题,什么是NP问题,什么是NPC问题。接下来你可以看到,把NP问题当成是 NPC问题是一个多大的错误。

引入:

1.多项式时间(Polynomial time)

还是先用几句话简单说明一下时间复杂度。时间复杂度并不是表示一个程序解决问题需要花多少时间,而是当问题规模扩大后,程序需要的时间长度增长得有多快。也就是说,对于高速处理数据的计算机来说,处理某一个特定数据的效率不能衡量一个程序的好坏,而应该看当这个数据的规模变大到数百倍后,程序运行时间是否还是一样,或者也跟着慢了数百倍,或者变慢了数万倍。不管数据有多大,程序处理花的时间始终是那么多的,我们就说这个程序很好,具有O(1)的时间复杂度,也称常数级复杂度;数据规模变得有多大,花的时间也跟着变得有多长,这个程序的时间复杂度就是O(n),比如找n个数中的最大值;而像冒泡排序、插入排序等,数据扩大2倍,时间变慢4倍的,属于O(n2)的复杂度。 还有一些穷举类的算法,所需时间长度成几何阶数上涨,这就是O(an)的指数级复杂度,甚至O(n!)的阶乘级复杂度。

不会存在O(2*n2)的复杂度,因为前面的那个“2”是系数,根本不会影响到整个程序的时间增长。

同样地,O (n3+n2)的复杂度也就是O(n3)的复杂度。因此,我们会说,一个O(0.01n3)的程序的效率比O(100n2)的效率低,尽管在n很小的时候,前者优于后者,但后者时间随数据规模增长得慢,最终O(n3)的复杂度将远远超过O(n2)。我们也说,O(n100)的复杂度小于O(1.01n)的复杂度。

容易看出,前面的几类复杂度被分为两种级别,其中后者的复杂度无论如何都远远大于前者:一种是O(1),O(log(n)),O(na)等,我们把它叫做多项式级的复杂度,因为它的规模n出现在底数的位置;另一种是O(an)和O(n!)型复杂度,它是非多项式级的,其复杂度计算机往往不能承受。当我们在解决一个问题时,我们选择的算法通常都需要是多项式级的复杂度,非多项式级的复杂度需要的时间太多,往往会超时,除非是数据规模非常小。

多项式倍数之所以特殊,主要是由于其值随n增大而加速增大的特性。如果是常数时间的话,意思就是无论n是什么值运算所花时间都一样。线性时间则是说多大n就花多少时间。多项式时间则意味着随着n增大,n每增加1所花的时间增长越来越多。对于n2-3这样一个多项式时间来说,n=2的时候可能只要花1的时间,甚至低于线性时间,但n=4的时候可能就要花13的时间了,可以想象再大一些这个数值会变得巨大。

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

2.确定性算法与非确定性算法:

确定性算法:

设A是求解问题B的一个解决算法,在算法的整个执行过程中,每一步都能得到一个确定的解,这样的算法就是确定性算法。

非确定性算法:

设A是求解问题B的一个解决算法,它将问题分解成两部分,分别为猜测阶段和验证阶段,其中

猜测阶段:在这个阶段,对问题的一个特定的输入实例x产生一个任意字符串y,在算法的每一次运行时,y的值可能不同,因此,猜测以一种非确定的形式工作。
验证阶段:在这个阶段,用一个确定性算法(有限时间内)验证。①检查在猜测阶段产生的y是否是合适的形式,如果不是,则算法停下来并得到no;② 如果y是合适的形式,则验证它是否是问题的解,如果是,则算法停下来并得到yes,否则算法停下来并得到no。它是验证所猜测的解的正确性。

3.规约/约化:

《算法导论》中有一个例子:现在有两个问题:求解一个一元一次方程和求解一个一元二次方程。那么我们说,前者可以规约为后者,意即知道如何解一个一元二次方程那么一定能解出一元一次方程。我们可以写出两个程序分别对应两个问题,那么我们能找到一个“规则”,按照这个规则把解一元一次方程程序的输入数据变一下,用在解一元二次方程的程序上,两个程序总能得到一样的结果。这个规则即是:两个方程的对应项系数不变,一元二次方程的二次项系数为0。

问题A可以约化为问题B,称为“问题A可规约为问题B”,可以理解为问题B的解一定就是问题A的解,因此解决A不会难于解决B。由此可知 “问题A可约化为问题B”有一个重要的直观意义:B的时间复杂度高于或者等于A的时间复杂度。也就是说,问题A不比问题B难。

从规约的定义中我们看到,一个问题规约为另一个问题,时间复杂度增加了,问题的应用范围也增大了。通过对某些问题的不断规约,我们能够不断寻找复杂度更高,但应用范围更广的算法来代替复杂度虽然低,但只能用于很小的一类问题的算法。

约化具有一项重要的性质:约化具有传递性。如果问题A可约化为问题B,问题B可约化为问题C,则问题A一定可约化为问题C。

存在这样一个NP问题,所有的NP问题都可以约化成它。换句话说,只要解决了这个问题,那么所有的NP问题都解决了。这种问题的存在难以置信,并且更加不可思议的是,这种问题不只一个,它有很多个,它是一类问题。这一类问题就是传说中的NPC问题,也就是NP-完全问题。

理解了上面讲的内容,下面我们来进入正题,什么是P类问题?NP类问题?NPC问题?NP-hard问题?

P类问题:

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

例如:n个数的排序(不超过O(n^2))

从 P=NP? 引入NP类问题:

“P=NP?” 通常被认为是计算机科学最重要的问题。在很早的时候,就有个数学家毫不客气的指出,P=NP? 是个愚蠢的问题,并且为了嘲笑它,专门在4月1号写了一篇“论文”,称自己证明了 P=NP。

NP问题不是非P类问题。NP问题是指可以在多项式的时间里验证一个解的问题。NP问题的另一个定义是,可以在多项式的时间里猜出一个解的问题。也就是说,不能判定这个问题到底有没有解,而是猜出一个解来在多项式时间内证明这个解是否正确。即该问题的猜测过程是不确定的,而对其某一个解的验证则能够在多项式时间内完成。P类问题属于NP问题,但NP类问题不一定属于P类问题。比方说,我RP很好,在程序中需要枚举时,我可以一猜一个准。现在某人拿到了一个求最短路径的问题,问从起点到终点是否有一条小于100个单位长度的路线。它根据数据画好了图,但怎么也算不出来,于是来问我:你看怎么选条路走得最少?我说,我RP很好,肯定能随便给你指条很短的路出来。然后我就胡乱画了几条线,说就这条吧。那人按我指的这条把权值加起来一看,嘿,神了,路径长度98,比100小。于是答案出来了,存在比100小的路径。别人会问他这题怎么做出来的,他就可以说,因为我找到了一个比100 小的解。在这个题中,找一个解很困难,但验证一个解很容易。验证一个解只需要O(n)的时间复杂度,也就是说我可以花O(n)的时间把我猜的路径的长度加出来。那么,只要我RP好,猜得准,我一定能在多项式的时间里解决这个问题。我猜到的方案总是最优的,不满足题意的方案也不会来骗我去选它。这就是NP问题。当然有不是NP问题的问题,即你猜到了解但是没用,因为你不能在多项式的时间里去验证它。下面我要举的例子是一个经典的例子,它指出了一个目前还没有办法在多项式的时间里验证一个解的问题。很显然,前面所说的Hamilton回路是NP问题,因为验证一条路是否恰好经过了每一个顶点非常容易。但我要把问题换成这样:试问一个图中是否不存在Hamilton回路。这样问题就没法在多项式的时间里进行验证了,因为除非你试过所有的路,否则你不敢断定它“没有Hamilton回路”。

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

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

目前为止P=NP?这个问题还“啃不动”。但是,一个总的趋势、一个大方向是有的。人们普遍认为,P=NP不成立,也就是说,多数人相信,存在至少一个不可能有多项式级复杂度的算法的NP问题。人们如此坚信P≠NP是有原因的,就是在研究NP问题的过程中找出了一类非常特殊的NP问题叫做NP-完全问题,也即所谓的 NPC问题。C是英文单词“完全”的第一个字母。正是NPC问题的存在,使人们相信P≠NP。下文将花大量篇幅介绍NPC问题,你从中可以体会到NPC问题使P=NP变得多么不可思议。

NPC问题:

有个叫Cook的人发现所有的NP问题都可以规约到一种叫做SAT的问题,也就是说只要SAT能有效的解决,所有问题都能利这种方法经过相应转化而有效解决,后来人们发现所有的问题能规约到的问题不止一种,而是一大类,有很多个,这类问题就被称作NP-complete问题,俗称NP完全问题,就是说这类问题是np里最难的,所有的NP问题都可以规约到他们。到这里我们注意到NPC问题是有两个条件的:
首先,它得是一个NP问题;然后,所有的NP问题都可以约化到它。证明一个问题是 NPC问题也很简单。先证明它至少是一个NP问题,再证明其中一个已知的NPC问题能约化到它(由约化的传递性,则NPC问题定义的第二条也得以满足;至于第一个NPC问题是怎么来的,下文将介绍),这样就可以说它是NPC问题了。

既然所有的NP问题都能约化成NPC问题,那么只要任意一个NPC问题找到了一个多项式的算法,那么所有的NP问题都能用这个算法解决了,NP也就等于P 了。因此,给NPC找一个多项式算法太不可思议了。因此,前文才说,“正是NPC问题的存在,使人们相信P≠NP”。我们可以就此直观地理解,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-Hard问题:

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

相互关系:

显然,所有P问题都是NP问题,反之则不一定。NPC问题是NP问题的子集,也是P问题和NP问题的差异所在。如果找到一个多项式内能被解决的NPC问题的解决方法,那么P=NP。


更多人倾向的分类:

总结:

简单但严谨的解释:

问题:对于一个包含由0和1组成的字符串集合S,以某个01字符串x作为输入,要求某个图灵机判断x在不在S里面。这里的图灵机可以先想象成平时我们用的计算机,S也可以被看成我们要解决的问题。注意我们的问题非常简单,就是要判断某个字符串x是否在某个集合S里面,下面是定义:

P:有一个图灵机在多项式时间内能够判断x是否在S里面

NP:有一个图灵机M,如果某个字符串x在S里面,那么存在一个验证字符串u(注意这个u是针对这个x的,而且长度必须是x长度的多项式关系),M以x和u作为输入,能够验证x真的是在S里面。

NP-hard:如果某个问题S是NP-hard,那么对于任意一个NP问题,我们都可以把这个NP问题在多项式时间之内转化为S,并且原问题的答案和转化后S的答案是相同的。也就是说只要我们解决了S,那么就解决了所有的NP问题。

NP-complete:一个问题既是NP-hard,又在NP里面;也就是说

  1. 解决了这个问题我们就解决了所有NP问题
  2. 这个问题本身也是个NP问题

注:

1.图灵机是什么?
想象你只有纸带和一个类似于打字机一样的,能够沿着纸带写0或1的自动写字装置(只能顺着纸带写不能跳跃),并且这个机器也能读在某个位置上的字符是0还是1,现在要求你用这样一套东西去实现一个算法,你会怎么做?observe,这就是计算机发明前数学家们手头的工具。粗略的说,这就是图灵机定义的来源。
另外我们还需要这个机器能够记录它之前做了什么事情,比如如果用这个机器算100+111,我们需要把纸带移到个位数,再开始加法,但我们需要及其能够记住 纸带已经到个位数 这件事,这样才能达到自动化,所以这个机器应该能够保存几个状态。这时有个问题:状态的数目可以根据输入变化吗?应该是不可以的,因为如果要机器能够自动执行某个算法,我们不希望换个输入就又要把机器重新制造一遍,这样简直比单独手算每个输入还麻烦,所以状态的数量应该是在造机器的时候就定死的(常数)。好奇的同学可能会问:那么状态数量就一定不能变化吗?答案是:如果变化,就不是一个图灵机模型了;图灵机只是很多种计算模型的一种,之所以它这么出名,是因为现代计算机就是一个通用图灵机,我们天天都在用。比如如果我们允许状态的数量根据输入长度变化,那么这就变成了一个boolean circuit,这个具体是什么就不展开了。
思考题:能否用上面定义的图灵机来实现一个简单的加法器呢?
2. 图灵机为什么这么重要?
如上所说,图灵机只是很多种计算模型中的一种。在计算理论之初,很多数学家提出过很多计算模型,图灵证明了其它很多计算模型都等价于图灵机(如果一个问题可以被其他计算模型解决,那么也可以被图灵机解决,反之亦然),时间的差距是多项式级别的(简单的理解为可忽略的差距)
如果你做了上面的思考题,那么对图灵机的运作模式应该有一定的感觉了。应该可以隐约感受到:所有的算法都是可以用这样简陋的图灵机实现的。那么问题来了:有没有一个图灵机可以执行所有的算法呢?这个脑洞来源于:图灵机本身无非包含纸袋,状态,字符表(简单的看成0和1),这样一个图灵机当然可以用二进制表示成一串字符,那么我可以构造一个“超级”图灵机N,每当我要计算某个问题S,不但把x输入进去,同时也把某个图灵机M输入进去,这个超级图灵机N就可以根据M的构造模仿M的执行模式,判断x是否在S里面。如果这样一个图灵机存在,那我们就获得了可怕的力量:有一个机器可以执行任意可以用图灵机标识的的算法了(你的电脑就是这样一台机器)!
3. 为什么是多项式时间
对啊!为什么不用指数时间或者常数时间的区别来表示两个计算模型之间的等价呢,尤其是常数时间看起来更自然啊?比如刚才的加法器,如果你试着多增加几个状态,或者不光用01来表示数字,而是用十进制表示数字,你会发现你的计算速度有了多项式时间的提升!在理论体系里面我们不希望这么微小的变化就给我们带来本质上的提升,所以我们用多项式时间定义等价。
有的同学可能会问:那很大的多项式怎么办?比如几百次方之类的。一般来说常用的多项式算法(也就是P,能够被图灵机在多项式时间内计算),都是低次幂的。然而更合理的解释是:有的算法由于有高次幂,所以就不常用了,比如galactic algorithm,有很好的asymptotic behavior,但因为常数项太大所以从未被使用:
Galactic Algorithms. 实用性和理论研究上确实有不同,理论研究更多的是针对某个计算模型(一般来说就是图灵机)而讲的有效率。
4. 关于NP:为什么验证一个答案的正确性这么重要?
因为最开始的时候都是数学家在搞这个,对于数学家来说如果有一个机器能帮助他们证明各种定理那就爽了。数学家经常干的两件事:1. 给出证明 2. 验证某个证明是不是对的。直觉上肯定验证更容易一些,但如果somehow可以证明NP=P,也就是说 验证 和 给出证明 其实在数学上是等价的,那么这个证明很可能给出了如何把 验证一个证明是否正确(NP)转化为 如何给出一个证明(P)的方法,从此以后数学家只要思考如何验证证明的正确性就能自动得到证明了,那不爽炸了。那个时候密码学的重要性只是崭露头角,但即使是在数学上的重要性,也足够让这个定义吸引人了。
5. 关于NP-complete,为什么要单独把NP里最难的问题拿出来
最开始的时候,大家不知道NP的定义是存在所谓 最难的 这么一个东西的,各类问题没有固定的比较标准。搞不好就没有这么一个最难的东西。直到一个叫Cook的数学家做了点CS的工作,最后还悲惨的没拿到教职,用教授的话说:“He’s in the wrong department.” 他证明了任何一个NP形式的问题都可以转换成 3SAT (某个NP问题),3SAT 就是说有n个variable,m个clause,每个clause都是某三个variable 或(|) 在一起, 最后再把所有的clause 和(&) 在一起, 问题是:“有没有一种对于这n个variable的取值可以让整个boolean formula的值为true?” 3SAT 这个问题的优点在于它非常的直观清晰。最开始这篇文章没得到什么重视,直到一个非常出名的计算机科学家Levin看到了这篇文章,突然意识到如果这么多问题都等价于 3SAT 问题,那这就很好地揭示了为什么之前那么多算法问题都找不到快速的(多项式级)算法,因为都和3SAT一样难嘛;另外可以用 3SAT 作为对各种计算问题的分界线,那以后只要发现是NP-complete的问题,大家就不用对于每个问题找解法了。由此衍生了很多对于complexity class的研究,而cook-levin这种把NP问题化为3SAT的思想一次又一次起到了至关重要的作用。
6. 常见误区:NP=指数级算法?
不是的。NP强调的是:易于验证答案的正确性,而指数级算法是指得:存在一个图灵机可以在指数时间内给出答案。如果熟悉了NP的定义,会发现明显指数级问题包含NP问题(?)因为根据上面的定义,只要验证对一个输入x是否存在一个u能够被某个图灵机M验证就好了,那么在指数时间内,我们可以定义一个hardcode了所有M的信息的图灵机N,N尝试所有可能的u,看有没有哪个u能迫使M接受x。由于u是多项式长度,这种尝试可以在指数时间内结束。
至今为止,我们也只知道NP是包含在指数(EXP)这个class里面的,但不知道它们相不相等。这也是整个复杂度理论很蛋疼的一点:真包含关系极其难以证明。有的时候真的让人很怀疑最初的分类方法是不是合理的,究竟是这些问题就没法被很完美的定义,还是只是我们不够聪明呢?

从头开始聊P问题、NP问题与NPC问题相关推荐

  1. 一文读懂什么是P问题、NP问题和NPC问题

    你会经常看到网上出现"这怎么做,这不是NP问题吗"."这个只有搜了,这已经被证明是NP问题了"之类的话.你要知道,大多数人此时所说的NP问题其实都是指的NPC问 ...

  2. P问题 NP问题 和 NPC问题

    转自Matrix67 这或许是众多OIer最大的误区之一. 你会经常看到网上出现"这怎么做,这不是NP问题吗"."这个只有搜了,这已经被证明是NP问题了"之类的 ...

  3. P 问题、NP 问题、NPC 问题(NP 完全问题)、NPH 问题和多项式时间复杂度

    为了弄清楚上面的概念以及对他们有个基本的了解,所以总结出这篇blog. 1.多项式时间复杂度 定义: 解决问题需要的时间与问题的规模之间是多项式关系. 多项式关系形如 O ( n k ) O(n^k) ...

  4. 【NP问题】P问题,NP问题,NPC问题,NPH问题

    P类问题: 官方定义:所有可以在多项式时间内求解的判定问题.(判定问题:判断是否有一种能够解决某一类问题的能行算法的研究课题.) 自己的理解:对于一类问题,能有一个确定性算法,在多项式时间内就能解出所 ...

  5. 算法:NP问题,NP完全问题(NPC),NPhard问题

    在做计算机算法关于NP完全问题这一章的作业的时候,发现有很多概念理解的不是很透彻,然后就反复看老师的讲义,在网上查阅各种资料,花了很多时间来弄懂这块的内容.发现书上的概念太正式,定义太标准,不容易很快 ...

  6. P问题、NP问题、NPC问题的概念及实例证明

    美剧<基本演绎法>(也就是美版"福尔摩斯")第 2 季第 2 集中,两位研究 NP 问题的数学家被谋杀了,凶手是同行,因为被害者即将证明"P=NP 问题&qu ...

  7. P问题、NP问题、NPC问题、NP难问题的概念[zz]

    你会经常看到网上出现"这怎么做,这不是NP问题吗"."这个只有搜了,这已经被证明是NP问题了"之类的话.你要知道,大多数人此时所说的NP问题其实都是指的NPC问 ...

  8. [zz]澄清P问题、NP问题、NPC问题的概念

     [zz]澄清P问题.NP问题.NPC问题的概念 这或许是众多OIer最大的误区之一.     你会经常看到网上出现"这怎么做,这不是NP问题吗"."这个只有搜了,这已经 ...

  9. 算法问题:什么是P问题、NP问题和NPC问题zz

    这或许是众多OIer最大的误区之一. 你会经常看到网上出现"这怎么做,这不是NP问题吗"."这个只有搜了,这已经被证明是NP问题了"之类的话.你要知道,大多数人 ...

  10. P问题, NP问题, NPC问题, NP-hard问题

    复杂度级别: 1)多项式级别O(n^k);2)非多项式级别,如,指数级O(a^n)和阶乘级别O(n!).后者的复杂度无论如何都大于前者. 归约(约化):如果能找到这样一个多项式变换法则,对任意一个程序 ...

最新文章

  1. 2022-2028年中国体育用品行业投资分析及前景预测报告(全卷)
  2. Ubuntu自定义工具
  3. plotly基于dataframe数据绘制股票K线图并过滤非交易时间
  4. 电设国赛获奖作品学习笔记
  5. 书山有径——走进清华大学图书馆
  6. JavaScript 里变量名前面加了大括号代表什么含义
  7. AOP框架Dora.Interception 3.0 [1]: 编程体验
  8. 1 CO配置-企业结构-定义-创建经营组织(Operating Concern)
  9. 华为多臂路由_[分享]华为 AR路由 策略路由 多WAN环境下指定出口 | 霸王硬上弓's Blog...
  10. pytorch新手需要注意的隐晦操作Tensor,max,gather
  11. 案例:世界500强如何打造汽车后市场智慧门店
  12. opengles之展翅飞翔的雄鹰
  13. Python repr函数——学习笔记
  14. php 将中文字符转英文字母_PHP实现将汉字转换为拼音及获取词语首字母的方法...
  15. 计算机与科技小故事,科学童话小故事大全【三篇】
  16. Java编程入门先学什么?Java零基础学习路线分享!
  17. 这两天看了一部剧,很早的片子,叫蜗居,感觉现在的自己现在的心境去看,能看到不一样的内容
  18. 计算机网络应用竞赛样题答案,计算机网络技术竞赛选拔赛试题(含答案).doc
  19. Intra-Instance VICReg: Bag of Self-Supervised Image Patch Embedding
  20. js案例 页面背景星星闪烁

热门文章

  1. 网店宝贝复制专家操作手册
  2. WPS简历模板的图标怎么修改_桌面图标怎么修改?自定义软件图标的操作方法
  3. NS3使用Eclipse配置
  4. 四层和八层电梯控制系统Proteus仿真设计,51单片机,附仿真和Keil C代码
  5. 服务器装系统不识别硬盘分区,安装系统无法识别分区解决方法
  6. 基于JAVA的教务排课系统毕业设计
  7. 2021年河南省中等职业教育技能大赛 网络搭建与应用项目
  8. CMD编写bat病毒
  9. python爬取酷狗音乐_python 爬虫 爬取酷狗音乐
  10. android gms包