精選文章
- 取得連結
- X
- 以電子郵件傳送
- 其他應用程式
Kotlin 學習: Leetcode AND-OR 樹 相關題目.
先前在用 Grok build 寫 電腦解死活題程式時,
燒掉了我三週的周用量不說, 還沒寫對, 而且遇到去年 GPT4 時代鬼打牆的問題;
看來這種還需要研究的課題, 直接讓 AI 寫程式的話, AI 可能會東參考西參考, 有些還沒定論的會錯亂... 想想還是我自己來看看怎麼寫, 引導 AI 來做比較好;
討論中, AI 似乎是用 AND-OR 樹架構來解?於是興起自己先透過 leetcode 學 AND-OR tree 的念頭;
目前做了兩個
KOTLIN 學習 : LEETCODE Easy 2331. Evaluate Boolean Binary Tree
KOTLIN 學習 : LEETCODE Hard 1106. Parsing A Boolean Expression
今天 1106 hard 的這題解完後, 有些感觸和成就感^^
先來記錄一下^^
AI 做雖然快, 但解問題時 自身學習到的分析思考組織重組實現, 和完成時的成就感,
這些都是用 AI 時無法獲得的..
不過 Grok AI 也有提到, AND-OR 樹 AND 看到 0 就停, OR 看到 1 就停的短路求值方式,
目前在 Leetcode 上還沒有相對合適的題目體現?
繼續研究...
=== Grok AI 建議的 Leetcode AND-OR tree 相關題目 ===
LeetCode 沒有題目標明「AND-OR 樹 / AO* / 問題化簡」。最接近、結構上就是 AND-OR 樹的,是「葉子為真假、內部節點為 AND/OR」的布林表達式樹。其餘多半只是概念親戚。
一、結構上就是 AND-OR 樹(最直接)
這幾題的輸入本身就是:葉 = 原子命題,內節點 = () / ()(有的再加 ()、XOR)。求值規則也和 AND-OR 一樣:AND 要兩邊都真,OR 一邊為真即可。
| 題號 | 題名 | 難度 | 和 AND-OR 的對應 | 備註 |
|---|---|---|---|---|
| 2331 | Evaluate Boolean Binary Tree | Easy | 給一棵滿二叉樹:葉 0/1,內點
2=OR、3=AND,求根的值 |
最像教科書 AND-OR 求值;後序遍歷即可 |
| 2313 | Minimum Flips in Binary Tree to Get Result | Hard 🔒 | 同上,再加 XOR、NOT;最少翻幾個葉,讓根變成指定真假 | 樹形 DP:每個子樹算「變成 true / false 的最小代價」。AND 要兩邊都真、OR 至少一邊真,就是解子樹的代價版 |
| 1106 | Parsing A Boolean Expression | Hard | 字串 &(…)、|(…)、!(…) 是
n 元 AND-OR 樹 的前綴寫法 |
先還原成樹再求值,或用棧模擬 |
| 1896 | Minimum Cost to Change the Final Value of Expression | Hard | 0/1 與 &/|
組成的表達式樹;可改葉或改運算符,使根值翻轉,求最少操作 |
隱式建樹 + 每個子表達式維護「當前值、翻轉代價」 |
刷題順序建議:2331 → 1106 → 2313 → 1896。
2331 只問「這棵 AND-OR
樹的值」;後面三題是「在同一種樹上做最小修改」,比較像把 AO*
的「解圖代價」縮成布林特例。
二、是表達式樹,但運算符不是 AND/OR(不要算直接相關)
這些是「表達式樹」家族,內部是 + - * /,不是邏輯
AND-OR:
- 1628
Design an Expression Tree With Evaluate Function 🔒
- 1597
Build Binary Expression Tree From Infix Expression 🔒
- 1612 Check If Two Expression Trees are Equivalent 🔒
練習建樹、求值很有用,但語意是算術,不是「全部子目標/任選一條」。
同樣不要和 AND-OR 搞混:
那是位元運算,不是目標分解樹。
三、概念對應:博弈樹 = 特殊 AND-OR(Minimax)
AI 裡常把 MAX 當 OR(己方選一步即可)、MIN 當 AND(必須應付對手所有回覆)。LeetCode 的零和博弈 DP 就是在這棵隱式樹上求值,題面不會寫 AND-OR。
較典型:
若要練「OR = 存在一個必勝著、AND = 所有回覆都能接」,這組比布林樹更接近博弈版 AND-OR;但沒有 AO*、也沒有明確的 AND 弧。
四、LeetCode 沒有、理論課才有的那題
課程裡常見的 AND-OR 樹短路求值(AND 看到 0、OR 看到
1 就停;隨機先探哪一邊,期望讀葉 (O(n^{0.792})))沒有對應
LeetCode 題。
2331 若把語言的 && / ||
短路用上,只是實作細節,不是這道複雜度題。
也沒有:AO*、解子圖、非確定環境條件計劃、圖模型 AND/OR search。那些不會以 LeetCode 形式出現。
五、若目標是「用刷題把 AND-OR 練熟」
只練直接相關的四題就夠:
- 2331:會走樹、會套 AND/OR 語意。
- 1106:從字串還原 n 元 AND-OR,並處理 NOT。
- 2313:每個子樹回傳「到 true / 到 false
的代價」——這已經是解圖代價的布林版。
- 1896:先解析再 DP,規模到 (10^5),逼你把「改葉 vs 改連接子(&↔︎|)」想清楚。
要對口試講一句:
LeetCode 上的 AND-OR 是
布林表達式樹的求值與最小修改,不是 AI
教科書裡的問題化簡搜尋。
留言
張貼留言