[英]How to determine the order of evaluation of a mathematical expression?
给定一个数学表达式,我想找出可以同时评估的部分。 例如,给定以下表达式,
(a + b) * c - (d + e) / f
(a + b)
和(d + e)
可以同时评估,因为它们彼此独立。
是否有用于此目的的算法? 还是甚至没有实现此功能的库?
这是创建数学解析器的简短而逐步的手册。 在解析了表达式之后,您拿着一棵表示已解析表达式的树,可以对其进行迭代,并且在每次迭代中,树的每对叶子将代表一个独立的表达式(可以同时求值)。 [在每次迭代中,将计算出的表达式替换为其结果]
评估顺序取决于两个因素:
如果可能存在涉及对表达式的各个部分同时求值的某些优化,我认为只能在JVM / CLR级别而不是在库中完成...
我相信您应该使用波兰语反转符号 。
阅读以下内容了解更多详情:
这是用C ++编写的函数,可将常规表示法转换为反向波兰语表示法。 有人可能会帮助您将其转换为C#:
好的,让我们将示例视为一棵树:
-
(* /)
(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
的后代,也不是祖先的任何节点都可以同时求值。 如果您正在使用计划,则必须添加“如果现在可以评估该节点”-显然,您无法在评估其后代之前评估一个节点。
我不确定您指的是什么“目的”。 您要计算什么?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.