np 元素位置_证明SAT的NP完全性(NP-completeness)
看懂本文需要提前有哪些知识?
- 知道什么是图灵机,非确定图灵机
- 知道什么是SAT问题
什么是NP问题?
首先我们要知道,NP一般都是针对决定性问题(Decision problem)的。比如今天我们要讨论的SAT问题,我们要知道一个布尔表达式能不能被满足,只有Yes和No两种情况。NP问题的定义有以下两种:
- 问题解能在多项式时间内被验证的问题
- 能被非确定图灵机在多项式时间内解决的问题
很容易证明这两个定义是等价的。由于我们没有详细定义什么是“验证”“解”,在这里不展开详细证明。粗略地说,如果我们有一个多项式时间的确定图灵机验证问题的解,那就可以构造出一个非确定图灵机去“猜”这个解,然后用那个机器去检验猜的对不对。如果我们有一个非确定图灵机解决这个问题,那么对于每一个(可能的)解,它只会有一个分支在跑(验证)这个解。所以我们只需要模拟这个非确定图灵机在确定的一个分支上的行为,就可以得到一个多项式时间的“验证机”。
对于SAT来说,如果有人告诉你一个布尔表达式是可以被满足的,然后他给出了一组解,你很容易能验证这组解是不是能满足这个布尔表达式。但如果有个人告诉你一个布尔表达式是不能被满足的,你就没有办法很容易地验证他说得对不对。如果定义coSAT为所有不能被满足的布尔表达式的集合,那么验证一个布尔表达式在不在coSAT里,这个问题就是coNP(且是coNP-complete)的。
证明SAT是NP-complete的
以下证明来自于Michael Sipser的《Introduction to the Theory of Computation》。个人认为是相当精彩的证明。所有名词的翻译来源于这本书的中文版或维基百科。
定义一个图灵机的格局(configuration)为图灵机当前的纸带上的字符串,图灵机的读写头的位置,以及图灵机当前所处的状态,这三个组成的集合。我们通常用
我们现在要证明所有NP问题都能在多项式时间内被转化到SAT问题。显然枚举所有NP问题是不现实的。我们从NP问题的定义出发。假设有一个NP问题,叫它
画面为一个
如图1。(暂时不要管window是什么)方便起见,我们让每个格局的第一个和最后一个字符都是#。第一行一定是起始格局(即包含其实状态和输入字符串,且读写头在最左端)。我们要求每一行都能从上一行的格局中合法地转移而来(根据转移函数)。如果其中有一行的格局是接受格局(即状态是接受状态
接受的。
别忘了我们的目标:将问题A转化成SAT问题。也就是说,对于一个
我们首先定义
单元,并用
我们将要构造的布尔表达式
这个表达式的意思是,对于每个单元,都至少有一个字符
其中
合法。合法的意思就是窗口的第一行可以合法地转移到第二行。(书里也没有讲“合法”的详细定义,但这不影响我们的证明。要详细定义“合法”太麻烦了,意义不大)
举个例子:假设a, b, c是纸带字母表中的字符,
- 写下c,进入状态
,读写头左移
- 写下a,进入状态
,读写头右移
那么图2里的窗口就全都是合法的窗口。
图3里的都是非法的窗口。
(关于这些窗口为什么合法或者非法,应该很好懂,所以我这就不做解释了。如果有疑问可以在评论区提问)
Claim:如果画面中每个这样的2x3的窗口都是合法的,那么每一行的格局都是从上一行的格局合法转移来的。
证明:对于上一行的格局来说,如果一个字符不与状态字符相邻,那它就不应该变。我们考虑当这个字符处在我们2x3的窗口的第一行正中间时,这是它不管怎么变都是不合法的(参考图2(d),图3(a))。这里我们在最开始和最后加的#号就有了作用,因为有了它们才能保证每个字符都可以在窗口正中间。现在我们考虑第一行正中间是一个状态字符的情况。根据转移函数,我们很容易就能判断出一个窗口是否合法(参考图2(b),图3(b)(c)),且只要这个窗口合法,这个格局的转移部分就是合法的。合法的转移部分+其他字符都不变,保证了格局的转移合法。
现在我们要构造
其中
目前为止,我们已经构造出了
后记
到这里我们就完成了SAT的NP完全性的证明。其实定理的证明并不复杂,难点在于
既然都看完了,点个赞再走吧~
参考文献
[1] Sipser, Michael. Introduction to the Theory of Computation (3rd edition). 2015.
np 元素位置_证明SAT的NP完全性(NP-completeness)相关推荐
- python如何在列表中查找元素位置_查找元素在list中的位置以及折半查询
问题 查找某个值在list中的位置 解决思路 能够用折半查询的方法解决此问题. 解决(Python) #! /usr/bin/env python #coding:utf-8 #折半查找某个元素在li ...
- jquery交换数组元素位置_跟我一起学jQuery——第一集
<锋利的JQuery>第二版阅读笔记-第一章 jQuery对象和DOM对象 想学习jQuery,首先要学会区分jQuery对象和DOM对象.1)jQuery对象是用jQuery类库的选择器 ...
- java 数组元素位置_在Java中显示数组元素的位置
我试图显示数组中最大值的位置(索引)数.这是一个有100个随机数的数组.出于某种原因,输出在前几个数字后是正确的.在输出开始时,我总是得到错误的数字.这是我的代码; 谢谢 public static ...
- 【计算理论】计算复杂性 ( NP 完全问题 - 布尔可满足性问题 ★ | 布尔可满足性问题是 NP 完全问题证明思路 ) ★
文章目录 一.NP 完全问题 - 布尔可满足性问题 ★ 二.布尔可满足性问题是 NP 完全问题证明思路 一.NP 完全问题 - 布尔可满足性问题 ★ 布尔可满足性问题 ( Boolean Satisf ...
- vue 获取元素在浏览器的位置_前端开发JS获取页面元素的位置
1.网页的大小和浏览器窗口的大小 一张网页的全部面积,就是它的大小.通常情况下,网页的大小由内容和 document元素的clientHeight和clientWidth属性,就代表了网页的大小. f ...
- python np array归一化_浅谈利用numpy对矩阵进行归一化处理的方法
浅谈利用numpy对矩阵进行归一化处理的方法 本文不讲归一化原理,只介绍实现(事实上看了代码就会懂原理),代码如下: def Normalize(data): m = np.mean(data) mx ...
- 饼状图改变数据显示位置_这么用MatPlotLib视觉化呈现数据,你值得拥有
全文共6661字,预计学习时长20分钟或更长 图片来源:pexels.com/@divinetechygirl 在现代数字世界中,数据就像空气一样重要. 人们每天都会自觉或不自觉地消费和产生大量数据. ...
- python二维元素向量_详解python Numpy中求向量和矩阵的范数
在python Numpy中求向量和矩阵的范数实例 np.linalg.norm(求范数):linalg=linear(线性)+algebra(代数),norm则表示范数. 函数参数 x_norm=n ...
- 写出一段代码将链表中的两个节点位置互换位置_面试 leetcode 算法专题系列(二)—— 链表...
前言:只照着常考题去刷题确实是一种方法.但调研之后发现自己还是考虑不周,刷题刷的不应该是题,而是解题的思路和熟练程度.于是我决定重新组织一下刷题笔记的讲解顺序,不再以面试常考题来刷.而是以面试出题频率 ...
最新文章
- 小学三年级上册计算机计划书,小学三年级班主任工作计划书
- PAT甲级1019 General Palindromic Number:[C++题解]进制位、回文数、vector来做
- Windows消息:怎样使用RegisterWindowMessage注册消息
- a*算法流程图_如何从0开始,搭建A/B test平台产品?
- 计算机考试一级考试基础知识,全国计算机等级考试一级msoffice基础知识
- java:数字转string 报空指针_超干货详解:kotlin(4) java转kotlin潜规则
- mysql报错Attempted to open a previously opened tablespace的解决办法
- 【高并发】JUC中原子类介绍
- 开源3问:95%的技术人都不知道的开源真相
- 【hadoop】19.MapReduce-手机流量统计
- MYSQL锁机制---MyISAM表锁
- Android OpenGL加入光照和材料属性
- 一张图了解大牛直播SDK 1
- linux下中文字库,Linux下中文乱码及中文字体缺失问题的解决
- 迅为4412开发平台Zigbee模块在物联网智能家居中的应用
- 以网易云为例,使用审查元素(开发者选项)获取音乐资源
- 微型计算机联想c325,寓教于乐一体机 联想IdeaCentre B325评测
- 奥密克戎“后遗症”,比病毒更可怕
- catalog英文翻译_Catalog.是什么意思
- 年三十 放鞭炮 驱年兽 迎新春 财运到 兔年大吉