• P: Polynomial,是指能在多项式时间内解决的问题;(如果一个问题可以找到一个能在多项式的时间里解决它的算法,那么这个问题就属于P问题。P是英文单词多项式的第一个字母。)
  • NP:Non-deterministic Polynomial,是指非确定性多项式问题。不能在多项式时间内解决或不确定能不能在多项式时间内解决,但能在多项式时间复杂度内被验证的问题
  • NP-Complete(NPC):NP完全问题。所有NP问题在多项式时间内都能约化(Reducibility)到它的NP问题,即解决了此NPC问题,所有NP问题也都得到解决。
  • NP-Hard(NPH):NP难问题。所有NP问题在多项式时间内都能约化(Reducibility)到它的问题(不一定是NP问题),可以理解为,NP-Hard是比所有NP问题都难的问题
==划重点==:
P 问题, 可理解为:常数增长或线性增长问题,即随着数据规模的增大,算法消耗的时间会以常数或线性关系增长,但不会巨量增长。
NP问题, 可理解为:指数增长问题,即随着数据规模的增大,算法消耗的时间会增长得恐怖,也称“指数爆炸”。

时间复杂度:指当问题规模扩大后,对应程序运行时间的增长程度(而不是表示一个程序运行所花费的时间)。

多项式级时间复杂度:如O(1),O(n),O(log(n)),O(na)O(1), O(n), O(log(n)), O(n^a)O(1),O(n),O(log(n)),O(na)等,因为规模nnn出现在底数的位置。

要理解P问题、NP问题、NPC问题、NP-hard问题,需要先弄懂几个概念:

  • 什么是多项式时间?
  • 什么是确定性算法?什么是非确定性算法?
  • 什么是规约/约化?

文章目录

  • 多项式时间(Polynomial time)
  • 确定性算法与非确定性算法
    • 确定性算法:
    • 非确定性算法:
    • 规约/约化
  • P类问题、NP类问题、NPC问题、NPH问题
    • 概念
    • 四者联系的图形化表示
  • 一个经典的栗子
  • P = NP?
  • Reference

多项式时间(Polynomial time)

什么是时间复杂度?

时间复杂度并不是表示一个程序解决问题需要花费多少时间,而是指当程序所处理的问题规模扩大后,程序运行时间相应的增长幅度。 也就是说,对于某一个程序,其处理某一个特定数据的效率不能衡量该程序的好坏,而应该看当这个数据的规模变大到数百倍后,程序运行时间是否还是一样,或者也跟着慢了数百倍,或者是变慢了数万倍?

不管数据有多大,程序处理所花的时间不变,我们就说这个程序很好,具有O(1)O(1)O(1)的时间复杂度,也称常数级复杂度; 若数据规模变得有多大,程序运行花费的时间也跟着变得有多长,比如找nnn个数中的最大值,这个程序的时间复杂度就是O(n)O(n)O(n),为线性级复杂度; 而像冒泡排序、插入排序等,数据扩大2倍,而程序运行时间变慢4倍的,时间复杂度就是O(n2)O(n^2)O(n2),即平方级复杂度; 还有一些穷举类的算法,所需时间长度成几何阶数增长(即指数爆炸),这就是O(an)O(a^n)O(an)的指数级复杂度; 有的甚至是O(n!)O(n!)O(n!),阶乘级复杂度

不会存在O(2∗n2)O(2*n^2)O(2∗n2)的复杂度,因为前面的那个"2"是系数(时间复杂度中是没有系数的,与系数无关的),根本不会影响到整个程序的时间增长。同样地,O(n3+n2)O(n^3+n^2)O(n3+n2) 的复杂度也就是O(n3)O(n^3)O(n3)。因此,我们会说,一个O(0.01∗n3)O(0.01*n^3)O(0.01∗n3)的程序的效率比O(100∗n2)O(100*n^2)O(100∗n2)的效率低,尽管在nnn很小的时候,前者优于后者,但后者的运行时间随数据规模增长得慢,最终O(n3)O(n^3)O(n3)的复杂度将远远超过O(n2)O(n^2)O(n2)。另外,我们也说,O(n100)O(n^{100})O(n100)的复杂度要小于O(1.01n)O(1.01^n)O(1.01n)的复杂度(幂数级的时间复杂度要小于指数级的时间复杂度)。

容易看出,前面的几类复杂度被分为两类:像O(1),O(n),O(ln(n)),O(n2),O(na)O(1),O(n), O(ln ( n ) ),O ( n^2 ), O(n^a)O(1),O(n),O(ln(n)),O(n2),O(na)等,因为它的规模nnn出现在底数的位置,把它们叫做多项式级复杂度;另一种如O(an),O(n!)O(a^n), O(n!)O(an),O(n!)等,它们是非多项式级的复杂度,其时间复杂度计算机往往不能承受。

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

