NP完全问题 NP-Completeness
原创翻译加学习笔记,方便国人学习算法知识!
原文链接http://www.geeksforgeeks.org/np-completeness-set-1/
我们已经找到很多很高效的算法来解决很难得问题,例如最短路径(shortest path),一笔画问题(Euler graph),最小生成树(minimum spanning tree)等等。这些都是算法设计者的胜利。在这一篇文章中,我们来讨论一下一些失败的例子。
是不是所有的计算问题都可以用计算机解决?
有一切计算问题是没法用算法解决的,即使可以用无限的时间,例如停机问题(给定一个程序P和输入w,程序P在输入w下是否能够最终停止。)艾伦·图灵证明了,不存在解决停机问题的通用算法。这个证明的关键在于对计算机和程序的数学定义。
NP完全问题就是一个失败的例子,没人发现NP完全问题的多项式解法,但是也没人可以证明NP完全问题一定没有多项式解法,有趣的是,如果有人能找到一个NP完全问题的多项式时间解法,那么所有的NP完全问题就都有多项式时间解法。(因为所有的NP 完全问题都可以归约成一个问题)
什么是 P, NP, NP-complete, NP-Hard 问题?
P就是可以在确定型图灵机(deterministic Turing machine)上找到多项式时间解。
NP是一系列决定性问题(decision problem),可以在非确定型图灵机(Non-deterministic Turing Machine)上找到多项式时间解。P问题是NP的子集,也就是说在确定型图灵机上能找到多项式时间解的在非确定型图灵机上同样能找到解。
NP-complete NP完全问题使一些最难的NP 问题,满足以下条件的话,一个问题L就是NP完全问题:
1. L问题是NP问题(给出一个解,可以在多项式时间里来验证(verified)这个解是否正确,但是没法用多项式时间内找到解)
2. 已知的NP-complete问题可以在多项式时间内归约成L问题
如果满足条件2的话,我们就称之为NP-hard问题,但是不需要满足条件1。所以NP-complete 是NP-hard的子集。
下面这个图可以看到P, NP, NP-complete, NP-Hard 之间的关系:

