时间复杂度

时间复杂度描述了当输入规模变大时,程序运行时间的变化程度,通常使用\(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. windows 查看链接数

    windows 端口链接数  查看有效 链接数: netstat -an|find " |find "ESTABLISHED" /c /c 统计: 查看链接信息: 查看当 ...

  2. [C++]指针与多级指针(图解)

    声明:如需引用或者摘抄本博文源码或者其文章的,请在显著处注明,来源于本博文/作者,以示尊重劳动成果,助力开源精神.也欢迎大家一起探讨,交流,以共同进步- 0.0 演示: /* @author:John ...

  3. 【centos】 error: command 'gcc' failed with exit status 1

    原文连接http://blog.csdn.net/fenglifeng1987/article/details/38057193 用安装Python模块出现error: command 'gcc' f ...

  4. 网易云课堂--妙味 《js基础课程》

    ==小例子1   ==JS中允许将"." 替换成 “[ ]” document.getElementById('btn1') 写成 document['etElementById' ...

  5. UML和模式应用5:细化阶段(9)---迈向对象设计

    1.前言 开发者如何设计对象,可以采用如下三种方式: 编码:在编码的同时进行设计 绘图然后编码:绘制一些UML,然后转到如上编码方式,在集成开发环境中编码 只绘图,不编码:使用工具从图中生成一切 本章 ...

  6. ubuntu cron 及 crontab 自动执行任务

    Add the below line (with tweaks) to the end of /etc/crontab: 30 23 * * * root shutdown -h now At 23: ...

  7. C#删除WebBrowser控件Session

    转载:http://www.hackdig.com/?02/hack-1464.htm 因为要搞一个类似帐号多开的小辅助,但是很坑爹的发现,在一个WebBrowser中,就算重新登录,显示的仍然是上一 ...

  8. vss 日文文件路径的名字在中文系统下乱码

    解决方式:tools-font 文字设置 日本語

  9. dubbo 一个接口多个实现

    <dubbo:service ref="dubboGroupService1" interface="com.yncp.dubbo.service.IDubboGr ...

  10. centos6.5系统bash损坏之救援模式修复

    1.模拟bash被损坏的情况 # mv /bin/bash /tmp [root@localhost ~]# sync [root@localhost ~]# shutdown -r now 2.挂载 ...