确定性算法与非确定性算法

确定性算法:

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

非确定性算法:

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

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

规约/约化

问题A可以约化为问题B,称为“问题A可规约为问题B”,可以理解为问题B的解一定就是问题A的解,因此解决A不会难于解决B。由此可知问题B的时间复杂度一定大于等于问题A。

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

从规约的定义中我们看到,一个问题规约为另一个问题,时间复杂度增加了,问题的应用范围也增大了。通过对某些问题的不断规约,我们能够不断寻找复杂度更高,但应用范围更广的算法来代替复杂度虽然低,但只能用于很小的一类问题的算法。存在这样一个NP问题,所有的NP问题都可以约化成它。换句话说,只要解决了这个问题,那么所有的NP问题都解决了。这种问题的存在难以置信,并且更加不可思议的是,这种问题不只一个,它有很多个,它是一类问题。这一类问题就是传说中的NPC问题,也就是NP-完全问题

P类问题、NP类问题、NPC问题、NPH问题

概念

  • P类问题:能在多项式时间内可解的问题。

  • NP问题:在多项式时间内“可验证”的问题。也就是说,不能判定这个问题到底有没有解,而是猜出一个解来在多项式时间内证明这个解是否正确。即该问题的猜测过程是不确定的,而对其某一个解的验证则能够在多项式时间内完成。P类问题属于NP问题,但NP类问题不一定属于P类问题。(注意:NP问题不是非P类问题,强调:P和NP不是对立的概念,而是包含的概念。NP问题是指可以在多项式的时间里验证一个解的问题。NP问题的另一个定义是,可以在多项式的时间里猜出一个解的问题)

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

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

四者联系的图形化表示

将四种问题用集合的形式表示,它们的关系如 图1和图2 所示:

图1 P、 NP、 NP-Complete、 NP-Hard关系的图形表示(1) 图2 P、 NP、 NP-Complete、 NP-Hard关系的图形表示(2)

一个经典的栗子

著名的推销员旅行问题(Travel Saleman Problem or TSP):假设一个推销员需要从香港出发,经过广州,北京,上海,…,等 n 个城市, 最后返回香港。 任意两个城市之间都有飞机直达,但票价不等。假设公司只给报销 C 元钱,问是否存在一个行程安排,使得他能遍历所有城市,而且总的路费小于 C?

推销员旅行问题显然是 NP 的。因为如果你任意给出一个行程安排,可以很容易算出旅行总开销。但是,要想知道一条总路费小于 C 的行程是否存在,在最坏情况下,必须检查所有可能的旅行安排! 这将是个天文数字。

旅行推销员问题是数图论中最著名的问题之一,即“已给一个n个点的完全图,每条边都有一个长度,求总长度最短的经过每个顶点正好一次的封闭回路”。Edmonds,Cook和Karp等人发现,这批难题有一个值得注意的性质,对其中一个问题存在有效算法时,每个问题都会有有效算法。

P = NP?

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

首先,我们要搞清楚什么是“P=NP?” 为此,我们必须先了解一下什么是“算法复杂度”。为此,我们又必须先了解什么是“算法”。我们可以简单的把“算法”想象成一台机器,就跟绞肉机似的。我们给它一些“输入”,它就给我们一些“输出”。比如,绞肉机的输入是肉末,输出是肉渣。牛的输入是草,输出是奶。“加法器”的输入是两个整数,输出是这两个整数的和。“算法理论”所讨论的问题,就是如何设计这些机器,让它们更加有效的工作。就像是说如何培育出优质的奶牛,吃进相同数量的草,更快的产出更多的奶。

世界上的计算问题,都需要“算法”经过一定时间的工作(也叫“计算”),才能得到结果。计算所需要的时间,往往跟“输入”的大小有关系。你的牛吃越是多的草,它就需要越是长时间才能把它们都变成奶。这种草和奶的转换速度,通常被叫做“算法复杂度”。算法复杂度通常被表示为一个函数f(n)f(n)f(n),其中nnn是输入的大小。比如,如果我们的算法复杂度为n2n^2n2,那么当输入101010个东西的时候,它需要100100100个单元的时间才能完成计算。当输入100100100 个东西的时候,它需要100001000010000个单元的时间才能完成。当输入100010001000个数据的时候,它需要100000010000001000000个单元的时间。所谓的“P时间”就是多项式时间,就是说这个复杂度函数f(n)f(n)f(n)是一个多项式。

