The Algorithm Design Manualには、関連する 2 つの節があります。
基本的に、最初の消費税の解き方は知っていますが、最初の消費税の解法をヒントに、2番目の消費税の解き方がわかりません。
算術式木の抜粋
上は算術式ツリーです。算術式が木として与えられたとします。各リーフは整数で、各内部ノードは標準の算術演算 (+、−、∗、/) の 1 つです。たとえば、式 2 + 3 ∗ 4 + (3 ∗ 4)/5 は、上の図のツリーで表されます。このような式を評価するための O(n) アルゴリズムを与えてください。ここで、ツリーには n 個のノードがあります。
わかりました、これは難しいことではありません。私の解決策は次のとおりです。
public float evaluate() {
return evaluate(root);
}
private float evaluate(Node_EX _node) {
if (_node.left == null || _node.right == null)
return Float.parseFloat(_node.key);
String op = _node.key;
if (op == "+") {
return evaluate(_node.left) + evaluate(_node.right);
} else if (op == "-") {
return evaluate(_node.left) - evaluate(_node.right);
} else if (op == "*") {
return evaluate(_node.left) * evaluate(_node.right);
} else {
return evaluate(_node.left) / evaluate(_node.right);
}
}
結果の式ツリーを解決するために再帰的な方法を使用するだけです。
演算式DAGの抜粋
算術式が、共通部分式が削除された DAG (有向非巡回グラフ) として与えられているとします。各リーフは整数で、各内部ノードは標準の算術演算 (+、−、∗、/) の 1 つです。たとえば、式 2 + 3 ∗ 4 + (3 ∗ 4)/5 は、上の図の DAG で表されます。このような DAG を評価するための O(n + m) アルゴリズムを与えます。ここで、DAG には n 個のノードと m 個のエッジがあります。ヒント: 望ましい効率を達成するために、ツリー ケースのアルゴリズムを変更します。
OK、説明に次のようなヒントがあります:ヒント: ツリー ケースのアルゴリズムを変更して、目的の効率を達成します。
実際、私はこのヒントにかなり混乱しています。典型的なツリー関連の場合、通常、再帰を使用して解決できます。ただし、これがグラフの場合、私の最初の直感は、BFS または DFS を使用して解決することです。DFS は実際には再帰的ですが、どうすれば BFS や DFS をツリーに関連付けることができますか?