我正在研究实现公共子表达式消除(CSE),以处理对应于大型数学表达式的表达式图(数百万个节点)。 哪些算法适用于执行此操作?我在互联网上搜索了易于实现的算法,但未找到任何内容。如果可能,该算法应具有与完整表达式图中节点数量成线性关系的复杂度。
这些表达式没有副作用?那么最简单的方法就是将每个子表达式的树哈希到桶中,以确定子表达式消除的候选项。 这是CSE的一个特例,在单个(巨大的)"基本块"中的所有表达式都是如此。(我将这个想法用作检测重复代码的基础。) 如果这些表达式有顺序和副作用,则可能需要考虑全局值编号。