“P=NP?”中的“P”,就是指所有这些复杂度为多项式的算法的“集合”,也就是“所有”的复杂度为多项式的算法。为了简要的描述以下的内容,定义一些术语:

  • “f(n)f(n)f(n)时间算法”=“能够在f(n)f(n)f(n)时间之内,解决某个问题的算法”

当f(n)f(n)f(n)是个多项式(比如n2n^2n2 )的时候,这就是“多项式时间算法(P时间算法)。当f(n)f(n)f(n)是个指数函数(比如2n2^n2n)的时候,这就是“指数时间算法”(EXPTIME算法)。很多人认为NP问题就是需要指数时间的问题,而NP跟EXPTIME,其实是风马牛不相及的。很显然,P不等于EXPTIME,但是P是否等于NP,却没有一个结论。

现在我来解释一下什么是NP。通常的计算机,都是确定性(deterministic)的。它们在同一个时刻,只有一种行为。如果用程序来表示,那么它们遇到一个条件判断(分支)的时候,只能一次探索其中一条路径。比如:

if (x == 0) {one();
}
else {two();
}

在这里,根据x的值是否为零,one()和two()这两个操作,只有一个会发生。然而,有人幻想出来一种机器,叫做“非确定性计算机”(nondeterministic computer),它可以同时运行这程序的两个分支,one()和two()。这有什么用处呢?它的用处就在于,当你不知道x的大小的时候,根据one()和two()是否“运行成功”,你可以推断出x是否为零。这种方式可以同时探索多种可能性。这不是普通的“并行计算”,因为每当遇到一个分支点,非确定性计算机就会产生新的计算单元,用以同时探索这些路径。这机器就像有“分身术”一样。当这种分支点存在于循环(或者递归)里面的时候,它就会反复的产生新的计算单元,新的计算单元又产生更多的计算单元,就跟细胞分裂一样。一般的计算机都没有 这种“超能力”,它们只有固定数目的计算单元。所以他只能先探索一条路径,失败之后,再回过头来探索另外一条。所以,它们似乎要多花一些时间才能得到结果。到这里,基本的概念都有了定义,于是我们可以圆满的给出P和NP的定义。P和NP是这样两个“问题的集合”:

P = “确定性计算机”能够在“多项式时间”解决的所有问题
NP = “非确定性计算机”能够在“多项式时间”解决的所有问题
(注意它们的区别,仅在于“确定性”或者是“非确定性”。)

“P=NP?”问题的目标,就是想要知道P和NP这两个集合是否相等。为了证明两个集合(A和 B)相等,一般都要证明两个方向:

  1. A 包含 B;
  2. B 包含 A。

上一个标题中我们已经说过NP包含了P。因为任何一个非确定性机器,都能被当成一个确定性的机器来用。你只要不使用它的“超能力”,在每个分支点只探索一条路径就行。所以“P=NP?”问题的关键,就在于P是否也包含了NP。也就是说,如果只使用确定性计算机,能否在多项式时间之内,解决所有非确定性计算机能在多项式时间内解决的问题。

我们来细看一下什么是多项式时间(Polynomial time)。我们都知道,n2n^2n2是多项式,n1000000n^{1000000}n1000000 也是多项式。多项式与多项式之间,却有天壤之别。把解决问题所需要的时间,用“多项式”这么笼统的概念来描述,其实是非常不准确的做法。在实际的大规模应用中,n2n^2n2的算法时间都嫌慢。能找到“多项式时间”的算法,根本不能说明任何问题。对此,理论家们喜欢说,就算再大的多项式(比如 n1000000n^{1000000}n1000000),也不能和再小的指数函数(比如 1.0001n1.0001^n1.0001n)相比。因为总是“存在”一个M,当n>M的时候,1.0001n1.0001^n1.0001n 会超过n1000000n^{1000000}n1000000 。可是问题的关键,却不在于M的“存在”,而在于它的“大小”。如果你的输入必须达到天文数字才能让指数函数超过多项式的话,那么还不如就用指数复杂度的算法。所以,“P=NP?”这问题的错误就在于,它并没有针对我们的实际需要,而是首先假设了我们有“无穷大”的输入,有“无穷多”的时间和耐心,可以让多项式时间的算法“最终”得到优势。

Reference

[1] 对于“NP难问题”的理解:http://blog.csdn.net/u010021014/article/details/77839858
[2] 谈“P=NP?”:http://yinwang0.lofter.com/post/183ec2_4f6312
[3] P、NP、NPC和NP-Hard相关概念的图形和解释:https://blog.csdn.net/huang1024rui/article/details/49154507


