给出一个数学表达式,我想找出哪些是可以同时评估的部分。例如,给定以下表达式,
(a + b) * c - (d + e) / f
(a + b)
和(d + e)
可以同时评估,因为它们彼此独立。
是否有针对此目的的算法? 或者是否有任何库实现此功能?
答案 0 :(得分:4)
This是一个简短的步骤手册,用于创建数学解析器。 在解析表达式之后,如果您拥有表示已解析表达式的树,则可以对其进行迭代,并且在每次迭代中,树的每对叶子将表示一个独立的表达式(可以同时计算)。 [在每次迭代中将评估的表达式替换为其结果]
Building Expression Evaluator with Expression Trees in C#
答案 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
的后代而不是祖先的节点。如果您正在使用计划,则必须添加“如果现在可以评估该节点” - 显然,在评估其后代之前,您无法评估节点。
我不确定你所说的“这个目的”是什么。你想要计算什么?