时间复杂度

时间复杂度描述了当输入规模变大时,程序运行时间的变化程度,通常使用\(O\)来表示。比如单层循环的时间复杂度为\(O(n)\),也就是说程序运行的时间随着输入规模的增大线性增长,两层循环的时间复杂度为O\((n^2)\),快速排序的时间复杂度为\(O(nlogn)\),使用穷举法解决旅行商问题的时间复杂度为\(O(n!)\)。时间复杂度根据变化速率的快慢可以分为两类:1、多项式级的时间复杂度,如\(O(1)\),\(O(n),O(n^a),O(logn)\)等;2、非多项式级时间复杂度,如\(O(a^n)\),\(O(n!)\)等。当我们使用计算机解决一个问题时,我们要尽可能地找到一个具有多项式级时间复杂度的算法,非多项式级时间复杂度的算法一般运行时间较长,当输入数据规模较大时很难被接收。

P类问题

如果一个问题能找到在多项式时间内解决它的算法,那么我们说该问题是P类问题。P是多项式(Polynomial)的第一个字母。比如排序问题就是一个P问题,因为我们可以找到一个时间复杂度为\(O(n^2)\)的冒泡排序算法。

NP问题

有些问题比较复杂,如旅行商问题汉密尔顿回路问题等,当我们使用暴力搜索时,此类问题的时间复杂度为\(O(n!)\),看起来很难找到一个能在多项式时间内解决该问题的算法,而如果别人给了我一个解,我可以很快地验证该解是不是问题的正确答案。比如在汉密尔顿回路问题中,我想验证一条路径是否正确,则验证路径是否正确的时间复杂度为\(O(n)\),为多项式级的时间复杂度。所以,如果我们可以在多项式级的时间内验证一个问题解的正确性,那么我们说该问题是NP问题,也就是说直接找NP问题的一个解可能很慢,当验证NP问题的解却很快。前面提到的汉密尔顿回路就是一个NP问题。NP问题不是“非P问题”,而是非确定性多项式(nondeterministic polynomial)问题。

NPC问题

从上面的介绍我们知道,所以P问题都是NP问题,因为能在多项式时间内解决的问题也能够在多项式时间内验证解的正确性。那么我们还想知道是否所有的NP问题都是P问题,这就是著名的“P对NP问题(P=NP?)”。在2000年美国的Clay数学研究所公布的七个千年数学难题中,P对NP问题位居榜首,可见解决该问题的难度。由于直接证明P对NP问题过于复杂,人们引入了另一类问题--NPC问题(NP -complete,NP-完全问题)。

归约

在介绍NPC问题之前,需要先了解归约的概念。假设有两个问题A和B,对问题A的输入a经过某种规则转换为对问题B的输入b,而A(a)和B(b)的结果相同,也就是说我们可以将求解A问题转换为求解B问题,或者说可以用解决问题B的方法解决问题A,那我们称A可以归约(reducibility,或“约化”)到B。比如问题A为“求解一元一次方程的解”,问题B为“求解一元二次方程的解”,那么我们就可以将问题A归约到问题B,因为求解一元二次方程解的方法可以被用来求解一元一次方程的解。有一点需要注意,问题A不会难于问题B,也就是说,A要归约到更难的问题(时间复杂度更高)。除此之外,归约还具有传递性,如果A可以归约到B,B可以归约到C,那么A可以归约到C。

NPC问题

当一个问题归约到另一个问题时,问题的复杂度变高了,问题的适用范围也更广了。通过对问题的不断归约,我们可以得到更复杂、适用范围更广的问题来替代简单但使用范围小的问题。那么我们就有一个想法 :是否可以将若干相对不那么复杂NP问题不断归约,从而得到一个最难的“超级NP问题”,所有的NP问题都可以归约到这个“超级NP问题”,只要解决了这个“超级NP问题”,那么也就意味着所有NP问题都可以被解决。事实上,存在这样的一类“超级NP问题”,这也就是我们所说的NPC问题。NPC问题的定义如下:如果一个问题Q,它满足以下两条性质:
(1). Q是NP问题
(2). 任一NP问题都可在多项式时间内归约到问题Q
那么我们说问题Q是NPC问题。
Stephen Cook是NPC理论的奠基人,而Richard Karp则证明了组合优化中的大多数经典问题(背包问题、覆盖问题、匹配问题、分区问题、路径问题、调度问题等)都是NPC问题。如果我们给NPC问题找到了一个多项式时间复杂度的算法,那么也就意味着我们给所有的NP问题找到了多项式时间复杂度的算法,从而NP=P,因为P=NP,所以“P对NP问题”就可以被解决。比如背包问题是NPC问题,如果我们给背包问题找到了一个多项式时间复杂度的算法,那么就证明了P=NP,但给NPC问题找一个多项式时间复杂度的算法太难了,所以现在人们普遍相信P≠NP。

NPH问题

上面我们介绍了NPC问题需要满足两条性质,当一个问题仅满足性质(2),而不满足性质(1)时,我们说该问题时NPH问题(NP-hard,NP-难问题)。

