找到多个方程的评估顺序的算法

标签 algorithm

我的文本内容充满了这样的表达:

a = 1
d = b + c 
b = a * c
c = 2 - a
...

这个表达式可以以随机顺序书写。我可以提取这些表达式中的每一个并评估它们中的每一个,但我需要找到最佳算法来避免循环评估,例如:

a = 1
d = ? (skip)
b = ? (skip)
c = 2 - a = 1
...
d = ? (skip)
b = a * c = 1
...
d = b + c = 2
...

有没有办法通过所涉及的参数“排序”方程以避免额外的计算通过,例如:

a = 1
c = 2 - a = 1
b = a * c = 1
d = b + c = 2
...

?

最佳答案

对于每个表达式,在图中创建一个节点,其中传入边是它所依赖的其他表达式。然后使用拓扑排序来确定评估顺序。

例子:

表达式:

a = 1
d = b + c 
b = a * c
c = 2 - a

图节点:

a()
d(b,c)
b(a,c)
c(a)

拓扑排序:

begin
    process a
        process a's dependencies (none)
        output a
        mark a as done
    process d
        process d's dependencies
            process b
                process b's dependencies
                    process a (already done)
                    process c
                        process c's dependencies
                            process a (already done)
                        output c
                        mark c as done
                output b
                mark b as done
            process c (already done)
        output d
        mark d as done
    process b (already done)
    process c (already done)
end

结果:

a c b d

关于找到多个方程的评估顺序的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12549715/

相关文章:

algorithm - 找出液体到达第 n 个杯子所需的时间

php - 将灯切换到 N 的算法是什么?

python - 从按钮 x 开始,在按钮 y 结束,z 号码长的电话号码排列

python - 在 Python 中如何实现交换变量?

c - 一个 Cruncher 程序

algorithm - 证明遍历 k-ary 树两次产生直径

algorithm - 如何计算堆排序的空间复杂度

c# - 如何将项目位置限制在 Canvas 中?

algorithm - 两个多项式相乘

C++ 变换和 lambda - 替换 for 循环