P、NP、NP-Complete、NP-hard问题
Table of Contents
1 遇到难题怎么办?
遇到一个问题,通常我们思考的是如何解它。
于是就有了贪心、分治、动态规划等等算法;但也有一些问题,挠破了头也想不到高效的算法。
怎么办?
假如我们已经知道有那么几个问题,这个世界上所有的聪明人都没能找到高效的算法。
而且我们能把目前的问题通过等价转化的方式,变成这些已知问题的子问题。
这样就能证明我们不笨。
这个将一个问题,等价转换成另一个问题的子问题的方式,叫做 归约 (Reduction).
将问题A归约成问题B的子集
2 什么是P、NP、NP-Complete和NP-hard
这些概念都是用来描述一个问题的难度的。即一个问题能否在以上时间内求解,或者验证一个解是否符合一个问题。
在下面的讨论中,我们假设问题的输入规模是n,那么问题的解决时间,或者验证时间都应该是n的一个函数,记为$f(n)$.
P, 即Polynomial time,多项式时间。f(n)=a0+a1*n1+a2*n2+a3*n3+…. 。
意思是说给定一个问题,能在多项式时间内 找到 符合该问题的解。此时,问题的时间复杂度是O(nj).
那不是多项式时间内能求解的问题,就是NP问题吗? 不是的
首先,要理解验证解的概念。给定一个问题,我们可能不知道如何解,但如果通过连蒙带猜,得到了一个解。
我们也可以验证这个解是否满足问题。 NP 就是指能在多项式时间内 验证 一个解是否满足的一类问题。
所以,P和NP并非补集关系,而是两个完全不同的分类方式。
显然,所有P类问题都能在多项式时间内验证一个解。因此 P ⊆ NP。
于是人们就在想NP的问题里面,有最难的问题吗?它会是什么?
结论是,NP中有 最难 的一类问题。这类问题就是 NP-Complete 问题。
最难,就意味着所有NP类的问题都能归约到这个问题上。该问题本身也是NP问题。
所以,NP-Complete问题的形式化定义是: L是NP-Complete问题,当其满足如下两个条件:
- L ∈ NP
- 任意L1 ∈ NP, L1 可以归约到 L
对于只满足条件2,不管满不满足条件1的问题,我们称为NP-hard问题,
即非常难,且不能在多项式时间内验证解是否正确的问题。(感谢luse兄的指正)
2.1 NP-hard
这里在说说NP-hard, NP-hard实际上是“at least as hard as an NP-complete problem”,即这个问题至少和NP完全问题一样难,所以不用满足上面的条件1.
他们四者的关系,可以用下图描述:
四者之间的关系
3 P = NP ????
计算机科学界最经典,争论最多的一个问题就是: P和NP等价吗?
实际上,就是说找到一个问题的解的难度,和验证一个解是否满足某个问题的难度相同吗?
虽然目前,主流认为P是NP的子集,但因为还没办法完全验证这一点,因此不能盖棺定论。
据说,清华大学的姚期智老师也在从事探索P和NP关系的研究上。
在针对该问题的最前沿研究上,也是各执一词。参见历史上针对P和VP是否等价的研究结论。
4 参考
P、NP、NP-Complete、NP-hard问题的更多相关文章
- numpy中np.c_和np.r_
np.r_:按列连接两个矩阵,就是把两矩阵上下相加,要求列数相等,类似于pandas中的concat() np.c_:按行连接两个矩阵,就是把两矩阵左右相加,要求行数相等,类似于pandas中的mer ...
- p,np,npc,np难问题,确定图灵机与非确定图灵机
本文转自豆瓣_燃烧的影子 图灵机与可计算性 图灵(1912~1954)出生于英国伦敦,19岁进入剑桥皇家学院研究量子力学和数理逻辑.1935年,图灵写出了"论高斯误差函数"的论文, ...
- np.tile 和np.newaxis
output array([[ 0.24747071, -0.43886742], [-0.03916734, -0.70580089], [ 0.00462337, -0.5143158 ...
- numpy 辨异(四)—— np.repeat 与 np.tile
>> import numpy as np >> help(np.repeat) >> help(np.tile) 二者执行的是均是复制操作: np.repeat: ...
- numpy 下的数据结构与数据类型的转换(np.array vs. np.asarray)
1. np.asarray -- numpy 风格的类型转换 从已有多维数组创建新的多维数组,数据类型可重新设置 >> B = np.asarray(A, dtype='int32') 2 ...
- dtypes.py", line 499 _np_qint8 = np.dtype([("qint8", np.int8, (1,)])
Traceback (most recent call last): File "<stdin>", line 1, in <module> File &q ...
- python多项式拟合:np.polyfit 和 np.polyld
python数据拟合主要可采用numpy库,库的安装可直接用pip install numpy等. 1. 原始数据:假如要拟合的数据yyy来自sin函数,np.sin import numpy as ...
- np.c_与np.r_
import sys reload(sys) sys.setdefaultencoding('utf-8') import numpy as np def test(): ''' numpy函数np. ...
- Numpy中np.random.randn与np.random.rand的区别,及np.mgrid与np.ogrid的理解
np.random.randn是基于标准正态分布产生的随机数,np.random.rand是基于均匀分布产生的随机数,其值在[0,1). np.mgrid 与np.ogrid的理解及区别:np.mgr ...
- numpy中np.array()与np.asarray的区别以及.tolist
array 和 asarray 都可以将 结构数据 转化为 ndarray,但是主要区别就是当数据源是ndarray时,array仍然会copy出一个副本,占用新的内存,但asarray不会. 1.输 ...
随机推荐
- 9段高效率开发PHP程序的代码
php是世界上最好的语言 在php网站开发中,大家都希望能够快速的进行程序开发,如果有能直接使用的代码片段,提高开发效率,那将是起飞的感觉.今天由杭州php工程师送出福利来了,以下9段高效率开发PHP ...
- QCon 2013 上海 -- 互联网金融
互联网金融应该是最近很火爆的一个领域.由于阿里小贷和余额宝的初步成功,这一块都被视为破除传统金融领域垄断的法宝.大家可能都知道,电商平台.金融和大数据是阿里集团未来的三个重要方面.而关于金融,马云最经 ...
- Error assembling WAR: webxml attribute is required (or pre-existing WEB-INF/web.xml if executing in update mode) -> [Help 1]
mvn war:war命令出错: 原因: maven的web项目默认的webroot是在src\main\webapp.如果在此目录下找不到web.xml就抛出以上的异常. 解决方案: 在pom.xm ...
- Cocos2d-JS v3.0 alpha 导入 cocostudio的ui配置
1.在新项目的根文件夹下打开project.json文件,修改: "modules" : ["cocos2d", "extensions", ...
- T-SQL 运行时生成语句
运行时生成语句 1.用EXECUTE执行动态命令 EXECUTE命令可以执行存储过程.函数和动态的字符串命令.注意此语句的作用正如前面在介绍批处理时,如果批中的第一条语句是"EXECUTE存 ...
- [转]软件开发过程(CMMI/RUP/XP/MSF)是与非?
经常看到和听到大家在争论敏捷过程.RUP和CMM 哪个软件开发过程更好或者哪个过程不好,各自都有理由.争论得不亦乐乎......实际上,没有十全十美的过程,也不存在更好的过程.关键是什么样的过程适合自 ...
- URAL 2070 Interesting Numbers (找规律)
题意:在[L, R]之间求:x是个素数,因子个数是素数,同时满足两个条件,或者同时不满足两个条件的数的个数. 析:很明显所有的素数,因数都是2,是素数,所以我们只要算不是素数但因子是素数的数目就好,然 ...
- 乱侃c++
就在刚才我感觉c++真的好复杂,函数重载,多态,虚函数,虚函数表,模版,继承等一大坨东西好恶心,c++既然完全支持C语言,当然是把它的优缺点统统接下了,C语言中指针本身并不太难,是C语言的精华,当年刚 ...
- java解析属性文件
-----------------------解析属性文件----------------------------- /** * 获取src下属性文件 * @param params * ...
- poj 3134 Power Calculus(IDA*)
题目大意: 用最小的步数算出 x^n 思路: 直接枚举有限步数可以出现的所有情况. 然后加一个A* 就是如果这个数一直平方 所需要的步骤数都不能达到最优 就剪掉 #include < ...