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 ...
随机推荐
- 内核移植和文件系统制作(2):linux内核最小系统和initramfs文件系统
linux内核最小系统,使用内核版本:https://www.kernel.org/pub/linux/kernel/v3.0/linux-3.8.1.tar.bz2 1,FL2440板子的基本硬件: ...
- 窗体==>>初始Windows程序
初识Windows程序 01.创建Windows程序(VS) 01.打开Visual Studio开发工具 02.选择"文件"→"新建"→"项目&qu ...
- windows下使用makecert命令生成自签名证书
1.makecert命令路径 C:\Program Files (x86)\Windows Kits\8.1\bin\x64 2.生成一个自签名证书 makecert -r -pe -n " ...
- 养只爬虫当宠物(Node.js爬虫爬取58同城租房信息)
先上一个源代码吧. https://github.com/answershuto/Rental 欢迎指导交流. 效果图 搭建Node.js环境及启动服务 安装node以及npm,用express模块启 ...
- 对于Oracle analyze table的使用总结 . 对于Oracle analyze table的使用总结 .
对于Oracle analyze table的使用总结 . 对于Oracle analyze table的使用总结 . analyze table 一般可以指定分析: 表,所有字段,所有索引字段,所有 ...
- Atitit.图片木马的原理与防范 attilax 总结
Atitit.图片木马的原理与防范 attilax 总结 1.1. 像图片的木马桌面程序1 1.2. Web 服务端图片木马1 1.3. 利用了Windows的漏洞1 1.4. 这些漏洞不止Windo ...
- 我在用的mac软件(1)--终端环境之iTerm2
之前一直有朋友要我分享下在用的mac软件,今天有空就来写一下,可能不止于软件,会有一些配置或者工具,或者叫环境更合适.有些可能一句话带过,有些会详细介绍.也不分类了,想到哪个就写出来.如果已经写的足够 ...
- IOS异常日志记录与展现功能
在平常的APP开发过程中经常碰到程序遇到异常闪退的问题,通过日志可以把相关的详细错误信息进行记录,本实例要记录不管在哪个页面出错都要进行记录,这边使用到的日志记录插件CocoaLumberjack,以 ...
- 【读书笔记】iOS-内存释放
一,有些编程人员喜欢将内存清理的代码集中组织到函数中的某个地方,而另一些编程人员则喜欢在创建点自动释放对象,以免以后忘记释放这些对象.两种方法都是有效的. 二,id类型表示一个可以指向任何类型的对象的 ...
- 关于NSDate和NSDateFormatter的几个常用方法
/** * NSDate常见类方法 */ // 获得当前时间 NSDate *date1 = [NSDate date]; // 类方法 // NSDate *date1 = [[NSDate ...