博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P、NP、NP-Complete、NP-hard问题
阅读量:5290 次
发布时间:2019-06-14

本文共 1351 字,大约阅读时间需要 4 分钟。

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关系的研究上。
在针对该问题的最前沿研究上,也是各执一词。参见。

4 参考

  •  (有例子的一篇中文介绍,感谢靖难兄推荐)

转载于:https://www.cnblogs.com/wuchanming/p/3839699.html

你可能感兴趣的文章
JavaScript启示录
查看>>
我需要什么样的浏览器?
查看>>
取textaera里的值
查看>>
java设计模式1--工厂方法模式(Factory Method)
查看>>
博客第一弹—聊聊HTML的那些事
查看>>
上海2017QCon个人分享总结
查看>>
HIVE快速入门 分类: B4_HIVE 2015-...
查看>>
Mysql安装方法及安装问题解决
查看>>
Java动态代理的两种实现方式:
查看>>
PHP trait
查看>>
Redis的常用命令(三)
查看>>
HDOJ 4749 Parade Show
查看>>
python 多线程并发threading & 任务队列Queue
查看>>
【黑马程序员】资深程序员的见解
查看>>
1_fbauto
查看>>
IO体系、集合体系、多线程、jdbc
查看>>
Service Bus Namespace 和 Access Control
查看>>
关于时间:UTC/GMT/xST/ xDT
查看>>
[51Nod1089] 最长回文子串 V2(Manacher算法)
查看>>
Asp.Net生命周期系列六
查看>>