[英]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)
它可用于在 Θ(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.