在之前,我们使用卡诺图来找到一个系统的布尔表达式,但这只适用于变量较少的情况,如果遇见大量的变量,使用卡诺图化简的方式就会变得非常复杂,之前从四个变量升到五个变量就使得卡诺图多了整整一层,难以想象继续下去会是多么庞大的工作量

奎因麦克劳斯基法(Quine-McCluskey method)就是用于简化大量变量的一种手段,因为用的并非图表,这也是相对来说比较适合计算机编程的方式,接下来,我们将逐步介绍这种方法的应用流程

文章目录

  • 1. 找到所有的一次蕴含项
  • 2. 一次合并
  • 3. 二次合并
  • 4. 素项表

1. 找到所有的一次蕴含项

假设我们现在有一个系统:

根据蕴含项中“1”的数量将其分组,这样可以避免不必要的比较,它的所有一次蕴含项就可以表示为:

2. 一次合并

得到一次蕴含项后,我们需要尽可能将他们合并,如果两个项有三个位置是相同的,就可以合并成一个项,不同的位置用“-”代替
举个例子,group 0 中的 0000 与 group 1 中的 0001 只有最后一个位置不一样,那么他们就可以合并为 000-
这种合并理论的表达式为: X Y + X Y ′ = X XY+XY'=X XY+XY′=X

在合并时,我们可以通过一些技巧来减少不必要的比较,方法如下:

  1. 只有相邻的两个组需要比较,如果组不相邻,那么他们一定不可能合并,比如组0就只需要和组1比较,组1只需要和组0和组2比较
  2. 同一个组内的项不用比较,他们也一定不可能合并

将所有可能的合并完成后,把得到的合并项仍旧按照“1”的数量分组并列出来,结果如下:

如果有无法与任何其它项合并的项,它就是质蕴含项,会出现在最终表达式中

3. 二次合并

接着,我们需要进一步合并刚才得到的含一个“-”的项

如果某两个项“-”的位置一样,且只有一个变量不同,就可以合并成一个项,不同的变量用"-"代替,最终结果含有两个“-”
举个例子,000- 与 100- 中“-”的位置一样,且只有第一个变量不同,他们就可以合并为 -00-

合并的技巧与一次合并相同

完成所有可能的合并后,将内容重复的项删掉,按照“1”的数量分组,得到结果如下:

这种合并可以一直持续下去,直到没有任何项可以被合并为止,这时我们就得到了所有质蕴含项
对于四个变量的系统,目前的结果就无法继续合并了,但变量越多,合并的步骤就可能越多
这对于人来说可能仍然繁琐,但对于计算机编程来说,实现奎因麦克劳斯基算法比卡诺图要简单得多

最后,我们将所有得到的质蕴含项写成表达式:

现在,我们可以试着将奎因算法与卡诺图联系起来
奎因算法实质上就是先找出卡诺图中所有一次蕴含项,然后将所有相邻的一次蕴含项合并成二次蕴含项,再将相邻的二次蕴含项合并成四次蕴含项,以此类推

这种方法其实有一个问题,那就是最终得出的项的数量不一定是最小的,对应成卡诺图,就是说画出的圈的数量不一定最小
这个问题就要交给素项表解决

4. 素项表

首先,将之前得到的所有质蕴含项列成一列,然后将项中包含的所有可能的值写在上方
接着,在质蕴含项和值的对应处画X,画完后,如果某个X是一列中唯一的X,则圈出来,如图:

这个被圈出来的X就是实质本源蕴含项(essential prime implicant),它必须被包含在最终的SOP中

下面,可以试着在被圈出来的X处画一条横线,将其所在行的X都串上,再以每个被串上的X为出发点,连接同一列内的X,成果如下:

最后,尽量用最少的线连接剩下的几个X,最终成品如下:

将横线代表的表达式写出来,就是最小SOP了,图中所代表的最小SOP为

针对don’t cares,可以直接将其作为普通的项来对待,即

对应的算法为:

但要注意的是,最后画线的时候,不要将don’t cares对应的数字写在上方,如下图:

可以看到,上方并没有列出1,10,15

