元の問題を見た後、あなたはそれを誤解したと思います。
この質問は、最も深いレベルAND/OR
のノードがノードであるツリーに関するものです。他のノードの論理演算はこの要因によって決定されます-それらが最初にノードであるかノードであるかはわかりません。最も深いレベルのノードがノードであるとだけ与えられます-したがって、次に高いレベルのノードはノードです、そして次に高いレベルはノードなどです...論理的な工作員はツリーの異なる深さの間で交換します。彼らが提供したサンプルツリーを見ると、これは明らかになります。AND
AND
OR
AND
OR
AND
AND/OR
この問題に取り組む方法は、最初にルートノードの論理接続詞を理解することです。これは、式を1回スキャンし、括弧の数を追跡することで実行できます。()
それぞれがツリー(ツリーの次のレベル)の新しいノードに対応することに注意してください。例として、次の式について考えてみます。
((F(TF))(TF))
この式を歩くと、最初に3つの開き括弧、2つの閉じ括弧、1つの開き括弧、最後に2つの閉じ括弧が表示されます。このウォーク中に任意の時点で開いていた括弧の最大数を取得すると、それはこのAND/OR
ツリーの最大の深さになります(3
上記の例では)。
では、これはどういう意味ですか?ツリーの深さが奇数の場合、ルートノードはAND
ノードです。それ以外の場合、ルートはOR
ノードです(接続が交互になっているため)。
ルートノードの接続がわかったら、単純なスタックベースのマシンを使用してこの式を評価できます。かっこを開いたり閉じたりするたびに、接続を反転する必要があることに注意する必要があります。上記の式が評価される方法は次のとおりです。
AND |- (•(F(TF))(TF))
箇条書きは、式のどこにいるかを示していることに注意してください(スタックの一番上など)。次に、以下のように進めます。
OR |- ((•F(TF))(TF)) // flipped the connective because we jumped a node
OR |- ((F•(TF))(TF)) // nothing to evaluate on the current node, push F
AND |- ((F(•TF))(TF))
AND |- ((F(T•F))(TF))
AND |- ((F(TF•))(TF))
AND |- ((F(F•))(TF)) // Two booleans on top, T AND F = F (reduce)
OR |- ((F(F)•)(TF)) // Jumped out of a node, flip the sign
OR |- ((FF•)(TF)) // Completely evaluated node on top, (F) = F (reduce)
OR |- ((F•)(TF)) // Two booleans on top, F OR F = F (reduce)
AND |- ((F)•(TF))
AND |- (F•(TF))
OR |- (F(•TF))
OR |- (F(T•F))
OR |- (F(TF•))
OR |- (F(T•))
AND |- (F(T)•)
AND |- (FT•)
AND |- (F•)
したがって、最終的な答えはとして得られF
ます。これはshift-reduce解析とある程度の関係がありますが、この場合の減少は、操作しているASTの現在の深さに依存します。このアイデアをコードに変換できることを願っています(現在有効な論理演算を追跡するには、スタックとグローバル変数が必要です)。
最後に、そのサイトをご紹介いただきありがとうございます。あなたもこのサイトが好きかもしれません。