2

数式を考えて、同時に評価できる部分を見つけたいと思います。たとえば、次の式が与えられた場合、

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

(a + b)(d + e)互いに独立しているため、同時に評価できます。

この目的のためのアルゴリズムはありますか?または、この機能を実装するライブラリもありますか?

4

4 に答える 4

4

これは、数学パーサーを作成するための短くて簡単なステップバイステップのマニュアルです。式を解析し、解析された式を表すツリーを保持した後、それを反復処理できます。反復ごとに、ツリーの各ペアの葉は独立した式を表します(同時に評価できます)。[すべての反復で、評価された式をその結果に置き換えます]

C#で式ツリーを使用して式エバリュエーターを構築する

ここに画像の説明を入力してください

于 2012-04-29T09:21:44.800 に答える
1

評価の順序は2つの要素によって異なります。

  • 優先順位:各言語には通常、各演算子の優先順位を示す表があります
  • 結合性:式に同じ優先順位を持つ複数の演算子が含まれる場合、演算子の結合性が操作の実行順序を決定します。

式の一部を同時に評価する最適化があるとしたら、JVM / CLRレベルでのみ実行でき、ライブラリでは実行できないと思います...

于 2012-04-29T09:06:43.257 に答える
1

逆ポーランド記法を使用する必要があると思います。
詳細については、以下をお読みください。

これは、通常の表記法を逆ポーランド記法に変換するC++で記述された関数です。誰かがそれをC#に変換するのを手伝ってくれるかもしれません:

于 2012-04-29T09:08:31.117 に答える
1

では、例をツリーとして見てみましょう。

          -
   (*           /)
(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同時に評価できます。スケジュールを使用している場合は、「そのノードを今すぐ評価できるかどうか」を追加する必要があります。明らかに、その子孫を評価する前にノードを評価することはできません。

「この目的」が何を指しているのかわかりません。何を計算しますか?

于 2012-04-29T09:33:53.713 に答える