数式を考えて、同時に評価できる部分を見つけたいと思います。たとえば、次の式が与えられた場合、
(a + b) * c - (d + e) / f
(a + b)
(d + e)
互いに独立しているため、同時に評価できます。
この目的のためのアルゴリズムはありますか?または、この機能を実装するライブラリもありますか?
これは、数学パーサーを作成するための短くて簡単なステップバイステップのマニュアルです。式を解析し、解析された式を表すツリーを保持した後、それを反復処理できます。反復ごとに、ツリーの各ペアの葉は独立した式を表します(同時に評価できます)。[すべての反復で、評価された式をその結果に置き換えます]
評価の順序は2つの要素によって異なります。
式の一部を同時に評価する最適化があるとしたら、JVM / CLRレベルでのみ実行でき、ライブラリでは実行できないと思います...
逆ポーランド記法を使用する必要があると思います。
詳細については、以下をお読みください。
これは、通常の表記法を逆ポーランド記法に変換するC++で記述された関数です。誰かがそれをC#に変換するのを手伝ってくれるかもしれません:
では、例をツリーとして見てみましょう。
-
(* /)
(c +) (+ f)
(a b) (d e)
(括弧は、両方が同じ親の子であるノードをペアにします)
たとえば、操車場アルゴリズムを使用して、単純な場合にそのツリーを取得します。
ここで、ノードを評価するために必要なのは、そのノードの子だけであることに注意してください(ただし、再帰的にそうなります)。したがって(a + b)
、(d + e)
あなたが注意するように、そしてお互いに依存しないでください。また、またはに(c * (a + b))
依存せず、に依存しません。(d + e)
((d + e) / f)
((d + e) / f)
(a + b)
一般に、ノードを取得すると、祖先ではなくn
子孫でもないノードをn
同時に評価できます。スケジュールを使用している場合は、「そのノードを今すぐ評価できるかどうか」を追加する必要があります。明らかに、その子孫を評価する前にノードを評価することはできません。
「この目的」が何を指しているのかわかりません。何を計算しますか?