看懂本文需要提前有哪些知识?

  • 知道什么是图灵机,非确定图灵机
  • 知道什么是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)为图灵机当前的纸带上的字符串,图灵机的读写头的位置,以及图灵机当前所处的状态,这三个组成的集合。我们通常用

表示这个图灵机处于状态
,纸带上的内容是
,且读写头处于
的第一个字母。比如,
代表纸带当前的内容是
,图灵机当前处于状态
,且读写头位于第二个0处。

我们现在要证明所有NP问题都能在多项式时间内被转化到SAT问题。显然枚举所有NP问题是不现实的。我们从NP问题的定义出发。假设有一个NP问题,叫它

吧,那么一定有一个非确定图灵机
能在多项式时间内解决A。假设N会在
步内结束(实际上是
步,但这种细节没必要太在意)。定义一个图灵机的

画面为一个

的一个表格,每一行都是图灵机
的一个格局,且整个画面是
的一个分支的所有格局。
图1 画面

如图1。(暂时不要管window是什么)方便起见,我们让每个格局的第一个和最后一个字符都是#。第一行一定是起始格局(即包含其实状态和输入字符串,且读写头在最左端)。我们要求每一行都能从上一行的格局中合法地转移而来(根据转移函数)。如果其中有一行的格局是接受格局(即状态是接受状态

),那么我们就说这个画面是

接受的

别忘了我们的目标:将问题A转化成SAT问题。也就是说,对于一个

的输入
,我们要在多项式时间内构造出来一个布尔表达式
能接受
当且仅当
能被满足。

我们首先定义

中的变量。令
,其中
是 非确定图灵机
的状态的集合,
的纸带字母表。另外,我们称画面中的每个格子为一个

单元,并用

表示第
行第
列的字符,其中
。对于第
行第
列的元素每种可能的情况,我们都有一个变量
表示它。如果
,就代表着第
行第
列的字符是
,其中
。由于
的大小是一个常数,所以我们的字符集的大小仍然是在多项式范围内的。

我们将要构造的布尔表达式

是由四个小部分组成的,
。我们将会一一描述每个部分。

的构造
保证的是每个单元里有且仅有一个字符。它的构造如下:

这个表达式的意思是,对于每个单元,都至少有一个字符

是它的值,且不存在两个字符
同时是它的值。这样就保证了每个单元里有且仅有一个值。

的构造
保证了一个画面的第一行一定是起始格局。它的构造如下:

其中

即输入的第
个字符。看起来很复杂,其实说的就是第一行必须是起始格局(即纸带上只有输入字符串,后面都是空的,且图灵机处于起始状态,读写头在最开始)。

的构造
保证了画面一定是接受的。这一部分是最简单的,因为只要画面里出现了接受状态,就代表这个画面是接受的。所以它的构造如下:

的构造
的目的是保证画面中的每一行都能从前一行合法地转移来。这里我们要用到图1里提到过的窗口(window)。对于画面中每一个2x3大小地窗口,我们都需要检验它是否

合法。合法的意思就是窗口的第一行可以合法地转移到第二行。(书里也没有讲“合法”的详细定义,但这不影响我们的证明。要详细定义“合法”太麻烦了,意义不大)

举个例子:假设a, b, c是纸带字母表中的字符,

的两个状态。假设
状态时,读到了字符a,那么它会把a换成b(即写下b),读写头右移,并且仍保持在状态
;如果读到了字符b,它有两种选择(非确定地):
  • 写下c,进入状态

    ,读写头左移
  • 写下a,进入状态
    ,读写头右移

那么图2里的窗口就全都是合法的窗口。

图2 合法的窗口的例子

图3里的都是非法的窗口。

