一尘不染

评估数学表达式的最佳算法?

algorithm

评估数学表达式的最佳算法是什么?我希望能够在某种程度上优化这一点,因为我可能有一个包含各种变量的公式,我可能需要使用不同的变量进行数百次评估。因此,基本上,如果我可以首先解析公式以便以某种方式对其进行优化,然后我可以根据需要多次将变量传递给该优化版本,每次为我生成结果时。

我将用Delphi或C#编写。我已经使用调车码算法编写了类似的东西,但是每次我需要计算相同的公式时,我都必须经历解析阶段。必须有更好的方法来做到这一点。


阅读 235

收藏
2020-07-28

共1个答案

一尘不染

如果您想用Delphi做到这一点,可以研究一下该JclExprEval单元的工作原理,它是JEDI代码库的一部分。我是几年前写的(有点工程)。它解析函数和变量,并可以让您返回方法指针,该指针可以快速评估表达式。通过引用传递变量,您可以直接更改它们,并且将相应地计算重新计算的表达式。

无论如何,其工作原理可能对您有所帮助。表达式的递归下降解析很容易,并且通过构建树,您可以进行多次评估而无需重新解析。JclExprEval实际上是为一个简单的堆栈机生成代码,因此它的工作速度比树解释要快一些。堆栈机在很大程度上将其内存操作限制在数组上,并使用开关进行操作码,而树解释遵循堆中的链接,并且通常对操作码使用虚拟分派(或双重分派),因此它们通常会变慢。

采取与JclExprEval解析相同的方法,但是用C#编写,并Expression像Marc所建议的那样构建an
,是另一种完全有效的方法。JIT编译的表达式应该比解释的表达式程序或树要快很多,后者本身比解析要快得多。

2020-07-28