zoukankan      html  css  js  c++  java
  • P、NP、NP-Complete、NP-hard问题

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

  • 相关阅读:
    程序员7种武器成
    FastReport 使用技巧篇
    FastReport调用Delphi中的自定义函数(人民币大写金额)mtm
    FastReport里面正确调用函数的方法
    FastReport报表设计
    FastReport报表对象介绍一:“Text”对象
    设定报表变量的CharSpacing
    FastReport问题整理(技巧)
    FASTREPORT 整理 (mtm)
    fastReport 运行时设计报表 (mtm)
  • 原文地址:https://www.cnblogs.com/wuchanming/p/3839699.html
Copyright © 2011-2022 走看看