原创翻译加学习笔记,方便国人学习算法知识!

原文链接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的更多相关文章

  1. NP完全问题

    1.概念 好算法:Edmonds与1975年提出:具有多项式时间(O(nk)的算法为好算法. P类问题:存在多项式时间算法的问题.如:货郎问题.调度问题.最大团问题.最大独立集问题.Steiner树问 ...

  2. P、NP、NP完全问题

    如果一个算法的最差时间效率属于O(p(n)),则该算法可以在多项式的时间内对问题进行求解,其中p(n)是输入规模n的一个多项式函数. 可以在多项式时间内求解的问题是易解的.不能在多项式时间内求解的问题 ...

  3. 小小知识点(六)——算法中的P问题、NP问题、NP完全问题和NP难问题

    转自CSDN默一鸣 https://blog.csdn.net/yimingsilence/article/details/80004032 在讨论算法的时候,常常会说到这个问题的求解是个P类问题,或 ...

  4. NP完全问题的证明

    目录 NP完全问题的证明 一.限制法 最小覆盖问题(VC) 子图同构问题 0-1背包(Knapsack) 三元集合的恰当覆盖(X3C) 集中集 有界度的生成树 多处理机调度 二.局部替换法 3SAT问 ...

  5. NP问题/NP完全问题(NP-complete problem)如何判断是否是NP完全问题

    在算法复杂度分析的过程中,人们常常用特定的函数来描述目标算法,随着变量n的增长,时间或者空间消耗的增长曲线,近而进一步分析算法的可行性(有效性). 引入了Big-O,Big-Ω,来描述目标算法的上限. ...

  6. 区分range() , np.arange() , np.linspace()

    content: range() np.arange() np.linspace() 一.range(start, stop, step) 1.range() 为 python 自带函数 2.生成一个 ...

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

  8. Python 中的几种矩阵乘法 np.dot, np.multiply, *【转】

    本文转载自:https://blog.csdn.net/u012609509/article/details/70230204 Python中的几种矩阵乘法1. 同线性代数中矩阵乘法的定义: np.d ...

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

随机推荐

  1. Windows下 C++ 实现匿名管道的读写操作

    由于刚弄C++没多久,部分还不熟练,最近又由于开发需求要求实现与其他程序进行通信,瞬间就感觉想到了匿名通信.于是自己查阅了一下资料,实现了一个可读可写的匿名管道: 源代码大部分都有注释: Pipe.h ...

  2. 由SimpleAyncTaskExecutor到ListenableFutureTask

    Spring AsyncExecutor观后感 导语 本来想看下spring关于Async&Sync TaskExecutor的主要内容,看着看着发现ListenableTaskExecuto ...

  3. NLog在.NET Core Console Apps中的简单应用

    什么是NLog? NLog is a free logging platform for .NET with rich log routing and management capabilities. ...

  4. 切换到percona server各种问题

    这两天把七八台服务器全部切换到了percona server,相关注意事项如下: 1.JDBC报ERROR 1862 (HY000): Your password has expired. To lo ...

  5. windows 7文件误删shift+delete后找回

    昨天要还电脑了,结果脑子一抽,某个目录还没拷贝,shift+delete了整个目录,删除到一半,完了...我的源码都在里面还没出来啊...这TMD要命啊... 赶紧搜了一把,windows文件误删恢复 ...

  6. linux线程控制&线程分离

    线程概念 线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元. 线程是程序中一个单一的顺序控制流程.进程内一个相对独立的.可调度的执行单元,是系统独立 ...

  7. [Architecture Design] 累进式Domain Layer

    [Architecture Design] 累进式Domain Layer 前言 本篇的内容大幅度的简化了分析设计.面向对象等等相关知识,用以传达累进式Domain Layer的核心概念.实际开发软件 ...

  8. ASP.NET MVC 微信公共平台开发之获取用户消息并处理

    ASP.NET MVC 微信公共平台开发 获取用户消息并处理 获取用户消息 用户发送的消息是在微信服务器发送的一个HTTP POST请求中包含的,获取用户发送的消息要从POST请求的数据流中获取 微信 ...

  9. [Microsoft Dynamics CRM 2016]Invalid Action – The selected action was not valid 错误的诱因及解决方法

    详细问题描述: 由于解决windows server 评估版过期\SQL server 评估版过期的问题后而导致的Invalid Action – The selected action was no ...

  10. Struts2(十五)实现文件上传

    一.导入包 需要将commons-fileupload和commons-io包和struts包一起导入 实现步骤: 在Jsp页面实现客户端选择上传文件 配置Struts.xml,拦截器会自动接收上传的 ...