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是否等价的研究结论

P、NP、NP-Complete、NP-hard问题的更多相关文章

  1. numpy中np.c_和np.r_

    np.r_:按列连接两个矩阵,就是把两矩阵上下相加,要求列数相等,类似于pandas中的concat() np.c_:按行连接两个矩阵,就是把两矩阵左右相加,要求行数相等,类似于pandas中的mer ...

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

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

  3. np.tile 和np.newaxis

    output   array([[ 0.24747071, -0.43886742],   [-0.03916734, -0.70580089],   [ 0.00462337, -0.5143158 ...

  4. numpy 辨异(四)—— np.repeat 与 np.tile

    >> import numpy as np >> help(np.repeat) >> help(np.tile) 二者执行的是均是复制操作: np.repeat: ...

  5. numpy 下的数据结构与数据类型的转换(np.array vs. np.asarray)

    1. np.asarray -- numpy 风格的类型转换 从已有多维数组创建新的多维数组,数据类型可重新设置 >> B = np.asarray(A, dtype='int32') 2 ...

  6. 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 ...

  7. python多项式拟合:np.polyfit 和 np.polyld

    python数据拟合主要可采用numpy库,库的安装可直接用pip install numpy等. 1. 原始数据:假如要拟合的数据yyy来自sin函数,np.sin import numpy as ...

  8. np.c_与np.r_

    import sys reload(sys) sys.setdefaultencoding('utf-8') import numpy as np def test(): ''' numpy函数np. ...

  9. 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 ...

  10. numpy中np.array()与np.asarray的区别以及.tolist

    array 和 asarray 都可以将 结构数据 转化为 ndarray,但是主要区别就是当数据源是ndarray时,array仍然会copy出一个副本,占用新的内存,但asarray不会. 1.输 ...

随机推荐

  1. RPC进阶篇

    RPC实现结构拆解 RPC过程调用详解:RPC 服务端通过 RpcServer 去导出(export)远程接口方法,而客户端通过 RpcClient 去引入(import)远程接口方法. 客户端像调用 ...

  2. 上传控件swfupload的使用笔记

    1.下载下来的官方domo里不同的例子里会引入各自的JS,注意区分.可以直接拿官方例子来改成自己想要的例子. 2.注意PHP配置文件里也有最大上传文件限制,如果文件太大会上传不成功. 3.如果有问题可 ...

  3. POJ2406----Power Strings解题报告

    Power Strings Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 43514   Accepted: 18153 D ...

  4. html5 canvas防微博旋转

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  5. android 源码 中修改系统字体大小

    在源码\android\frameworks\base\core\java\android\content\res \Configuration.java下有读取DEFAULT_FONTSCALE的值 ...

  6. SpriteKit

    [SpriteKit] Sprite Kit provides a graphics rendering and animation infrastructure that you can use t ...

  7. DaoFactory.java

    package com; import com.isoftstone.fwk.dao.ActionDao; import com.isoftstone.fwk.dao.Dao; import com. ...

  8. 编译安装glibc

    转帖地址下载glibcwget http://ftp.gnu.org/gnu/glibc/glibc-2.3.2.tar.gz 下载glibc-linuxthreadswget http://ftp. ...

  9. HDU 3920Clear All of Them I(状压DP)

    HDU 3920   Clear All of Them I 题目是说有2n个敌人,现在可以发n枚炮弹,每枚炮弹可以(可以且仅可以)打两个敌人,每一枚炮弹的花费等于它所行进的距离,现在要消灭所有的敌人 ...

  10. ajax提交后台自动反序列化成对象

    下面是ajax提交的方法,主要用到了$form.serializeArray()将表单序列化成json对象,然后用each处理一下,代码如下: var $form = $('<form>& ...