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

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

存在计算问题,即使在无限制的时间内,算法也无法解决。例如图灵暂停(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. 正确释放Vector的内存

    http://blog.jobbole.com/37700/ 今天在看微博的时候, 有人提出了一个对于Vector内存泄露的疑问( Link). 博主采用 Vector存储一些数据,但是发现在执行 c ...

  2. 【Android开发学习笔记之一】5大布局方式详解

    Android中常用的5大布局方式有以下几种: 线性布局(LinearLayout):按照垂直或者水平方向布局的组件. 帧布局(FrameLayout):组件从屏幕左上方布局组件. 表格布局(Tabl ...

  3. postman 时间戳和加密

    在使用postman进行接口测试的时候,对于有些接口字段需要时间戳加密,这个时候我们就遇到2个问题,其一是接口中的时间戳如何得到?其二就是对于现在常用的md5加密操作如何在postman中使用代码实现 ...

  4. 校验ISBN的方法

     国际标准书号(International Standard Book Number,ISBN:是国际通用的图书或独立的出版物(除定期出版的期刊)代码.出版社可以通过国际标准书号清晰的辨认所有非期刊书 ...

  5. iphone6 plus导入联系人或者通讯录

    iphone6 plus快速导入联系人或者通讯录(使用QQ同步助手,真的很简单) 最近换了部手机,由于之前的手机保存联系人都是保存在手机,没有备份在sim卡,由于sim卡被我剪小了,不能插回原来的手机 ...

  6. jQuery操作input改变value属性值

    今天写了一个表单元素,在用户点击的时候会清空input中的内容,当鼠标点击其他地方的时候会把输入的值保存为input的value值 类似于这样的效果 当用户点击的时候文字消失. html代码 < ...

  7. 【转】npm包管理器那些事

    原文链接:http://www.cnblogs.com/shuoer/p/7782125.html npm包管理器那些事! 今天和朋友针对npm包全局安装和本地项目安装这个梗展开的激烈的讨论,故此做一 ...

  8. 【转】千万不要在JS中使用连等赋值操作

    原文链接 千万不要在JS中使用连等赋值操作   目录 前言 赋值顺序? 连续赋值能拆开写么? 后记 前言 文章标题这句话原本是在国外某JavaScript规范里看到的,当时并没有引起足够的重视,直到最 ...

  9. shell,bash,zsh,console,terminal到底是什么意思,它们之间又是什么关系?

    原文链接 终端(terminal,或者叫物理终端):是一种设备,不是一个程序,一般说的就是能提供命令行用户界面的设备,典型的是屏幕和键盘,或其他的一些物理终端.虚拟终端:屏幕和键盘只是一个终端,可能不 ...

  10. PHP入门怎么选?大学生适合学习吗?

    大学毕业,面对竞争激烈的社会,理想总是很丰满,现实却很残酷.在硕士.博士都随处可见的今天,本科和大专文凭就显得苍白无力,在面试官问你"有没有工作经验"的时候,你是不是只想起实习期间 ...