Binary decision diagram (BDD) 二元决策图
在这个博客中我将通过自己的理解去带大家了解BDD,如果有错误,请各位批评指正。
- 布尔函数(Boolean function)描述如何基于对布尔输入的某种逻辑计算确定布尔值输出,它们在复杂性理论的问题和数字计算机的芯片设计中扮演基础角色。比如下面的逻辑电路
可以使用布尔函数:来表示。
这个函数有四个输入,一个输出。那么对应BDD就是四层的数,每个节点有0/1两个值。我们可以看到如果一个BDD不进行优化的话,那么它将是满二叉树。
就像上图所示
上图很简单,无非就是进行一次DFS就能爆搜出所有结果。
归约(Reduction)
通常,BDD通过对BDT归约而得到。归约由以下两条规则的应用组成,从决策树开始,一直到两条规则都不能应用为止。
1.如果两个节点是终端节点且具有相同的标签,或者是内部节点且具有相同的子节点,则将它们合并。
2.如果内部节点的 high 边和 low 边指向相同的子节点,则将该节点从图中删除,并将其父节点重定向到子节点。
具体请看博客
https://blog.csdn.net/Pawa1uoke/article/details/121181101
下面我将对博客中伪代码进行解释:
在这段代码中,我们看到这是一段递归代码,分别对两个子BDD进行递归,然后合成一个BDD树。为什么不合并成一个BDD树呢,因为时间,我们构建出布尔函数的两个子部分,以下面布尔函数为例一个是
另一个是。
将这个函数分解成两个不相互依赖的两部分,然后最后进行合并,从而达到并行。对两个子BDD进行合并,如果我们合并的是叶子节点,那么我们就能直接进行计算出它的值,如果我们递归到同一个节点,那么我们就分别将其左子节点和右子节点进行分别计算合并,如果不在同一层中,那么我们就等待其到同一层进行递归,对层相对较浅的向下寻找。