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

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

存在计算问题,即使在无限制的时间内,算法也无法解决。例如图灵暂停(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. JavaScript学习笔记(十三)——生成器(generator)

    在学习廖雪峰前辈的JavaScript教程中,遇到了一些需要注意的点,因此作为学习笔记列出来,提醒自己注意! 如果大家有需要,欢迎访问前辈的博客https://www.liaoxuefeng.com/ ...

  2. CentOS环境下Docker私有仓库搭建

    本文讲述如何搭建docker私有仓库. 有了docker hub,为什么还要搭建docker私有仓库? 1.性能考虑:docker hub的访问要通过互联网,性能太低. 2.安全性:更多的时候,镜像不 ...

  3. ##2.基础服务(SQl,RabbitMQ)-- openstack pike

    2-基础服务(SQl,RabbitMQ) openstack pike 安装 目录汇总 http://www.cnblogs.com/elvi/p/7613861.html ##.基础服务(Mysql ...

  4. Unity3d的模型自动导入帧数表

    开发中经常需要,对美术模型进行一些处理.(以fbx为例) 例如,需要把动作的名字.start和end加入animations的clips. 如果手动操作,就是在模型的Inspector窗口,一个动作点 ...

  5. 大白话Vue源码系列(02):编译器初探

    阅读目录 编译器代码藏在哪 Vue.prototype.$mount 构建 AST 的一般过程 Vue 构建的 AST 题接上文,上回书说到,Vue 的编译器模块相对独立且简单,那咱们就从这块入手,先 ...

  6. mysql 基本语法

    ################################################################# #author: 陈月白 #_blogs: http://www.c ...

  7. java 的equals 与== ,null与isempty的区别

    1 . == 是为了判断等号两边 变量 所对应 的 内存中的 值  是否  相等, 只是 值 的比较. 2. 假如    String s1 = new String("abc") ...

  8. 学习日记之工厂方法模式和Effective C++

    简单工厂模式VS工厂方法模式: 简单工厂模式:最大长处在于工厂类中必须包括必要的逻辑推断,依据client选择条件动态实例化相关类,对于client来说,去除了与详细产品的依赖. 工厂方法模式(Fac ...

  9. Django配置session

    在settings.py文件里加入 #配置失效时间为半个小时 SESSION_COOKIE_AGE = 60*30 #关闭浏览器清除cookie SESSION_EXPIRE_AT_BROWSER_C ...

  10. Java泛型深入理解

    泛型的优点: 泛型的主要优点就是让编译器保留參数的类型信息,执行类型检查,执行类型转换(casting)操作,编译器保证了这些类型转换(casting)的绝对无误. /******* 不使用泛型类型 ...