数字电路:奎因-麦克拉斯基算法
在之前,我们使用卡诺图来找到一个系统的布尔表达式,但这只适用于变量较少的情况,如果遇见大量的变量,使用卡诺图化简的方式就会变得非常复杂,之前从四个变量升到五个变量就使得卡诺图多了整整一层,难以想象继续下去会是多么庞大的工作量
奎因麦克劳斯基法(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
在合并时,我们可以通过一些技巧来减少不必要的比较,方法如下:
- 只有相邻的两个组需要比较,如果组不相邻,那么他们一定不可能合并,比如组0就只需要和组1比较,组1只需要和组0和组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
数字电路:奎因-麦克拉斯基算法相关推荐
- 数字电路:奎因·麦克拉斯基(Quine-McCluskey method)算法的Python实现
感谢@xbaiseng提出了代码中存在的bug,笔者对有bug部分进行了修改. 对于四个变量及以下的组合电路最小化,我们一般采用卡诺图的方式(K-Map)进行化简.但对于四个变量以上的电路(或逻辑表达 ...
- python:实现奎因-麦克拉斯基算法(附完整源码)
python:实现奎因-麦克拉斯基算法 from __future__ import annotationsfrom collections.abc import Sequencedef compar ...
- 奎因莫克拉斯基方法_超越源代码奎因和自我复制
奎因莫克拉斯基方法 The "Beyond the Source Code" series of posts will explore source code beyond its ...
- 十五、奎恩-麦克拉斯基化简法(Q-M法)
目录 1.将逻辑表达式以最小项和的形式写出 2.将代码按包含1的个数进行分组 放入最左边的表格中 3.合并上下相邻框框中的代码 4.选择最少的乘积项 晶体管级数字电路设计专栏目录_LD
- Python:实现chudnovsky algorithm楚德诺夫斯基算法(附完整源码)
Python:实现chudnovsky algorithm楚德诺夫斯基算法 from decimal import Decimal, getcontext from math import ceil, ...
- 小a与星际探索 线性基算法
链接:https://ac.nowcoder.com/acm/contest/317/C 来源:牛客网 题目描述 小a正在玩一款星际探索游戏,小a需要驾驶着飞船从1号星球出发前往n号星球.其中每个星球 ...
- HDU3949(线性基算法模版)
题意:给出N个数,再给出q次查询,每一次的查询在N个数中的值进行异或后第k小的值是多少! 这个线性基我也今天刚学,也只是在套模版,有些地方感觉有点难理解! #include<iostream&g ...
- 2017年大计基算法题 题解
[NOJ 2010]数因子 签到题,考虑数据范围达到10910^9,即思考O(1)O(1)时间内的解法. 具体有 ans={2 (l≠r)l (l==r) ans=\left\{ \begin{arr ...
- python算法完整教程专栏完整目录
python算法完整教程专栏完整目录 专栏说明如下 专栏目录 专栏说明如下 内容:python算法完整教程 数量:692篇博文(2023年2月15日截止) 更新时间至:2023年2月15日(后续加上去 ...
最新文章
- 如何用Python画一棵漂亮的树
- python 解析XML xml.dom
- android 上键,在Android键盘上设置Return键
- 经典博文--各系列文章
- linux启动mysql_【数据库】MySQL数据库入门学习
- Android之用jadx进行反编译
- C# Winform使用Windows Media Player播放多媒体整理
- shell简单的交互式脚本
- Maven项目中使用本地JAR包
- 局域网访问提示无法访问检查拼写_关于海康视频监控异地访问设置一些细节的说明...
- 从零开始学ArcGIS Server(三)--如何创建一个个人地理数据库ArcSDE Personal geodatabase...
- 科学道德与学风-2021雨课堂答案-第1章
- SWA(随机权重平均)
- maya要学python吗_Maya入门为什么会这么难?
- Spring实战学习笔记整理(4)-AOP(面向切面编程)
- Android SDK 字段及功能的分析详解
- HDU-1556题解
- 最后冲刺—信息系统开发与管理
- c语言中switch0,C语言switch0.ppt
- 人脸识别有趣应用3——抠出人脸并给人脸涂上戏剧脸谱