【问题标题】:Can a conjunctive/disjunctive normal form be represented in a binary tree?可以用二叉树表示合取/析取范式吗?
【发布时间】:2015-05-21 20:58:36
【问题描述】:

我可以找到这个相关的问题 Distributing AND over OR in a binary tree (Conjunctive Normal Form)

我不太确定这个表达式的 CNF 二叉树表示会产生什么结果。 A&B&C

AND
|- A
|- AND
   |-B
   |-C

这是对的吗?我的基本问题是 CNF 二进制表示是否可以在树中有多个 AND 节点,而不仅仅是一个 AND 节点作为根。我的理解是,只要其父节点是 AND 节点,我们就可以有非根 AND 节点。

相关的问题是?这种表示是最优的吗?或者用只有一个根 AND 节点的 n-nary 树来表示它们是有益的?我在这里寻找的最优性是构建和遍历树。

// 根据评论进行编辑。 为简单起见,假设 not (~) 运算符是叶节点 A、B 或 C 的一部分。这意味着您需要担心 ~ 运算符是非叶节点的一部分,当扩展为时可能会更改树结构根据德摩根定律。

【问题讨论】:

  • 这取决于你想对树做什么。二叉树对搜索树有意义,因为在每个节点上,您的键要么小于(向左递归)、等于(停止)或大于(向右递归)当前节点中的键。这使得最容易实现的树成为可能,但其他类型的搜索树(例如 B 树)使用更高程度的分支来优化缓存使用等内容。在这里,CNF 似乎没有任何固有的“二进制”,所以我会使用 n-ary 树,除非它会导致明显的问题。
  • @Adi GuN CNF/DNF 不能用二叉树表示,因为它包括Not,它是一元运算符。除此之外,任何由二元运算符组成的表达式——包括但不限于CNF/DNF——可以通过二叉树来表达。这是运算符的数量问题,根本不是形式的问题。
  • @AmiTavory 我已经更新了描述。为简单起见,尚未深入到叶节点。
  • @Ami CNF/DNF 可以表示为二元决策图,因为 BDD 可以转发 0 和 1。
  • @Alex Kemper 这可能是真的,但问题似乎是关于具有运算符内部节点的表达式树,而不是 BDD(其中变量也可以是内部节点)。

标签: algorithm recursion binary-tree automata conjunctive-normal-form


【解决方案1】:

至少BDD 用于您的合相:

BDD 是使用此online tool 创建的。

对于具有三个输入的简单AND,没有什么可优化的。 BDD 节点构建一个链。

【讨论】:

  • 虽然这很有趣,但我真的很希望运算符能够流过树。
  • 可以将 BDD 视为 2 对 1 多路复用器树。
猜你喜欢
  • 1970-01-01
  • 2011-09-08
  • 2013-06-18
  • 1970-01-01
  • 1970-01-01
  • 2016-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多