【问题标题】:Fast algorithm to invert a boolean sum of products快速算法来反转产品的布尔和
【发布时间】: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


【解决方案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

这使用了广义香农展开,递归地对展开的两侧进行补码,并使用简化启发式合并补码。

【讨论】:

    【解决方案2】:

    您可以在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,它会在O(n+1)中返回0

    你也可以把这个过程改成集合操作

    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
    

    【讨论】:

    • 你发布这个已经四年了,但我最近才回来。这看起来像是在建议我将反转结果保留为合取范式 (CNF)?假设该运算符是某个更大算法的一部分,将结果保存在 CNF 中只会将复杂性转移到必须连接 CNF 和 DNF 的布尔运算符。
    猜你喜欢
    • 2010-11-20
    • 2014-10-17
    • 1970-01-01
    • 1970-01-01
    • 2014-09-13
    • 2020-11-01
    • 1970-01-01
    • 2012-07-27
    • 1970-01-01
    相关资源
    最近更新 更多