我们一直在写关于高效算法来解决复杂问题,如最短路径欧拉图最小生成树等。这些都是算法设计者的成功故事。 在这篇文章中,讨论了计算机科学的失败故事。

计算机可以解决所有的计算问题吗?

存在计算问题,即使在无限制的时间内,算法也无法解决。例如图灵暂停(Turing Halting)问题(给定一个程序和一个输入,程序是否会在使用该输入运行时终止,否则将永远运行)。Alan Turing证明,解决所有可能的程序输入对的停止问题的一般算法不可能存在。证明的关键部分是,图灵机被用作计算机和程序的数学定义(源停止问题)。

NP完全问题是另一个失败的故事,NP完全问题是问题的状态是未知的。对于任何NP完全问题,还没有发现多项式时间算法内可以解决,也没有任何人能够证明任何一个都不存在多项式时间算法。有趣的是,如果在多项式时间内可以解决NP完全问题中的任何一个,那么所有这些都可以解决。

什么是NP,P,NP完成和NP-Hard问题?(提示:昨天我写过一篇文章里面有介绍)
P问题是一系列可以在多项式时间内在确定的机器上可以被解决的问题。

NP问题是一系列的可以由一个在多项式时间内在非确定性图灵机实现的问题。P是NP的子集(多项式时间中可以通过确定性机器求解的任何问题也可以在多项式时间内由非确定性机器求解)。

非正式地,NP是通过“幸运算法”的多项式时间解决的决策问题集合,这是一种在给定的选择集合(Source Ref 1)中始终作出正确猜测的神奇算法。

NP完整的问题是NP集中最难的问题。

一个决策问题是一个NP完全问题,当且仅当下面条件成立:
1) L在NP中(NP的完整问题的任何给定解决方案可以快速验证,但没有有效的已知解决方案),则决策问题L为NP完成。
2) NP中的每个问题在多项式时间内可以减少为L(减少定义如下)。

一个问题是NP-Hard如果遵循上述属性2,不需要遵循属性1.因此,NP-Complete问题也是NP-Hard问题的一个子集。

决策与优化问题
NP完整性适用于决策问题的领域。这样做是因为比较优化问题的决策问题的难度比较容易。实际上,尽管在多项式时间内能够解决决策问题通常也可以使我们在多项式时间内解决相应的优化问题(使用多项式调用决策问题)。因此,讨论决策问题的难度通常与讨论优化问题的难度相当。(来源参考文献2)。
例如,考虑顶点覆盖问题(给定一个图形,找出覆盖所有边缘的最小尺寸顶点集)。这是一个优化问题。相应的决策问题是,给定无向图G和k,是否存在大小为k的顶点覆盖?

什么是约简?
令 L1和L2是两个决策问题。假设算法A2求解L2。也就是说,如果y是L2的一个输入,则算法A2将输出是,不根据是否属于L2来回答是或否。
该思想是找到从L1到L2的变换,使得算法A2可以是算法A1的一部分,从而求解L1

学习约简是非常重要的。例如,如果我们有库函数来解决某些问题,如果我们可以将一个新的问题归纳到一个解决的问题,我们节省了大量的时间。考虑一个问题的例子,我们必须在给定的有向图中找到最小产品路径,其中路径的乘积是沿着路径的边的权重的乘积。如果我们有Dijkstra算法的代码找到最短路径,我们可以采用所有权重的记录,并使用Dijkstra的算法找到最小的产品路径,而不是为这个新问题写一个新的代码。

如何证明给定的问题是NP完成?
从NP-complete问题的定义看,似乎不可能证明问题L是NP-Complete。根据定义,它要求我们显示NP中的每个问题都是多项式时间可以约简到L.幸运的是,有一种替代方法来证明它。这个想法是采取已知的NP-Complete问题并将其减少到L.如果可以进行多项式时间减少,我们可以证明L是通过减少传递性的NP-Complete(如果在多项式中可以将NP完全问题简化为L时间,则所有问题都可以在多项式时间内缩减为L)。

NP-Complete的第一个问题是什么?
NP-Complete问题的定义必然会出现一些第一个NP-Complete问题。  SAT(布尔可满足性问题)是Cook证明的第一个NP-Complete问题(见CLRS书的证明)。

了解NP-Completeness甚至对于工程师来说总是有用的。假设您被要求编写一个有效的算法来解决贵公司极其重要的问题。经过很长时间的思考,你只能拿出指数时间的方法,这是不切实际的。如果您不了解NP完整性,您只能说我无法使用高效的算法。如果您了解NP完整性,并证明问题为NP完成,您可以自豪地说多项式时间解决方案不太可能存在。如果有多项式时间解可行,那么该解决方案解决了许多科学家多年来一直在努力的计算机科学的一个大问题。

我们很快将讨论更多的NP-Complete问题及其对NP完整性的证明。