什么是归约?What is Reduction?
假设L1, L2是两个决定性问题(decision problem : 结果只有可能是Yes or No), 算法A2可以解决L2, 如果input Y是L2的输入,运行A2算法时,根据Y的输入是不是和L2相关来给出结果Yes or No。
想法是找到从L1问题到L2问题的转化,这样A2就可以成为A1解法的一部分去解决L1问题。
学习如何归约是很重要的。如果我们有一些库函数(library function)去解决一些特定问题,这样我们把新的问题规约到这个已解决的问题,这样可以解决很多时间。例如找最小乘积路径,在一个有向图里路径上权重的最小乘积。如果我们有一个找最短路径的DIjkstra算法的代码,我们可以用log一下所有权重,然后用dijkstra算法找最短路径,这样比重新写一个代码快的多。
怎么样证明一个问题是不是NP-complete?
从NP-complete问题的定义来看,看似很难证明一个问题L是NP-complete。因为根据定义,我们需要证明是否能把所有的NP问题都可以在多项式时间内规约到L。幸运的是我们有另外一条路可以走,就是把一个已知的NP-complete问题规约到L,如果可以在多项式时间内归约,我们就可以证明这个问题L是NP-complete。(如果一个NPC可以归约到L,那么所有的问题都可以在多项式时间内归约到L 有点绕!)
第一个被证明的NP-complete的问题是什么?
一定存在第一个NP-complete通过定义被证明是NP-complete问题。SAT(boolean satisfiablilty problem 布尔可满足性问题)就是第一题个被证明的NP-complete(查看算法导论)
了解NP完全问题对于工程师来说都是很有用的。假设在公司里你被要求写一个高效率的算法来解决一个非常重要的问题。经过了很多思考,你只能想到一个没啥用的指数时间的解法,如果你不知道NP完全,你只能说我想不出一个高效的算法,但当你知道NP完全问题并且能证明这个问题就是NP-complete,你可以很自豪的说基本上不存在多项式时间解。如果存在的话,那么这个解可以解决一个科学教研究了几十年的大问题。
NP完全问题 NP-Completeness的更多相关文章
- NP完全问题
1.概念 好算法:Edmonds与1975年提出:具有多项式时间(O(nk)的算法为好算法. P类问题:存在多项式时间算法的问题.如:货郎问题.调度问题.最大团问题.最大独立集问题.Steiner树问 ...
- P、NP、NP完全问题
如果一个算法的最差时间效率属于O(p(n)),则该算法可以在多项式的时间内对问题进行求解,其中p(n)是输入规模n的一个多项式函数. 可以在多项式时间内求解的问题是易解的.不能在多项式时间内求解的问题 ...
- 小小知识点(六)——算法中的P问题、NP问题、NP完全问题和NP难问题
转自CSDN默一鸣 https://blog.csdn.net/yimingsilence/article/details/80004032 在讨论算法的时候,常常会说到这个问题的求解是个P类问题,或 ...
- NP完全问题的证明
目录 NP完全问题的证明 一.限制法 最小覆盖问题(VC) 子图同构问题 0-1背包(Knapsack) 三元集合的恰当覆盖(X3C) 集中集 有界度的生成树 多处理机调度 二.局部替换法 3SAT问 ...
- NP问题/NP完全问题(NP-complete problem)如何判断是否是NP完全问题
在算法复杂度分析的过程中,人们常常用特定的函数来描述目标算法,随着变量n的增长,时间或者空间消耗的增长曲线,近而进一步分析算法的可行性(有效性). 引入了Big-O,Big-Ω,来描述目标算法的上限. ...
- 区分range() , np.arange() , np.linspace()
content: range() np.arange() np.linspace() 一.range(start, stop, step) 1.range() 为 python 自带函数 2.生成一个 ...
- scikit-learn工具学习 - random,mgrid,np.r_ ,np.c_, scatter, axis, pcolormesh, contour, decision_function
yuanwen: http://blog.csdn.net/crossky_jing/article/details/49466127 scikit-learn 练习题 题目:Try classify ...
- Python 中的几种矩阵乘法 np.dot, np.multiply, *【转】
本文转载自:https://blog.csdn.net/u012609509/article/details/70230204 Python中的几种矩阵乘法1. 同线性代数中矩阵乘法的定义: np.d ...
- Numpy:np.vstack()&np.hstack() flat/flatten
一 . np.vstack: 按垂直方向(行顺序)堆叠数组构成一个新的数组 In[3]: import numpy as np In[4]: a = np.array([[1,2,3]]) a.sh ...
随机推荐
- ReactNative——生命周期
1.创建阶段 getDefaultProps:处理props的默认值 在react.createClass调用 //在创建类的时候被调用 this.props该组件的默认属性 2.实例化阶段 Reac ...
- Play 内置模板标签(1.2.3版本)http://www.anool.net/?p=617
a标签: 用来插入一个连接到控制器方法的html link.如下: #{a @Application.logout()}Disconnect#{/a}模板内容被解析后变成: <a href=&q ...
- ES6--class基本使用
类定义 ES6完整学习阮老师的ECMAScript6入门. 技术一般水平有限,有什么错的地方,望大家指正. 以前我们使用ES5标准定义一个构造函数的过程如下: function Person(name ...
- SAP数据更新的触发
SAP 应用系统架构 应用层运行着DIALOG进程,每个DIALOG进程绑定一个数据库进程,DIALOG进程与GUI进行通信,每次GUI向应用服务器发送请求时都会通过dispatche ...
- SharePoint 2013 中自定义WCF服务
在使用SharePoint2013的时候,如果其他客户端 API 的组合不足,可以通过自定义 Web 服务扩展 SharePoint.默认情况下,SharePoint 2013 不仅支持创建自定义 A ...
- 配置SharePoint使用ADFS
1. 如果网站应用程序没有使用声明式验证 $wpp = Get-SPWebApplication <URL> $wpp.UseClaimsAuthentication = 1 $wpp.U ...
- 简易的可拖动的桌面悬浮窗效果Demo
首先,我们需要知道,悬浮窗分为两种:Activity级别的悬浮窗,系统级别的悬浮窗 Activity级别的悬浮窗跟随所属Activity的生命周期而变化,而系统级别的悬浮窗则可以脱离Activity而 ...
- IOS编程思想
从今天起想走进IOS架构的大门,一直不屑于学习第三方框架,觉得框架也是一点点代码给垒起来的,只要掌握了代码就可以了,殊不知垒代码的过程才是最重要的,而这个过程又岂是一朝一夕就能达到完美境界的,达到完美 ...
- 基础学习day05---面向对象一类,对象、封装
一.面向对象 1.1.面向对象的概念 很经典的一句话----------万物皆对象 定义:面向对象一相对面向过程而言的 面向对象和面向过程都是一种思想 面向过程-- ...
- 【改】IOS-百度地图API用点生成线路、导航、自定义标注 2013年11月更新
IOS百度地图API开发自定义气泡,点击气泡自动生成路线,以及拖拽IOS百度地图开发POISearch搜索附近停车场,附近加油站IOS百度地图视角跳到用户当前位置IOS百度地图开发实时路况IOS开发百 ...