版权声明:本文为CSDN博主「困比比」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_29176963/article/details/82776543

P问题、NP问题、NPC问题、NPH问题详解相关推荐

  1. 【算法】P问题 NP问题 NPC问题 NPH问题的定义与理解

    一.前言 二.多项式 三.时间复杂度 四.P问题 五.NP问题 六.NPH问题,NPC问题 七.已经被证明的NPC问题 八.一些具体问题的总结 九.总结 一.前言 在讨论算法的时候,常常会说到这个问题 ...

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

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

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

    https://blog.csdn.net/K346K346/article/details/51026006 1.多项式时间复杂度 定义: 解决问题需要的时间与问题的规模之间是多项式关系. 多项式关 ...

  4. NP问题、NP难问题(NPH)和NP完全问题(NPC)理解

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

  5. (数学)P、NP、NPC、NP hard问题

    概念定义: http://m.elecfans.com/article/757041.html https://www.cnblogs.com/AndyJee/p/5048556.html P问题:能 ...

  6. P、NP与NPC 的通俗理解

    P.NP与NPC 的通俗理解 1.多项式时间复杂度 定义: 解决问题需要的时间与问题的规模之间是多项式关系. 多项式关系形如O(nk)" role="presentation&qu ...

  7. 【计算理论】计算理论总结 ( P 、NP 、NPC 总结 ) ★★

    文章目录 一.P 类 二.NP 类 三.NPC 类 ( NP 完全 ) 四.P .NP .NPC 三者关系 一.P 类 P\rm PP 类 : ★ 所有 能够被 确定性 单个带子图灵机 , 在 多项式 ...

  8. 那传说中的P、NP以及NPC问题

    那传说中的P.NP以及NPC问题     (这里只是自己的一些总结) 在讲这几个问题之前,有几个东西是必须要说的,包括时间复杂度.空间复杂度.图灵机什么的.那么我们就慢慢来一一说来.    图灵机:图 ...

  9. P、NP、NPC(NP完全问题)、NP-hard问题概述

    P.NP.NPC(NP完全问题).NP-hard问题概述 一.概念总结 1.P问题: 能在多项式时间内解决的问题 2.NP问题: 不能在多项式时间内解决或不确定能不能在多项式时间内解决,但能在多项式时 ...

  10. P、NP、NPC问题

    转自:http://blog.csdn.net/wwy851/article/details/6082007 最近看了很多关于P.NP和NPC问题的文章,但是都不是很系统全面,很多叙述的也不太清楚,有 ...

最新文章

  1. 搭建OpenStack-M版的Cinder所碰到过的状况
  2. 构建之法4、17章观后感
  3. 再回首Java第十一天
  4. aws spark_使用Spark构建AWS数据湖时的一些问题以及如何处理这些问题
  5. java开发文档怎么写_程序员该不该写技术文档,怎么写文档,易懂又能提升自己...
  6. struct和typedef struct彻底明白了
  7. CSS animation 与 transition 有何区别?
  8. vue之initComputed模块源码说明
  9. hdfs读写流程_必须掌握的分布式文件存储系统—HDFS
  10. api调用实例python_调用阿里云API 的demo示例(java/python)
  11. proc wifi 开启_centos7环境开启WIFI热点
  12. 愤怒的牛(重回基础二分)
  13. leetCode 108. Convert Sorted Array to Binary Search Tree JAVA
  14. Excel表格 |两列数据(多列)合并一列且自动换行
  15. 织梦教程新建ID丨重置栏目ID丨文章ID不从1开始的解决方法
  16. 群晖 mysql 端口配置_群晖DS218+部署mysql
  17. 消防vr虚拟救援模拟教学软件开发
  18. pandas数据处理基础——筛选指定行或者指定列的数据
  19. 大地坐标系是不是经纬度_大地测量学基础(复习)第三部分
  20. 重启更新电脑进不去Ubuntu输入密码正确反复回到登陆界面

热门文章

  1. 2019年南京大学计算机考研复试机试真题
  2. selenium安装
  3. Java List retainAll 记录坑
  4. 机器学习之---马尔可夫随机场的应用
  5. pm入门-需求调研/竞品分析/应用工具简介
  6. 微信小程序底部导航栏未读消息出现小红点的实现
  7. itextPDF生成表格的pdf
  8. RS232、RS485、RS422、RJ45接口有什么区别?
  9. matlab 音频fftshift,matlab使用杂谈5-fftshift函数的使用
  10. pycharm2016破解方法