如何确定数学表达式的评估顺序?

时间:2012-04-29 08:56:54

标签: c# java algorithm

给出一个数学表达式,我想找出哪些是可以同时评估的部分。例如,给定以下表达式,

(a + b) * c - (d + e) / f

(a + b)(d + e)可以同时评估,因为它们彼此独立。

是否有针对此目的的算法? 或者是否有任何库实现此功能?

4 个答案:

答案 0 :(得分:4)

This是一个简短的步骤手册,用于创建数学解析器。 在解析表达式之后,如果您拥有表示已解析表达式的树,则可以对其进行迭代,并且在每次迭代中,树的每对叶子将表示一个独立的表达式(可以同时计算)。 [在每次迭代中将评估的表达式替换为其结果]

Building Expression Evaluator with Expression Trees in C#

enter image description here

答案 1 :(得分:1)

评估顺序取决于两个因素:

  • 优先顺序:在每种语言中,通常都有一个表格,表明每个运营商的优先级
  • 关联性:当表达式涉及多个具有相同优先级的运算符时,运算符关联性将控制执行运算的顺序。

如果可能有一些优化涉及同时评估表达式的各个部分,我认为只能在 JVM / CLR级别而不是库...

答案 2 :(得分:1)

我相信你应该使用Reversed Polish Notation
请阅读以下内容以获取更多详细信息:

This is用C ++编写的函数,它将常规符号转换为反向抛光符号。有人可能会帮助您将其转换为C#:

答案 3 :(得分:1)

好的,让我们看一下这个例子:

          -
   (*           /)
(c    +)     (+    f)
   (a   b) (d   e)

(括号将同一父节点的子节点配对)

如果简单,例如使用Shunting Yard算法获取树。

现在观察一下,为了评估一个节点你需要的东西,只是那个节点的子节点(但递归地是这样)。因此,正如您所注意到的,(a + b)(d + e)并不相互依赖。此外,(c * (a + b))不依赖(d + e)((d + e) / f)((d + e) / f)不依赖于(a + b)

通常,获取节点n,可以同时评估任何既不是n的后代而不是祖先的节点。如果您正在使用计划,则必须添加“如果现在可以评估该节点” - 显然,在评估其后代之前,您无法评估节点。

我不确定你所说的“这个目的”是什么。你想要计算什么?