繁体   English   中英

扩展表达式树评估算法

[英]Extending a expression tree evaluation algorithm

这是我想出的递归算法。 我在书中看到了与此类似的算法示例。

f(n)
  if n is an integer
    return n
  else
    l = left child of n
    r = right child of n
    return f(l) n f(r)

1]

它可用于在 Θ(n) 时间内评估上图中左侧所示的表达式树。 只要这一切都是正确的,我想扩展它来评估像右边那样的表达式树,其中常见的子表达式被重复数据删除。 我认为该算法可以正确评估这些类型的树,但我不确定它需要多长时间。 也许应该使用一些存储子树的方法? 如:

f(n, A)
  if n is an integer
    return node
  else
    if n has more than 1 parent AND n is in A (A is a list of stored subtrees)
       return n from A
    else
      l = left child of n
      r = right child of n
      s = f(l, A) n f(r, A)
      add s to list A
      return s

这个扩展正确吗? 看起来真的很乱。 此外,我感觉它会在 O(n 2 ) 时间内运行,因为 function 将在 n 个节点上被调用,并且在每次调用期间,它必须遍历一个上限为 n 的存储节点列表。 这可以在比二次时间更好的时间内完成吗?

如果您在第一次访问时将子图评估的结果存储在操作员节点上,则处理 DAG 应该可以正常工作。 对该节点的任何后续访问都不会触发递归调用来评估子表达式,而只会返回存储的值。 该技术称为“记忆化”。 运行时间基本上是图中的边数,假设所有操作员评估都是O(1)

伪代码:

f(n)
  if n is an integer
    return n
  else
    if property evalResult of n is defined
       return property evalResult of n
    else
      l = left successor of n
      r = right successor of n
      s = f(l) n f(r)
      set property evalResult of n to s
      return s

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM