Algorithm 如何有效地实现二进制决策图(BDD)?
关于二进制决策图的背景可以在这里找到 最简单的方法是构建BDT(二叉决策树),然后根据两条规则对其进行缩减:Algorithm 如何有效地实现二进制决策图(BDD)?,algorithm,data-structures,implementation,boolean-logic,binary-decision-diagram,Algorithm,Data Structures,Implementation,Boolean Logic,Binary Decision Diagram,关于二进制决策图的背景可以在这里找到 最简单的方法是构建BDT(二叉决策树),然后根据两条规则对其进行缩减: -合并任何同构子图。 -消除两个子节点同构的任何节点。 但与BDD相比,BDT有一个很大的问题。有没有办法在不首先构建BDT的情况下构建BDD?使用第16-17页中的Mk(生成节点)和build(构建BDD)算法。我已经有一段时间没有使用BDD了,但我相信H或t应该是一个哈希表。为了安全起见,对两者都使用哈希表。构建BDD的方法是从表示要构建的布尔函数的表达式的解析树开始 也就是说,如果
-合并任何同构子图。
-消除两个子节点同构的任何节点。
但与BDD相比,BDT有一个很大的问题。有没有办法在不首先构建BDT的情况下构建BDD?使用第16-17页中的
Mk
(生成节点)和build
(构建BDD)算法。我已经有一段时间没有使用BDD了,但我相信H或t应该是一个哈希表。为了安全起见,对两者都使用哈希表。构建BDD的方法是从表示要构建的布尔函数的表达式的解析树开始
也就是说,如果您想要(A+B)。(C+D)的BDD,您首先将(A+B)。(C+D)解析到树中:
.
/ \
+ +
/ \ / \
A B C D
.
/ \
+ +
/ \ / \
A、B、C、D
然后递归地构建BDD——您需要能够形成两个BDD的AND和OR以及基本情况(单变量BDD)的方法
这同样适用于逻辑电路(以解析DAG而不是树的形式查看)
BDD上的这些注释解释了如何实现AND和OR,以及使事情高效运行所需的哈希表:如果您想正确地执行,请尝试阅读Knuth 更准确地说,该书第14页开头的算法“R”是对OP的精确而完整的回答
总的来说,Knuth的书中的章节是一个非常好的深度参考,碰巧他写了一篇关于(RO)BDD的文章,这对于任何认真尝试实现BDD的人来说都是非常幸运的。你永远不会构建非共享决策树。BDT只是解释bdd的一种方式。由于bdd的含义与bdd标记不同,我将删除该标记。可以找到各种语言的二进制决策图(~50)的现有实现列表。