今天看了网上很多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相关推荐

  1. SAT规约到3SAT

    SAT规约到3SAT 一.SAT.3SAT问题描述 SAT问题描述: 给定一个又穷的布尔变量集合 X={x1,x2,⋯,xn},|X|=n X = { x 1 , x 2 , ⋯ , x n } , ...

  2. 算法导论吃透后的水平_初学算法,你应该这么玩

    很多前端童鞋对算法都有莫名的恐惧,究其原因无非两点:其一,对算法不了解:其二,没有找到实际应用场景. 一.为什么学习算法? 这是个很有意思的问题,对算法感兴趣的人,不需要问为什么,算法对他们可能是一种 ...

  3. 算法导论Java实现-构建MaxHeap

    package lhz.algorithm.chapter.six; /** * "构建堆",<算法导论>6.3章节 Building a heap * 利用之前实现的 ...

  4. 算法导论读书笔记-第十九章-斐波那契堆

    算法导论第19章--斐波那契堆 可合并(最小)堆(mergeable min-heap) : 支持以下5种操作的一种数据结构, 其中每一个元素都有一个关键字: MAKE-HEAP(): 创建和返回一个 ...

  5. 《算法导论》读书笔记--第三章 函数的增长

    好长时间了,继续算法导论. 当输入规模足够大时,并不计算精确的运行时间,倍增常量和低阶项被舍去.我们要研究的是算法的渐近效率,即在输入规模无限量时,在极限中,算法的运行时间如何随着输入规模的变大而增加 ...

  6. 《算法导论》中parallel for 的时间复杂度

    最近在看<算法导论>,看到多线程算法这章中,有一个parallel for循环的例子,如下: parallel for i = 1 to n        parallel for j = ...

  7. 算法导论中求解时间复杂度的三种方法

    这一章讲的是递归式(recurrence),递归式是一组等式或不等式,它所描述的函数是用在更小的输入下该函数的值来定义的. 本章讲了三种方法来解递归式,分别是代换法,递归树方法,主方法. 1.代换法( ...

  8. 算法导论Java实现-随机化数组的两种方式(5.3章节)

    package lhz.algorithm.chapter.five; /** * 随机数组两种实现,<算法导论>第五章第三节 * 本文地址:http://mushiqianmeng.bl ...

  9. 《算法导论》读书笔记(七)

    <算法导论>读书笔记之第16章 贪心算法-活动选择问题 前言:贪心算法也是用来解决最优化问题,将一个问题分成子问题,在现在子问题最优解的时,选择当前看起来是最优的解,期望通过所做的局部最优 ...

最新文章

  1. 一个从四秒到10毫秒,花了1年的算法问题?
  2. python中噪音是什么意思_Python数据噪音
  3. eclipse设置文档注释的格式
  4. django连接redis 集群(安装redis的相关包的时候亲测)
  5. Python 程序员经常犯的 10 个错误
  6. 硬件nat关闭还是开启_超能课堂(173):AfterBurner不止超频,还是绝佳的游戏伴侣...
  7. 帮助中心 开源_如何不获得开源帮助
  8. go kegg_对miRNA进行go和kegg等功能数据库数据库注释
  9. 并发环境下的缓存容器性能优化(上):不可变的哈希表
  10. Windows Server 2012 Backup安装
  11. 使用Maven构建Eova项目
  12. 读《白帽子讲Web安全》有感
  13. 一次完整的http请求过程是怎样的?
  14. 用几何语言表示线段ab的中点c,七年级上册数学第四章教案
  15. Flutter调用JSON序列化出现type ‘String‘ is not a subtype of type ‘MapString, dynamic‘
  16. 概率论基础(3)一维随机变量(离散型和连续型)
  17. 依图科技发布语音开放平台,联袂微软、华为撬动语音市场
  18. c 实现走迷宫流程图_[求助]:迷宫问题 流程图
  19. Canvas画各种线
  20. input框输入身份证时实现动态脱敏

热门文章

  1. java将map转json字符串
  2. 王者荣耀java实现_从王者荣耀看设计模式-策略模式(java版)
  3. springboot校园餐厅点餐订餐选座系统
  4. Java素数求和(1~100)
  5. 网络基础知识(二) HTTP
  6. Mac 终端传输到剪切板
  7. Windows10安装Ubuntu桌面子系统WSL2
  8. html阅读是什么,阅读.html
  9. 你的职场身价值几何?
  10. 渗透测试实战 - 外网渗透内网穿透(超详细)