我正在尝试编写一段可以将布尔表达式的LENGTH降低到最小的代码,因此代码应该尽可能少地减少表达式中元素的数量。现在我被卡住了,我需要一些帮助= [
这是规则:布尔表达式中可以有任意数量的元素,但它只包含AND和OR运算符,以及括号。
例如,如果我传入一个布尔表达式:ABC + BCD + DE,最佳输出将是BC(A + D)+ DE,与原始值相比可节省2个单位空间,因为两个BC组合在一起合而为一。
我的逻辑是,我将尝试在表达式中找到最常出现的元素,并将其分解出来。然后我递归地调用函数来对因式表达式执行相同的操作,直到它完全被考虑。 但是,如何找到原始表达式中最常见的元素?也就是说,在上面的例子中,BC?看起来我必须尝试所有不同的元素组合,并找出每个组合出现在整个表达式中的次数。但这听起来真的很幼稚。 第二个
有人可以提示如何有效地做到这一点吗?即使是我可以在Google上搜索的一些关键字也可以。
答案 0 :(得分:5)
您正在寻找的是一种最小化布尔函数的方法。这是芯片设计界特别感兴趣的事情。用于您的目的的技术是Quine-McCluskey algorithm,或者您可以在评论中使用Li-aung Yip建议的Karnaugh Maps。
答案 1 :(得分:4)
对不起,我还没有读过所有这些很酷的算法,但是你问到了找到共同因素,所以我想到了以下几点:
import itertools
def commons(exprs):
groups = []
for n in range(2, len(exprs)+1):
for comb in itertools.combinations(exprs, n):
common = set.intersection(*map(set, comb))
if common:
groups.append(
(len(common), n, comb, ''.join(common)))
return sorted(groups, reverse=True)
>>> exprs
['ABC', 'BCD', 'DE', 'ABCE']
>>> commons(exprs)
[(3, 2, ('ABC', 'ABCE'), 'ACB'),
(2, 3, ('ABC', 'BCD', 'ABCE'), 'CB'),
(2, 2, ('BCD', 'ABCE'), 'CB'),
(2, 2, ('ABC', 'BCD'), 'CB'),
(1, 2, ('DE', 'ABCE'), 'E'),
(1, 2, ('BCD', 'DE'), 'D')]
该函数返回按以下内容排序的列表:
答案 2 :(得分:2)
使用Quine-McCluskey算法来最小化布尔表达式。它在功能上等同于卡诺图方法,但更适合在计算机上实现。
答案 3 :(得分:1)
答案 4 :(得分:1)
不幸的是,大多数给定的建议实际上可能不会给@turtlesoup他/她正在寻找什么。 @turtlesoup要求一种方法来最小化给定布尔表达式的字符数。大多数简化方法都没有将字符数作为简化的重点。当涉及电子设备的最小化时,用户通常需要最少数量的门(或部件)。对于"长度"这并不总是导致更短的表达。表达式 - 大部分时间都是如此,但并非总是如此。实际上,有时表达式在长度方面会变得更大,但从电子学的角度来看可能更简单(需要更少的门来构建)。
boolengine.com是我所知道的最好的简化工具,它涉及数字电路的布尔简化。它不允许数百个输入,但它允许14,这比大多数简化工具要多得多。
使用电子产品时,简化程序通常会将表达式细分为产品总和形式。所以表达式'(ab)+&#c; cd变为' c +' b +' a + d。 "简化"结果需要更多的字符作为表达式打印,但从电子学的角度来看更容易构建。它只需要一个4输入或门和3个逆变器(4个部分)。而原始表达式需要2个AND门,2个反相器和一个OR门(5个部分)。
将@ turtlesoup的例子给予BoolEngine后,它显示BC(A + D)+ DE变为E + D + ABC。这是一个较短的表达,通常是。但肯定并非总是如此。
答案 5 :(得分:0)
这是一个实现卡诺图的小程序:http://www-ihs.theoinf.tu-ilmenau.de/~sane/projekte/karnaugh/embed_karnaugh.html
您可以输入表达式或填写真值表。