Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何有效地实现二进制决策图(BDD)?_Algorithm_Data Structures_Implementation_Boolean Logic_Binary Decision Diagram - Fatal编程技术网

Algorithm 如何有效地实现二进制决策图(BDD)?

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的方法是从表示要构建的布尔函数的表达式的解析树开始 也就是说,如果

关于二进制决策图的背景可以在这里找到

最简单的方法是构建BDT(二叉决策树),然后根据两条规则对其进行缩减:
-合并任何同构子图。
-消除两个子节点同构的任何节点。

但与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)的现有实现列表。