【发布时间】:2014-07-06 09:05:49
【问题描述】:
我正在尝试实现一个非常快速的布尔表达式引擎。我用它来表示非常大的状态空间中的状态,所以我需要它每秒处理尽可能多的操作。该引擎的基础是产品的总和。我遇到了优化 NOT 运算符的问题。例如,如果我有一个包含 N 个最小项的产品总和,其中每个最小项都有大约 M 个变量,那么尝试将其反转将创建 M^N 个最小项,然后使用 espresso 算法对其进行简化。如果我在反向操作期间间歇性地运行 espresso 算法,我可以加快一点速度并节省一些内存,但这还不够。我怀疑我是第一个遇到这个问题的人,我已经尝试过进行研究,但我似乎找不到有效的方法来解决这个问题。
谁能指出我正确的方向?
【问题讨论】:
-
一般来说,你无法避免指数级爆炸。
-
不,布尔表达式本质上是指数的,但您可以一路减少它以尽量减少指数爆炸。据我所知,not 运算符有很多模式,这让我相信使用 espresso 就像使用从太空加速的 2 吨钨棒来敲钉子
-
不,你不能总是减少它。试试
(x1&y1)|(x2&y2)|...|(xn&yn)。否定后,它的长度为 2^n。 -
如果您有
n变量,那么在您使用n变量编写的任何函数的真值表中都有2^n条目。我很确定如果您限制自己仅以乘积和形式表达函数,那么总是需要乘积总和形式具有2^n最小条款。 但是,如果您不将自己限制在乘积之和的形式呢?也许这会带来更好的选择。 -
是的,这是最坏的情况。但是一般情况呢?平均而言,如果您有 M 个变量和 N 个最小项,则最终结果不会有 M^N 个最小项,因为许多最小项将具有公共变量。如果您可以在操作期间有效地利用这一点,而不是等到最后,您的平均情况可能不会呈指数增长
标签: algorithm boolean-logic inverse