NP完整性| 集1(简介)的更多相关文章

  1. MySQL Cluster 集群简介

    简介 MySQL集群是一种在无共享架构(SNA,Share Nothing Architecture)系统里应用内存数据库集群的技术.这种无共享的架构可以使得系统使用低廉的硬件获取高的可扩展性. My ...

  2. redis(8)集群简介

    一.集群 互联网每天都会产生大量的数据,单实例已经不能满足需求.但是如果依赖于硬件成本的提升,那就不是所有人能够负担的起的. 集群这个时候出现,一定程度上解决了这个问题.它通过互联网,将多个单实例连接 ...

  3. SIGAI机器学习第一集 机器学习简介

    讲授机器学习的基本概念.发展历史与典型应用 大纲: 人工智能简介机器学习简介为什么需要机器学习机器学习的发展历史机器学习的典型应用人工智能主要的公司本课程讲授的算法 机器学习并不是人工智能一上来就采用 ...

  4. MySQL Group Replication-MGR集群简介

    简介 MySQL Group Replication(简称MGR)字面意思是mysql组复制的意思,但其实他是一个高可用的集群架构,暂时只支持mysql5.7和mysql8.0版本. 是MySQL官方 ...

  5. Redis集群简介及部署

    1简介 在 Redis 3.0 之前,使用 哨兵(sentinel)机制来监控各个节点之间的状态.Redis Cluster 是 Redis 的 分布式解决方案,在 3.0 版本正式推出,有效地解决了 ...

  6. Apache Commons 工具集使用简介

    Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动.我选了一些比较常用的项目做简单介绍.文中用了很多网上现成的东西,我只是做了一个汇总整理. 一.Comm ...

  7. 集群技术(二) MySQL集群简介与配置详解

    when?why? 用MySQL集群? 减少数据中心结点压力和大数据量处理(读写分离),采用把MySQL分布,一个或多个application对应一个MySQL数据库.把几个MySQL数据库公用的数据 ...

  8. RabbitMQ集群简介

    一个RabbitMQ消息代理是一个由一个或多个Erlang节点组成的逻辑组,其中的每个节点都共享users, virtual hosts, queues, exchanges, bindings, a ...

  9. LVS集群简介及使用

    什么是集群 一组通过高速网络互联的计算组,并以单一系统的模式加以管理 将很多服务器集中在一起,提供一种服务,在客户端看来就象是只有一个服务器 可以在付出较低成本的情况下获得在性能,可靠性,灵活性方面的 ...

随机推荐

  1. 《java.util.concurrent 包源码阅读》02 关于java.util.concurrent.atomic包

    Aomic数据类型有四种类型:AomicBoolean, AomicInteger, AomicLong, 和AomicReferrence(针对Object的)以及它们的数组类型, 还有一个特殊的A ...

  2. C# tostring

    GUID: 即Globally Unique Identifier(全球唯一标识符) 也称作 UUID(Universally Unique IDentifier) . GUID是一个通过特定算法产生 ...

  3. 自学python笔记(一)

    一   简介:Python是著名的"龟叔"Guido van Rossum在1989年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言.其他的就不说了..... python是 ...

  4. Jrebel热部署配置完整教程(IntelliJ IDEA、Jrebel、spring boot、springboot、eclipse、Tomcat)

    标签:IntelliJ IDEA.Jrebel.spring boot.springboot.eclipse.Tomcat1.安装插件并激活插件安装参考:http://blog.csdn.net/u0 ...

  5. Django框架的安装

    下载Django框架 创建一个django项目 在E盘Mysite文件夹下创建了一个django项目叫mysite 当前文件夹下会产生一个mysite的文件夹,目录结构如下: manage.py -- ...

  6. 【转】《高级前端3.6》JavaScript多线程——Concurrent.Thread.js, WebWork

    原文链接:http://www.cnblogs.com/woodk/articles/5199536.html JavaScript多线程,在HTML5 WebWork没出现之前很多人都是用Concu ...

  7. mysql建表测试

    drop table if exists news; --如果存在表则删除create table news  --创建表(        id int unsigned not null auto_ ...

  8. 守护进程VS守护线程

    守护(daemon)进程 引入: join()方法可以使一个进程运行完之后再执行下一个进程,而daemon()方法就是主进程的代码执行完毕之后,不需要等待子进程,立即终止子进程. join()方法和d ...

  9. appium测试准备记录

    一 获取应用程序包名(手机中不安装apk) windows 环境下: aapt工具 使用aapt工具,适合给程序自动获取apk的相关信息. //aapt 是sdk自带的一个工具,在SDK/buildt ...

  10. Java SE 8 流库(二)

    1.3. filter,map,flatMAP方法 流的转换会产生一个新流,它的元素派生出自另一个流中的元素: Stream<T> filter(Predicate<? super ...