【大话算法导论】从SAT规约到3SAT
今天看了网上很多SAT问题规约到3SAT,虽然写的不错,但是过于理论。其实我看到已知半解。
后来无意中发现一个解释这个规约,简单易懂,特此记录。
定义:
首先给出一个比较直观的定义:
假设现在有这么个问题:过年了,正打算烧年夜饭,家里每个人都可以说说自己想吃啥不想吃啥。小C说他要吃牛肉、不吃香菇、不吃内脏,小D说他要吃内脏、吃蔬菜、不吃牛肉。但毕竟众口难调、不一定所有愿望都能实现。因而只要每个人有一个愿望实现,这顿年夜饭就算非常成功了。所以现在问题来了,有没有一桌年夜饭可以让所有人都至少有一个愿望被实现呢?
这就是个很典型的SAT问题
所谓子句(Clause)就是每个人的愿望清单,比如小c说他要吃牛肉、不吃香菇、不吃内脏,“要吃牛肉、不吃香菇、不吃内脏” 就是一个子句。
所谓文字(Literal)就是一个愿望,比如“要吃牛肉”,“不吃香菇”都是所谓的文字。
所谓命题变元(Variable)就是指这个菜会不会出现在餐桌上。
3-CNF formula
包含一堆子句(Clause),这一堆子句每个都包含3个文字(Literal),每个literal表示命题变元集中一个布尔变量(Variable)或它的否定形式3-SAT问题就是判定 一个 3-CNF formula 是不是被满足。
3-CNF formula 被满足 当且仅当 每个 clause 都被满足
clause 被满足 当且仅当 clause中至少有一个literal被满足
literal被满足 当且仅当这个literal所指向的Variable能使得这个literal为TRUE
所以3-SAT formula的自变量就是literal里面出现的这些variable。
3-SAT问题就是问你能不能给这些变量赋上合适的值使得这个formula被满足。
此时,我们再来看下面理论表达,
X就是fomular,C就是clause, C 1 , . . . , C m C_1,...,C_m C1,...,Cm就是Literal, z 1 , . . . , z k z_1,...,z_k z1,...,zk就是Variable。
这样实例话后,问题就很容易明白了。
先陈述下问题,把文字 C i C_i Ci转化为变量 z , y z,y z,y表示的 C i ′ C_{i}^{'} Ci′。
然后陈述SAT和3SAT的关系:
C i ′ C_{i}^{'} Ci′的证明说明了SAT和3SAT都有解。即A可规约到B。
一些性质:
对于之前的那个年夜饭问题,如果发现餐桌上有牛肉那么小C的第一个愿望就被满足了而同时小D的第三个愿望没被满足,如果发现餐桌上有内脏,那么小C的第三个愿望就没被满足,与此同时小D的第一个愿望就被满足了。所以其实一个variable的变化可能会影响到好几个literal,从而影响好几个clause是否被满足。而同时一个clause也可以被其中任意一个literal所影响,也就是说有不止一个variable可以影响到一个clause。
【大话算法导论】从SAT规约到3SAT相关推荐
- SAT规约到3SAT
SAT规约到3SAT 一.SAT.3SAT问题描述 SAT问题描述: 给定一个又穷的布尔变量集合 X={x1,x2,⋯,xn},|X|=n X = { x 1 , x 2 , ⋯ , x n } , ...
- 算法导论吃透后的水平_初学算法,你应该这么玩
很多前端童鞋对算法都有莫名的恐惧,究其原因无非两点:其一,对算法不了解:其二,没有找到实际应用场景. 一.为什么学习算法? 这是个很有意思的问题,对算法感兴趣的人,不需要问为什么,算法对他们可能是一种 ...
- 算法导论Java实现-构建MaxHeap
package lhz.algorithm.chapter.six; /** * "构建堆",<算法导论>6.3章节 Building a heap * 利用之前实现的 ...
- 算法导论读书笔记-第十九章-斐波那契堆
算法导论第19章--斐波那契堆 可合并(最小)堆(mergeable min-heap) : 支持以下5种操作的一种数据结构, 其中每一个元素都有一个关键字: MAKE-HEAP(): 创建和返回一个 ...
- 《算法导论》读书笔记--第三章 函数的增长
好长时间了,继续算法导论. 当输入规模足够大时,并不计算精确的运行时间,倍增常量和低阶项被舍去.我们要研究的是算法的渐近效率,即在输入规模无限量时,在极限中,算法的运行时间如何随着输入规模的变大而增加 ...
- 《算法导论》中parallel for 的时间复杂度
最近在看<算法导论>,看到多线程算法这章中,有一个parallel for循环的例子,如下: parallel for i = 1 to n parallel for j = ...
- 算法导论中求解时间复杂度的三种方法
这一章讲的是递归式(recurrence),递归式是一组等式或不等式,它所描述的函数是用在更小的输入下该函数的值来定义的. 本章讲了三种方法来解递归式,分别是代换法,递归树方法,主方法. 1.代换法( ...
- 算法导论Java实现-随机化数组的两种方式(5.3章节)
package lhz.algorithm.chapter.five; /** * 随机数组两种实现,<算法导论>第五章第三节 * 本文地址:http://mushiqianmeng.bl ...
- 《算法导论》读书笔记(七)
<算法导论>读书笔记之第16章 贪心算法-活动选择问题 前言:贪心算法也是用来解决最优化问题,将一个问题分成子问题,在现在子问题最优解的时,选择当前看起来是最优的解,期望通过所做的局部最优 ...
最新文章
- 一个从四秒到10毫秒,花了1年的算法问题?
- python中噪音是什么意思_Python数据噪音
- eclipse设置文档注释的格式
- django连接redis 集群(安装redis的相关包的时候亲测)
- Python 程序员经常犯的 10 个错误
- 硬件nat关闭还是开启_超能课堂(173):AfterBurner不止超频,还是绝佳的游戏伴侣...
- 帮助中心 开源_如何不获得开源帮助
- go kegg_对miRNA进行go和kegg等功能数据库数据库注释
- 并发环境下的缓存容器性能优化(上):不可变的哈希表
- Windows Server 2012 Backup安装
- 使用Maven构建Eova项目
- 读《白帽子讲Web安全》有感
- 一次完整的http请求过程是怎样的?
- 用几何语言表示线段ab的中点c,七年级上册数学第四章教案
- Flutter调用JSON序列化出现type ‘String‘ is not a subtype of type ‘MapString, dynamic‘
- 概率论基础(3)一维随机变量(离散型和连续型)
- 依图科技发布语音开放平台,联袂微软、华为撬动语音市场
- c 实现走迷宫流程图_[求助]:迷宫问题 流程图
- Canvas画各种线
- input框输入身份证时实现动态脱敏