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

原文链接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. java之内的工具分享,附带下载链接,方便以后自己寻找

    class反编译工具:http://pan.baidu.com/s/1geYvX5L redis客户端工具:http://pan.baidu.com/s/1eRJ4ThC mysql客户端-[mysq ...

  2. 隐藏android系统标题栏和状态栏

    //隐藏系统title requestWindowFeature(Window.FEATURE_NO_TITLE); //隐藏状态栏 getWindow().addFlags(WindowManage ...

  3. 3kb jQuery代码搞定各种树形选择。

    自制Jquery树形选择插件. 对付各种树形选择(省市,分类..)90行Jquery代码搞定,少说废话直接上插件代码.稍后介绍使用说明.是之前写的一个插件的精简版. 1.Jquery插件代码 /* * ...

  4. inner Join on 随随随随随便一记

                                   幼儿园大班生(随便的记一记) JOIN 分为:内连接(INNER JOIN).外连接(OUTER JOIN).其中,外连接分为:左外连接( ...

  5. javascript中||和&&代替if

    首先,我们来看一段代码: ; ){ add_level = ; } ){ add_level = ; } ){ add_level = ; } ){ add_level = ; } else { ad ...

  6. 转:C# 使用NLog记录日志

    原文:http://www.cnblogs.com/felixnet/p/5498759.html NLog是一个记录日志组件,和log4net一样被广泛使用,它可以将日志保存到文本文件.CSV.控制 ...

  7. 通过重写OnScrollListener来监听RecyclerView是否滑动到底部

    为了增加复用性和灵活性,我们还是定义一个接口来做监听滚动到底部的回调,这样你就可以把它用在listview,scrollView中去. OnBottomListener package kale.co ...

  8. SQL语句的简单使用

    首先要先引入libsqlite3.0.tbd框架 DataBaseHandle.h #import <Foundation/Foundation.h> @interface DataBas ...

  9. 基础学习day10--异常、包

    一.异常 1.1.异常定义 异常:--不正常,程序在运行时出现不正常情况 异常由来:其实也是现实生活中一个具体的事物,马可以通过JAVA的类的形式表现描述,并封装成类. Java对不正常情况描述后的, ...

  10. 基础学习day06---面向对象二---static,类的初始化和调用顺序、单例模式

    一.static关键字 1.1.static关键字 静态:static用法:是一个修饰符,用于修饰成员(成员变量,成员函数)static 修饰的内容,所有对象共享当成员被静态修饰后,就多了一个调用方式 ...