图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)相关推荐

  1. python如何在列表中查找元素位置_查找元素在list中的位置以及折半查询

    问题 查找某个值在list中的位置 解决思路 能够用折半查询的方法解决此问题. 解决(Python) #! /usr/bin/env python #coding:utf-8 #折半查找某个元素在li ...

  2. jquery交换数组元素位置_跟我一起学jQuery——第一集

    <锋利的JQuery>第二版阅读笔记-第一章 jQuery对象和DOM对象 想学习jQuery,首先要学会区分jQuery对象和DOM对象.1)jQuery对象是用jQuery类库的选择器 ...

  3. java 数组元素位置_在Java中显示数组元素的位置

    我试图显示数组中最大值的位置(索引)数.这是一个有100个随机数的数组.出于某种原因,输出在前几个数字后是正确的.在输出开始时,我总是得到错误的数字.这是我的代码; 谢谢 public static ...

  4. 【计算理论】计算复杂性 ( NP 完全问题 - 布尔可满足性问题 ★ | 布尔可满足性问题是 NP 完全问题证明思路 ) ★

    文章目录 一.NP 完全问题 - 布尔可满足性问题 ★ 二.布尔可满足性问题是 NP 完全问题证明思路 一.NP 完全问题 - 布尔可满足性问题 ★ 布尔可满足性问题 ( Boolean Satisf ...

  5. vue 获取元素在浏览器的位置_前端开发JS获取页面元素的位置

    1.网页的大小和浏览器窗口的大小 一张网页的全部面积,就是它的大小.通常情况下,网页的大小由内容和 document元素的clientHeight和clientWidth属性,就代表了网页的大小. f ...

  6. python np array归一化_浅谈利用numpy对矩阵进行归一化处理的方法

    浅谈利用numpy对矩阵进行归一化处理的方法 本文不讲归一化原理,只介绍实现(事实上看了代码就会懂原理),代码如下: def Normalize(data): m = np.mean(data) mx ...

  7. 饼状图改变数据显示位置_这么用MatPlotLib视觉化呈现数据,你值得拥有

    全文共6661字,预计学习时长20分钟或更长 图片来源:pexels.com/@divinetechygirl 在现代数字世界中,数据就像空气一样重要. 人们每天都会自觉或不自觉地消费和产生大量数据. ...

  8. python二维元素向量_详解python Numpy中求向量和矩阵的范数

    在python Numpy中求向量和矩阵的范数实例 np.linalg.norm(求范数):linalg=linear(线性)+algebra(代数),norm则表示范数. 函数参数 x_norm=n ...

  9. 写出一段代码将链表中的两个节点位置互换位置_面试 leetcode 算法专题系列(二)—— 链表...

    前言:只照着常考题去刷题确实是一种方法.但调研之后发现自己还是考虑不周,刷题刷的不应该是题,而是解题的思路和熟练程度.于是我决定重新组织一下刷题笔记的讲解顺序,不再以面试常考题来刷.而是以面试出题频率 ...

最新文章

  1. 小学三年级上册计算机计划书,小学三年级班主任工作计划书
  2. PAT甲级1019 General Palindromic Number:[C++题解]进制位、回文数、vector来做
  3. Windows消息:怎样使用RegisterWindowMessage注册消息
  4. a*算法流程图_如何从0开始,搭建A/B test平台产品?
  5. 计算机考试一级考试基础知识,全国计算机等级考试一级msoffice基础知识
  6. java:数字转string 报空指针_超干货详解:kotlin(4) java转kotlin潜规则
  7. mysql报错Attempted to open a previously opened tablespace的解决办法
  8. 【高并发】JUC中原子类介绍
  9. 开源3问:95%的技术人都不知道的开源真相
  10. 【hadoop】19.MapReduce-手机流量统计
  11. MYSQL锁机制---MyISAM表锁
  12. Android OpenGL加入光照和材料属性
  13. 一张图了解大牛直播SDK 1
  14. linux下中文字库,Linux下中文乱码及中文字体缺失问题的解决
  15. 迅为4412开发平台Zigbee模块在物联网智能家居中的应用
  16. 以网易云为例,使用审查元素(开发者选项)获取音乐资源
  17. 微型计算机联想c325,寓教于乐一体机 联想IdeaCentre B325评测
  18. 奥密克戎“后遗症”,比病毒更可怕
  19. catalog英文翻译_Catalog.是什么意思
  20. 年三十 放鞭炮 驱年兽 迎新春 财运到 兔年大吉

热门文章

  1. 第一章 接口自动化简述
  2. 微信小程序源代码分享:模仿面包旅行(微信小程序版)
  3. 第一次作业——游戏分类与热点探索
  4. 年度最精彩研究,CVPR 2017六篇最佳论文介绍(附打包下载)| CVPR 2017
  5. 从U8 cloud看用友怎么定义云ERP
  6. KMP算法详解(转自Matrix67大牛)
  7. 社交网站需管理 网络监控软件有备无患
  8. 软件测试面试题:接口产生的垃圾数据如何清理
  9. 关于音频播放的那点儿事儿(一) 初探iOS音频 CoreAudio Essentials
  10. 从业务分析到系统建模、研发 基本方法论