快速算法反转产品的布尔总和

时间:2014-07-06 09:05:50

标签: algorithm boolean-logic inverse

我正在尝试实现一个非常快速的布尔表达式引擎。我用它来表示非常大的状态空间中的状态,所以我需要它来处理每秒尽可能多的操作。在这个引擎的基础上是一个产品的总和。我遇到了优化NOT运算符的问题。例如,如果我有一个N个minterms的产品总和,其中每个minterm有大约M个变量,那么尝试反转它将创建M ^ N minterms,然后使用espresso算法简化。如果我在反向操作期间间歇性地运行espresso算法,我可以加快一点速度并节省一些内存,但这还不够。我怀疑我是第一个遇到这个问题的人,我尝试过做研究,但我似乎无法找到一种有效的方法。

有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:1)

所以,距离我发布这个问题已经5年了。在最近重新发现它之后,我意识到自己犯了主要罪。从那时到现在,我找到了一个相当快的算法来完成此任务,却再也没有回答这个问题。问题是我丢失了所有关联的文档。哇...在这里。如果我重新发现源代码,我将更新此答案。

https://github.com/nbingham1/boolean/blob/a0f21eb1808dbcf86a3360ea85ab4eae15f5bf49/boolean/cover.cpp#L1055

编辑:找到了来源

用于PLA合成的多值逻辑最小化,作者:Richard L. Rudell,第58页

https://apps.dtic.mil/dtic/tr/fulltext/u2/a606736.pdf

此方法使用广义Shannon扩展,以递归方式对扩展的两侧进行补充,并通过简化的启发式方法将补语合并。

答案 1 :(得分:0)

您可以在O(n+m)

中进行制作
answer = ( x1 OR x2 OR .. xn ) AND ( y1 OR y2 OR .. ym )

但您可以优化流程,以确定最终答案是否不是1

answer = ( x1 OR x2 OR .. xn ) LOGICAL-AND ( y1 OR y2 OR .. ym )

LOGICAL-AND会检查当前值是否为0,它会在0

中返回O(n+1)

您也可以将此过程更改为设置操作

DEFINE X = { X1, X2, .. Xn }
DEFINE Y = { Y1, Y2, .. Ym }

ANSWER =  X ∈ 1  AND  Y ∈ 1

并像这样优化它

IF X ∈ 1
THEN RETURN Y ∈ 1
ELSE RETURN 0

平均而言,Time = i + j位于

i = position of left-most 1 in X
j = position of left-most 1 in Y 

最糟糕的情况O(n+m)

000..001, 000..000

000..001, 000..001