4类问题的联系

下图直观地描述了这4类问题之间的联系:

可以看到P类问题是NP问题,NPC问题是NP问题中最难的问题,NPH问题至少与NPC问题一样难。

参考

  1. http://www.matrix67.com/blog/archives/105

P、NP、NPC、NPH问题的区别和联系的更多相关文章

  1. 算法复习-P NP NPC NP-hard概念

    from http://blog.csdn.net/huang1024rui/article/details/49154507 P.NP.NPC和NP-Hard相关概念的图形和解释 一.相关概念 P: ...

  2. p,np,npc,np难问题,确定图灵机与非确定图灵机

    本文转自豆瓣_燃烧的影子 图灵机与可计算性 图灵(1912~1954)出生于英国伦敦,19岁进入剑桥皇家学院研究量子力学和数理逻辑.1935年,图灵写出了"论高斯误差函数"的论文, ...

  3. P,NP,NPC的通俗解释

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

  4. 浅谈P NP NPC

    P问题:多项式时间内可以找到解的问题,这个解可以在多项式时间内验证. NP问题:有多项式时间内可以验证的解的问题,而并不能保证可以在多项式时间内找到这个解. 比如汉密尔顿回路,如果找到,在多项式时间内 ...

  5. P,NP,NPC,NPC-HARD

    P: 能在多项式时间内解决的问题 NP: 不能在多项式时间内解决或不确定能不能在多项式时间内解决,但能在多项式时间验证的问题 NPC: NP完全问题,所有NP问题在多项式时间内都能约化(Reducib ...

  6. P类问题,NP,NPC,HPHard,coNP,NPI问题 的简单认识

    参考<算法设计技巧与分析>--沙特 问题可以分为判定类问题和最优化问题,判定类问题可以转化为最优化问题,所以下面讨论的是判定类的问题. P类问题是可以在多项式时间  采用确定性算法给出解 ...

  7. P NP NPC

    study from : http://www.matrix67.com/blog/archives/105

  8. P、NP、NPC和NP-Hard相关概念的图形和解释

    P.NP.NPC和NP-Hard相关概念的图形和解释 http://blog.csdn.net/huang1024rui/article/details/49154507 一.相关概念 P: 能在多项 ...

  9. P问题、NP问题、NPC问题

    看师兄们的论文经常说一句这是个NP难问题,所以采用另外一种方法来代替(比如凸松弛,把l0范数的问题松弛为l1范数的问题来求解).然后搜索了相关知识,也还是没看太懂,把一些理论知识先贴上来,希望以后再接 ...

随机推荐

  1. [HEOI2015]定价 (贪心)

    分类讨论大法好! \(solution:\) 先说一下我对这个题目的态度: 首先这一题是贪心,这个十分明显,看了一眼其他题解都是十分优秀的贪心,可是大家都没有想过吗:你们贪心都是在区间\([l,r]\ ...

  2. 使用css将图像居中

    默认情况下,图像属于内联元素.这意味着它们与周围的文本一起流动.为使图像居中,我们应该将其转换成块级元素,通过将display属性的值设置为block就可以完成转换. <html> < ...

  3. Database学习 - mysql 连接数据库 库操作

    连接数据库 语法格式: mysql -h 服务器IP -P 端口号 -u用户名 -p密码 --prompt 命令提示符 --delimiter 指定分隔符 示例: mysql -h 127.0.0.1 ...

  4. Maven整合Spring3.0+Mybatis3.2+Struts2.3+查找坐标+jar包依赖(五)

    依赖传递 只添加了一个struts2-core依赖,发现项目中出现了很多jar,这种情况 叫 依赖传递

  5. Python3 configparse模块(配置)

    ConfigParser模块在python中是用来读取配置文件,配置文件的格式跟windows下的ini配置文件相似,可以包含一个或多个节(section),每个节可以有多个参数(键=值). 注意:在 ...

  6. KERMIT,XMODEM,YMODEM,ZMODEM传输协议小结

    转:http://blog.163.com/czblaze_3333/blog/static/208996228201272295236713/ Kermit协议 报文格式: 1.       MAR ...

  7. Simulink--MATLAB中的一种可视化仿真工具

     Simulink是MATLAB中的一种可视化仿真工具, 是一种基于MATLAB的框图设计环境,是实现动态系统建模.仿真和分析的一个软件包,被广泛应用于线性系统.非线性系统.数字控制及数字信号处理的建 ...

  8. Node.jsでMySQLを使うメモ

    インストール npm install mysql コネクション var mysql = require('mysql'); var connection = mysql.createConnectio ...

  9. XmlDocument根据节点的属性值获取节点

    string targetParm = string.Format("STUDENTS/STUDENT[@NO='{0}']", targetValue);//生成目标获取节点的参 ...

  10. cacti系列(二)之cacti添加对tomcat服务器的监控

    cacti添加对tomcat的监控 1.首先下载监控tomcat的模板 TomcatStats-0.1.zip    2.导入模板 (cacti_host_template_tomcat_server ...