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.输 ...
随机推荐
- RPC进阶篇
RPC实现结构拆解 RPC过程调用详解:RPC 服务端通过 RpcServer 去导出(export)远程接口方法,而客户端通过 RpcClient 去引入(import)远程接口方法. 客户端像调用 ...
- 上传控件swfupload的使用笔记
1.下载下来的官方domo里不同的例子里会引入各自的JS,注意区分.可以直接拿官方例子来改成自己想要的例子. 2.注意PHP配置文件里也有最大上传文件限制,如果文件太大会上传不成功. 3.如果有问题可 ...
- POJ2406----Power Strings解题报告
Power Strings Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 43514 Accepted: 18153 D ...
- html5 canvas防微博旋转
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- android 源码 中修改系统字体大小
在源码\android\frameworks\base\core\java\android\content\res \Configuration.java下有读取DEFAULT_FONTSCALE的值 ...
- SpriteKit
[SpriteKit] Sprite Kit provides a graphics rendering and animation infrastructure that you can use t ...
- DaoFactory.java
package com; import com.isoftstone.fwk.dao.ActionDao; import com.isoftstone.fwk.dao.Dao; import com. ...
- 编译安装glibc
转帖地址下载glibcwget http://ftp.gnu.org/gnu/glibc/glibc-2.3.2.tar.gz 下载glibc-linuxthreadswget http://ftp. ...
- HDU 3920Clear All of Them I(状压DP)
HDU 3920 Clear All of Them I 题目是说有2n个敌人,现在可以发n枚炮弹,每枚炮弹可以(可以且仅可以)打两个敌人,每一枚炮弹的花费等于它所行进的距离,现在要消灭所有的敌人 ...
- ajax提交后台自动反序列化成对象
下面是ajax提交的方法,主要用到了$form.serializeArray()将表单序列化成json对象,然后用each处理一下,代码如下: var $form = $('<form>& ...