Algorithms
Michael Tsai 2011/4/15
這次作業…
有還沒有教但是讓同學自己讀的部分
這次希望給同學們”重拾課本”的動力
期中考前作業潮的問題有沒有解決方式?
請發表意見XD
The importance of time managing
作業一、二、三解答會在今天晚上前上線
批改完的作業 會在下禮拜放在204給同學認領
期中考
Close‐book exam
大抄: 單張A4紙, 可以雙面利用
主要題型: 是非+解釋, 填空, 問答
範圍: 考到今天教的東西
(Divide & Conquer, Dynamic Programming,
Probabilistic Analysis & Randomized Algorithm, Greedy Algorithm)
180 minutes
難度: 一半跟作業一樣難, 一半比作業簡單
作弊=當掉+送校處分
演算法!? 演算法!?
演算法!? 演算法!?
超級電腦排程問題
需要交給超級電腦的工作若干
每樣工作有選定的開始與結束時間
如何選出一組可以執行的工作(執行時 間不重疊), 使這些工作的數量最大?
時間 4
問題定義
集合 , , … ,
每一個工作 有開始時間 及結束時間
0 ∞
每個工作執行時間為 ,
可以選兩個工作, 其中一個工作的結束時間和另 外一個工作的開始時間一樣
當s f 或 時 和 可以被同時選入
工作已經照結束時間排好了:
⋯
先請出神聖的dynamic programming 尚方寶劍
定義子問題:
為 完成後, 開始前的所有工作集合
要找出 中的最大可執行集合, 假設其中包含
所以假設 為 的最佳解, 則 1
S
S S
Dynamic programming 尚方寶劍
Optimal Substructure:
證明 中包含S 與 的最佳解(即欲證明 為 之 最佳解, 或 為 之最佳解)
S S
最佳解? 最佳解
Optimal Substructure
假設 不是 的最佳解, 則表示有一 使
但如果這樣
則此解之工作數目為 1
1 , 表示 不是最佳解 (矛盾)
因此 為 的最佳解
S S
最佳解? 最佳解
有Optimal substructure, 可以用DP解!
接下來怎麼解呢?
, 代表 最佳解的工作數目
則 , , 1 ,
k是我們的選擇 (不知道選哪一個)
, 0
max , 1 ,
接著使用top‐down or bottom‐up方法填表即可
if ∅ if ∅
等等, 我們需要用到尚方寶劍嗎?
如果我們可以證明我們知道呢?
Greedy Algorithm
某些問題, 我們可以知道怎麼做選擇!
此稱為greedy choice
如果greedy choice為optimal choice, 再加上
optimal substructure, 我們就可以非常快速的得 到解!
Greedy choice
S S
不需要考慮所有 的選擇!
只需要直接解選擇 之後的subproblem!
怎麼做出選擇? (創造力)
每次都選最早開始的工作
每次都選花最少時間的工作
每次都選跟其他最少衝突的工作
1
2 3
反例
反例
反例
Greedy choice
正確的greedy choice(之一): 選最早結束的.
原因: 越早結束, 後面就越多時間讓其他工作執行.
因為原本已經照 排序好了, 每次我們都選
接下來只需考慮 結束以後才開始的所有工作
因為其他 的結束時間 , 要大於 才不會重疊.
證明greedy choice是正確的!
定理: 在某subproblem 中 的完成時間最早, 則 的某些最佳解(如果有很多個)中一定有
證明: 假設 是 的某個最佳解, A 裡面完成時 間最早的是 .
1. 如果 就是 , 則得證.
2. 如果 不是 , 則
所以可以把 中的 換成 .
更換後工作數目不變, 和 一樣多, 因此為另 外一個最佳解, 得證.
其他的
結論: 有時候並不需要DP!
DP可以用, 但是慢很多. (殺雞不用尚方寶劍)
Greedy algorithm通常使用top‐down 的方法:
1. 根據目前知道的事情選出最好的選擇
2. 繼續解用了這個選擇之後的subproblem
3. 重複以上一直到subproblem可以直接解掉
重點: 請確定(要證明)greedy choice一定會出現 在最佳解裡面!!!
來個pseudo‐code
Recursive_Activity_Selector(s,f,k,n) m=k+1
while m<=n and s[m]<f[k]
m=m+1 if m<=n
return ∪
Recursive_Activity_Selector(s,f,m,n) else
return ∅
Θ 選完greedy choice以後只剩下
一個recursive call在最後: tail recursive
來個pseudo‐code
Greedy_Activity_Selector(s,f) n=s.length
A={}
k=1
for m=2 to n
if s[m]>=f[k]
A= ∪ k=m return A
Θ
什麼問題可以使用greedy algorithm來解?
1. 如果做出一個choice之後, 可以找到剩下要解 的單一個subproblem (定義好subproblem)
2. 有greedy property. (必須證明最佳解裡面一定 有greedy choice)
3. 有optimal substructure (必須證明大問題的最 佳解裡面有小問題的最佳解)
1.999. 決定要怎麼做greedy choice.
0‐1背包問題
某店面有n個物品 item , item , … , item
各價值 , , … , , 各重 , , … ,
小偷有一個可以裝W這麼重的背包
請問要偷走哪些東西可以使小偷拿走的東西總 價值最高?
fractional背包問題
某店面有n個物品 item , item , … , item
各價值 , , … , , 各重 , , … ,
小偷有一個可以裝W這麼重的背包
可以拿走”部分物品” (切物品的一部分)
請問要偷走哪些東西可以使小偷拿走的東西總 價值最高?
背包問題的optimal substructure
不比W重的最佳解
拿掉
此為不比W‐ 重,
使用除了 外的物品的最佳解
定理:
證明: (適用於0‐1 & fractional 背包問題) 1. 假設右邊的不是最佳解的話,
2. 則可以找到一最佳解, 價值更高且不比W‐ 重.
3. 此解加上 以後也還沒有超過W,
4. 而且此解加上 後總價值比左邊的價值還高 (矛盾)
Fractional 背包問題的greedy choice
把物品按照單位重量的價值來排序 (也就是 )
1. 選出單位重量價值最高的(greedy choice).
2. 如果可用重量(W)比物品重量 小, 則把背包填滿, 把 物品多餘的部分捨棄.
3. 如果可用重量比物品重量 大, 則繼續解子問題: 可用 重量剩下W‐ , 把已放入的物品從物品集合中去除.
證明fractional背包問題有 greedy property
其實就是要證明, (某些)最佳解裡面有greedy choice
通常使用的方法:
1. 假設可以拿到最佳解.
2. 最佳解裡面如果已經有greedy choice的話, 則得證.
3. 最佳解裡面如果沒有greedy choice的話, 則想辦法 把最佳解裡面的一些東西和greedy choice互換. 結 果發現這個新解跟greedy choice一樣好 (也是一個 最佳解) 或者發現這個新解更好 (矛盾, 所以最佳解 裡面不可能沒有greedy choice)
證明fractional背包問題有 greedy property
1. 假設可以拿到可用重量為W最佳解. 假設 為 單位重量價值最高者.
2. 如果 , 則將最佳解之所有東西都換成 .
3. 如果 , 則將最佳解中的物品按照單位重量 價值排序,取其中重 之最高價值物品(可能包含
部分 )與剩餘之 交換.
4. 因為 為單位重量價值最高者, 因此作了以上 交換以後得到之解, 總價值只可能上升或相等. 但 原來已經為最佳解, 因此總價值只可能相等
交換過後的解也是最佳解
因此至少部分最佳解中有greedy choice.
此一greedy choice不適用於0‐1背包 問題!
反例:
10 20 30
50
$60 $100 $120
$6 $5 $4 單位重量價值
總價值
50 30 20
50 10 20
$220 $160
50 10 30
$180
最佳解, 但是沒有greedy choice!
注意: 但是這不代表這個問題 一定沒有greedy property! 只 是表示這個greedy choice不是 正確的!
因為如果有空間沒有用到, 就 會使單位重量的價值下降!!
Huffman codes
a b c d e f
出現次數 45k 13k 12k 16k 9k 5k
Fixed‐
length codeword
000 001 010 011 100 101
Variable‐
length codeword
0 101 100 111 1101 1100
總共需要224 Kb 總共需要300 Kb
越不常出現的字, codeword應該越長! 再省25%
Prefix code
定義: 某個code中, 沒有任何一個codeword是另 外一個codeword的prefix, 則稱為prefix code.
Encode: “abc””0 101 100”
Decode: “0 101 100””abc”
使用右邊的decoding tree, 走到leaf就解出一個字母
Prefix code就不會有混淆的狀況 產生.
例: a=001 b=00 c=1
那看到001是 “a” or “bc”?
注意: 此非binary search tree!
a
c b d
f e
0 1
0 1
0 1
0 1
0 1
如何產生最佳的code呢?
想要產生一棵decode tree, 使得檔案大小能最小.
檔案大小(cost):
. ∙
∈
Full binary tree
(跟上學期定義不同!):
每個non‐leaf node都有兩個children
一個optimal code畫成的decode tree一定是full binary tree.
a
c b d
f e
0 1
0 1
0 1
0 1
0 1
Huffman code
Huffman發明了一種使用greedy algorithm產生 optimal prefix code的方法, 稱為Huffman Code
f:5 e:9 d:16 c:12 b:13 a:45 14
0 1
25
0 1
30
0 1
0 55
1 0 100
1
Pseudo‐code
Huffman(C) n=|C|
Q=C
for i=1 to n-1
allocate a new node z z.left=Extract_Min(Q) z.right=Extract_Min(Q)
z.freq=z.left.freq+z.right.freq Insert(Q,z)
return Extract_Min(Q)
在Priority Queue Q插入z: log
在Priority Queue Q拿出item:
log 起始Priority queue:
證明最佳解裡面一定有greedy choice
定理: 假設所有的字都在集合C裡面. 每個字 ∈ , 出現 的頻率為c.freq. 假設x和y為C中頻率最低的. 則一定有 一組最佳的code是使得x和y的codeword長度一樣且只 有最後一個bit不同.
證明:
1. 假設有T代表任一的最佳code. 在其中假設a 和 b在T中 為depth最大且為sibiling的兩個字元. 我們可以假設
. . 及 . . .
2. 因為” x和y為C中頻率最低的”, 所以 .
. 及 . . .
證明最佳解裡面一定有greedy choice
3. 如果x.freq=b.freq, 則
x.freq=a.freq=y.freq=b.freq. 如此的話可以直接 得證 (可以把x和a交換, y和b交換, 則得到另一 optimal code, x和y的codeword長度一樣且只 有最後一個bit不同)
4. 如果 . . , 則先將a, x交換(得到T’), 再將y, b交換(得到T’’)
y
a b
x y
x b
a b
x y
a
T T’ T’’
. ∙ . ∙
∈
. ∈∙ + . ∙ . ∙
. ∙
. ∙ + . ∙ . ∙
. ∙
. .
0
類似方法可得到 ′ 0, 因此 .
但因T已為最佳解, 所以只可能 , ′′也是最 佳解 (得證)
y
a b
x y
x b
a
T T’
證明題目有optimal substructure
, ∪ z為一新字元, z.freq=x.freq+y.freq
最佳解為T’
z T’
T
x y
. ∙ . ∙ . ∙
. . ∙ . ∙ 1 . ∙
1
. .
T為C之最佳解
證明題目有optimal substructure
, ∪ 最佳解為T’
z T’
T
x y
T為C之最佳解
則有T’’為C 之最佳解 假設不是的話
將x,y替換成z
得到T’’’
B . .
. .
矛盾!