我正在尝试制作一个程序,它基本上使用OpenCL(并行使用不同的参数值)在GPU上以反向抛光表示法评估表达式。
我有表达式的AST,我需要将其转换为RPN,但由于我的二进制操作是可交换的,因此有多种方法可以做到这一点,我需要找到一个使用最小堆栈空间的方法。评价。
例如,我可以将数字1到4与1 2 + 3 + 4 +
(在任何时候只需要堆叠2个项目)或1 2 3 4 + + +
(需要4个项目)相加。
我可以使用什么算法来执行此操作?
答案 0 :(得分:1)
如果您可以依赖的是交换性(或者,等效地,如果每个运算符都以两个版本实现,其中一个版本反转其参数)那么您可以通过递归遍历AST来最小化堆栈成本,在每个节点首次访问最昂贵的孩子。为了计算节点的成本,执行简单的递归计算:叶子的成本是1,如果孩子的成本不同,非叶子的成本是其成本最高的孩子的成本,否则超过1。两个孩子的成本。 (另一个表达式是max(max(left, right), min(left, right)+1)
)。 (如果您的节点有两个以上的子节点,则需要一个类似但更复杂的公式。)
如果您还可以依赖关联性,允许您将ab+cd++
(费用3)替换为ab+c+d+
(费用2),那么您应该从最大取消平衡开始AST。
答案 1 :(得分:-1)
如果所有二进制操作都是可交换的,则可以使用树平衡算法(某些示例here)。平衡树将具有最小深度。然后对此平衡树执行深度优先遍历,以生成最小化堆栈大小的RPN。