数字电路:奎因-麦克拉斯基算法相关推荐

  1. 数字电路:奎因·麦克拉斯基(Quine-McCluskey method)算法的Python实现

    感谢@xbaiseng提出了代码中存在的bug,笔者对有bug部分进行了修改. 对于四个变量及以下的组合电路最小化,我们一般采用卡诺图的方式(K-Map)进行化简.但对于四个变量以上的电路(或逻辑表达 ...

  2. python:实现奎因-麦克拉斯基算法(附完整源码)

    python:实现奎因-麦克拉斯基算法 from __future__ import annotationsfrom collections.abc import Sequencedef compar ...

  3. 奎因莫克拉斯基方法_超越源代码奎因和自我复制

    奎因莫克拉斯基方法 The "Beyond the Source Code" series of posts will explore source code beyond its ...

  4. 十五、奎恩-麦克拉斯基化简法(Q-M法)

    目录 1.将逻辑表达式以最小项和的形式写出 2.将代码按包含1的个数进行分组 放入最左边的表格中 3.合并上下相邻框框中的代码 4.选择最少的乘积项 晶体管级数字电路设计专栏目录_LD

  5. Python:实现chudnovsky algorithm楚德诺夫斯基算法(附完整源码)

    Python:实现chudnovsky algorithm楚德诺夫斯基算法 from decimal import Decimal, getcontext from math import ceil, ...

  6. 小a与星际探索 线性基算法

    链接:https://ac.nowcoder.com/acm/contest/317/C 来源:牛客网 题目描述 小a正在玩一款星际探索游戏,小a需要驾驶着飞船从1号星球出发前往n号星球.其中每个星球 ...

  7. HDU3949(线性基算法模版)

    题意:给出N个数,再给出q次查询,每一次的查询在N个数中的值进行异或后第k小的值是多少! 这个线性基我也今天刚学,也只是在套模版,有些地方感觉有点难理解! #include<iostream&g ...

  8. 2017年大计基算法题 题解

    [NOJ 2010]数因子 签到题,考虑数据范围达到10910^9,即思考O(1)O(1)时间内的解法. 具体有 ans={2 (l≠r)l (l==r) ans=\left\{ \begin{arr ...

  9. python算法完整教程专栏完整目录

    python算法完整教程专栏完整目录 专栏说明如下 专栏目录 专栏说明如下 内容:python算法完整教程 数量:692篇博文(2023年2月15日截止) 更新时间至:2023年2月15日(后续加上去 ...

最新文章

  1. 如何用Python画一棵漂亮的树
  2. python 解析XML xml.dom
  3. android 上键,在Android键盘上设置Return键
  4. 经典博文--各系列文章
  5. linux启动mysql_【数据库】MySQL数据库入门学习
  6. Android之用jadx进行反编译
  7. C# Winform使用Windows Media Player播放多媒体整理
  8. shell简单的交互式脚本
  9. Maven项目中使用本地JAR包
  10. 局域网访问提示无法访问检查拼写_关于海康视频监控异地访问设置一些细节的说明...
  11. 从零开始学ArcGIS Server(三)--如何创建一个个人地理数据库ArcSDE Personal geodatabase...
  12. 科学道德与学风-2021雨课堂答案-第1章
  13. SWA(随机权重平均)
  14. maya要学python吗_Maya入门为什么会这么难?
  15. Spring实战学习笔记整理(4)-AOP(面向切面编程)
  16. Android SDK 字段及功能的分析详解
  17. HDU-1556题解
  18. 最后冲刺—信息系统开发与管理
  19. c语言中switch0,C语言switch0.ppt
  20. 人脸识别有趣应用3——抠出人脸并给人脸涂上戏剧脸谱

热门文章

  1. 尝尝世外陶源的农家饭
  2. [C语言]结构体进阶与枚举联合
  3. 面试问题:如何模拟SQL Server死锁 (附视频和脚本)
  4. 新玺配资:三大指数联袂上攻 量能变化非常关键
  5. MATLAB 最新版试用的一些感受
  6. 产品经理/解决方案经理必看:管理营销类书籍推荐
  7. 自定义html 标签中的 title属性,感觉默认title 难看,强迫症专用
  8. 【Java语言】初级编程入门 2的n次方
  9. ROG枪神6Plus超竞版价格是多少 ROG枪神6Plus超竞版配置如何
  10. 计算机改变世界作文500字,改变自己改变世界作文500字