III
Michael Tsai 2013/10/11
最笨翻譯機:
每個英文單字直接翻成法文單字
做法: 建一棵balanced binary search tree (例如紅黑樹), 裡面用英文單字當 key, 法文單字當作對應的資料
則每個字平均花𝑂 log 𝑛 的時間
假設我們知道每個字出現的頻率(或機 率), 可以做得更好嗎?
答: 可以! 把常用的字放離root近一點.
the
machicolation
Tree
問題:
給一個序列𝐾 = 𝑘1, 𝑘2, … , 𝑘𝑛 共n個排好序的key (𝑘1 <
𝑘2 < ⋯ < 𝑘𝑛 ). 我們要用這些key建立一棵binary search tree.
𝑘𝑖出現的機率為𝑝𝑖.
另外我們也有n+1個”假key”代表沒有出現在K中的值, 可用 𝑑0, 𝑑1, 𝑑2, … , 𝑑𝑛來表示. 𝑑0代表小於𝑘1的值, 𝑑1代表介於𝑘1 和𝑘2的值,…,𝑑𝑛代表大於𝑘𝑛的值.
假key 𝑑𝑖出現的機率為𝑞𝑖.
則目標是找出一棵binary search tree使得Expected cost最小.
𝑘1 𝑘2 …… 𝑘𝑛 𝑑0 𝑑1 𝑑2 ……𝑑𝑛−1 𝑑𝑛
𝐸 𝑠𝑒𝑎𝑟𝑐ℎ 𝑐𝑜𝑠𝑡 = 𝑖=1𝑛 (𝑑𝑒𝑝𝑡ℎ𝑇 𝑘𝑖 + 1) ∙ 𝑝𝑖+ 𝑖=0𝑛 (𝑑𝑒𝑝𝑡ℎ𝑇 𝑑𝑖 + 1) ∙ 𝑞𝑖
= 1 + 𝑖=1𝑛 𝑑𝑒𝑝𝑡ℎ𝑇 𝑘𝑖 ∙ 𝑝𝑖+ 𝑖=0𝑛 𝑑𝑒𝑝𝑡ℎ𝑇 𝑑𝑖 ∙ 𝑞𝑖
since 𝑖=1𝑛 𝑝𝑖 + 𝑖=0𝑛 𝑞𝑖 = 1
使得以上E[search cost]最小的binary search tree稱為 optimal binary search tree.
𝑘1 𝑘5 𝑘4 𝑘3 𝑑0 𝑑1
𝑑2 𝑑3 𝑑4
𝑑5
i 0 1 2 3 4 5 𝒑𝒊 0.15 0.10 0.05 0.10 0.20 𝒒𝒊 0.05 0.10 0.05 0.05 0.05 0.10 𝑘1 𝑘5
𝑘4 𝑘3 𝑑0 𝑑1
𝑑2 𝑑3 𝑑4
𝑑5
假設給定的key的出現機率為右上表格所顯示, 則左上圖 為optimal binary search tree (expected cost=2.75)
觀察: 機率最大的key不見得在root (𝑘5不在root)
暴力法有多暴力?
n個node的binary search tree總共有Ω(4𝑛
𝑛
3 2
)個 (Catalan number)
小觀察: binary search tree的subtree必包含一段連續的 key 𝑘𝑖, 𝑘𝑖+1, … , 𝑘𝑗及𝑑𝑖−1, … , 𝑑𝑗, 1 ≤ 𝑖 ≤ 𝑗 ≤ 𝑛.
小定理: 假設T為𝐾 = 𝑘1, 𝑘2, … , 𝑘𝑛 之optimal binary search tree. 則T之subtree 𝑇′,包含𝑘𝑖, … , 𝑘𝑗這些key, 也 必定是𝐾′ = 𝑘𝑖, 𝑘𝑖+1, … , 𝑘𝑗 這些key的optimal binary search tree.
證明: 如果𝑇′找出的不是optimal binary search tree, 則 表示可以找出一個更好的binary search tree 𝑇′′,
expected cost比𝑇′更好, 則可以用𝑇′′取代T中的𝑇′, 得 到一個比T cost更低的binary search tree (矛盾)
Dynamic Programming出招
1. 找出Optimal Substructure
𝑇′′
𝑇′ 𝑇
𝑘𝑖, 𝑘𝑖+1, … , 𝑘𝑗
𝑚=1(𝑑𝑒𝑝𝑡ℎ𝑇 𝑘𝑚 + 1) ∙ 𝑝𝑚 + 𝑚=0𝑛 (𝑑𝑒𝑝𝑡ℎ𝑇 𝑑𝑚 + 1) ∙ 𝑞𝑚
𝐸𝑖𝑗 = 𝑚=𝑖𝑗 (𝑑𝑒𝑝𝑡ℎ𝑇 𝑘𝑚 + 1) ∙ 𝑝𝑚 + 𝑚=𝑖−1𝑗 (𝑑𝑒𝑝𝑡ℎ𝑇 𝑑𝑚 + 1) ∙ 𝑞𝑚
= 𝐸𝑖𝑗 + 𝐶
𝐸𝑖𝑗′ < Eij
𝐸𝑖𝑗′ + 𝐶 < 𝐸𝑖𝑗 + 𝐶
矛盾!
Dynamic Programming出招
如何用小問題的答案組出大問題的答案?
𝑘𝑖, 𝑘𝑖+1, … , 𝑘𝑟−1 𝑘𝑟
𝑘𝑟+1, 𝑘𝑟+2, … , 𝑘𝑗 𝑑𝑖−1, 𝑑𝑖, … , 𝑑𝑟−1 𝑑𝑟, 𝑑𝑟+1, … , 𝑑𝑗
選出一r, 𝑖 ≤ 𝑟 ≤ 𝑗
𝑘𝑖, … , 𝑘𝑖−1 𝑘𝑖
𝑘𝑖+1, 𝑘𝑖+2, … , 𝑘𝑗 𝑑𝑖−1, … , 𝑑𝑖−1 𝑑𝑖, 𝑑𝑖+1, … , 𝑑𝑗
null 𝑑𝑖−1
Dynamic Programming出招
2. 列出遞迴式子 (表示花費)
𝑇𝐿
𝑘𝑖, 𝑘𝑖+1, … , 𝑘𝑟−1
𝑇𝑅 𝑘𝑟
𝑘𝑟+1, 𝑘𝑟+2, … , 𝑘𝑗 𝑑𝑖−1, 𝑑𝑖, … , 𝑑𝑟−1 𝑑𝑟, 𝑑𝑟+1, … , 𝑑𝑗 𝑒 𝑖, 𝑟 − 1
=
𝑚=𝑖 𝑟−1
(𝑑𝑒𝑝𝑡ℎ𝑇𝐿 𝑘𝑚 + 1) ∙ 𝑝𝑚
+
𝑚=𝑖−1 𝑟−1
(𝑑𝑒𝑝𝑡ℎ𝑇𝐿 𝑑𝑚 + 1) ∙ 𝑞𝑚
𝑒 𝑟 + 1, 𝑗
=
𝑚=𝑟+1 𝑗
(𝑑𝑒𝑝𝑡ℎ𝑇𝑅 𝑘𝑚 + 1) ∙ 𝑝𝑚
+
𝑚=𝑟+1 𝑗
(𝑑𝑒𝑝𝑡ℎ𝑇𝑅 𝑑𝑚 + 1) ∙ 𝑞𝑚
𝑑𝑒𝑝𝑡ℎ𝑇 ∙ = 𝑑𝑒𝑝𝑡ℎ𝑇𝐿 ∙ + 1 = 𝑑𝑒𝑝𝑡ℎ𝑇𝑅 ∙ + 1 𝑇
𝑙=𝑖 𝑙 𝑙=𝑖−1 𝑙
𝑒 𝑖, 𝑗 = 𝑝𝑟 + 𝑒 𝑖, 𝑟 − 1 + 𝑤 𝑖, 𝑟 − 1 + 𝑒 𝑟 + 1, 𝑗 +
,if 𝑗 = 𝑖 − 1 ,if 𝑗 ≠ 𝑖 − 1 包含𝑘𝑖, … , 𝑘𝑗的subtree
所發生的機率
r有多種選擇
條件不同, 使用的subproblem不同
Dynamic Programming出招
填表: e & w
e[i,j]: i=1 to n+1, j=0 to n
w[i,j]: i=1 to n+1, j=0 to n
為什麼w要填表? 不然計算每個e[i,j]都需要做Θ(𝑗 − 𝑖)次 加法
3. 計算花費
w 0 1 2 3 4 5
1 2 3 4 5 6
w 0 1 2 3 4 5
1 2 3 4 5 6
Θ 𝑛2 i
j
𝑤 𝑖, 𝑗
= 𝑞
𝑖−1𝑤 𝑖, 𝑗 − 1 + 𝑝
𝑗+ 𝑞
𝑗,if 𝑗 = 𝑖 − 1 ,if 𝑗 ≠ 𝑖 − 1
e 0 1 2 3 4 5 1
2 3 4 5 6
e 0 1 2 3 4 5
1 2 3 4 5 6
橘色是會用到的subproblem i
j
一次填一條對角線 Θ 𝑛3
大家來練習
𝒊 0 1 2 3 4 5
𝑝𝑖 0.15 0.10 0.05 0.10 0.20
𝑞𝑖 0.05 0.10 0.05 0.05 0.05 0.10
𝑤 𝑖, 𝑗
= 𝑞
𝑖−1𝑤 𝑖, 𝑗 − 1 + 𝑝
𝑗+ 𝑞
𝑗,if 𝑗 = 𝑖 − 1 ,if 𝑗 ≠ 𝑖 − 1
𝑒 𝑖, 𝑗
=
𝑞
𝑖−1𝑖≤𝑟≤𝑗
min {𝑒 𝑖, 𝑟 − 1 + 𝑒 𝑟 + 1, 𝑗 + 𝑤 𝑖, 𝑗 }
,if 𝑗 = 𝑖 − 1 ,if 𝑗 ≠ 𝑖 − 1
root[1..n,1..n] be new tables for i=1 to n+1
e[i,i-1]=𝑞𝑖−1 w[i,i-1]=𝑞𝑖−1 for l=1 to n
for i=1 to n-l+1 j=i+l-1
e[i,j]=∞
w[i,j]=w[i,j-1]+𝑝𝑗+𝑞𝑗 for r=i to j
t=e[i,r-1]+e[r+1,j]+w[i,j]
if t<e[i,j]
e[i,j]=t
root[i,j]=r return e and root
邊界起始值
填表: 兩層迴圈, 對角線順序
e紀錄expected cost, root紀錄選擇結果
Θ(𝑛3)
Dynamic Programming出招
自己回家研究一下 15.5-1 on p. 403
4. 印出Optimal Binary Search Tree結果