Greedy Algorithm
CKSC 林鶴哲
2019-12-27
What's an algorithm
Algorithm (n.) 演算法
algorithmic (adj.) 算法的
What's an algorithm
input -> (algorithm) -> output
一言以蔽之
Example
- Sorting: Given a sequence , output numbers in increasing order.
(3,4,1,5,2)\to(1,2,3,4,5)
- Optimal Problem: (Knapsack) Given some items with their weight and value, how can you choose the most precious thing among all the items with weight limit K?
- Machine Learning Algorithm: Youtube, search engine...
Good/Bad algorithms
- Right Input?
- Fast or slow?
- Take lots of spaces to store data?
Greedy algorithm
Warm Up: Coin Problem
目前常用的貨幣面額為$1, $5, $10, $50
假設硬幣數量充足,要如何使用最少的硬幣找錢給顧客?
如:104元? 49元?
known as Cashier's algorithm
How do you form your strategy?
- 眾:蛤?就先選最大的啊(?
- We need a concrete proof.
即使題目很簡單
我們依舊需要證明演算法是「正確的」
光靠感覺somehow是不夠的
- 眾:蛤?就先選最大的啊(?
- We need a concrete proof.
Recall: 從最大的開始選

用50, 10, 5, 1
湊出104元

用10, 5, 1
湊出4元

用5, 1
湊出4元
用1
湊出4元

拿2個
拿0個
拿0個
拿4個
Subproblem1
Subproblem2
Subproblem3
Greedy choice property
我們所決定的某個策略「不比所有策略來的差」。
這是「貪心」之所在。
- 在104元的拿硬幣問題中,由大面額往小面額拿,我們首先選擇拿50元並不比只拿10,5,1元的選擇差。
- (Why?)
Optimal substructure
一個問題的最佳解,是由很多小問題的最佳解所組起來的。
如上頁,104元的最佳解,是由子問題1的最佳解+2個50元組成的。
sol(sub-problem1) = 0個10元+sol(sub-problem2)
- 通常可以使用反證法。
Greedy Alg.的兩個保證

Greedy Choice Property
- 說明我們的選擇方式不比其他「所有」選擇來的差。(不一定要是唯一最好的)
- 常常使用"exchange argument"的方法
- 用硬幣問題來說,假設我們的選擇產生出一個叫做OPT的策略,包含「兩個50」、「4個1元」
- 我們想證明:
對於任何達到「最少硬幣找104元」的 OPT',我們的OPT不比 OPT' 「差」。 - 找硬幣例子不夠好的原因是因為達到最佳解的方法是唯一的。
Optimal substructure

Greedy對於所有幣值都有效嗎
e.g: 1, 6, 10? 5, 6, 7?
美國幣值:1, 5, 10, 25
猜猜看,需要加哪一個幣值可以減少平均找錢數
Optimal coin problem of US
Another problem
classic Greedy problem
誰先晚餐!
Description
- 有一群人要進同一家店吃晚餐,每個人點的餐烹煮的時間都不一樣,而每個人吃完時間也不一樣。而店家一次只能煮一道菜,請問要如何烹煮,才能最早讓所有人都吃完離開。
- Input: 每個人的餐點烹飪時間以及享用時間
- Output: 一種烹飪順序,找到最快翻桌時間
(2, 4, 3, 7, 5)
準備時間
吃飯時間
(13,2,4,3,5)
很簡單的直覺
吃越慢的應該要先煮吧...
又是另一回事...
但說到證明
先想想看
怎麼定義完成時間?
T = \max\limits_{1\le i\le n}(\sum\limits_{k=1}^{i}p_k+e_i)
白話文:最後吃飽的人
(13,5,4,3,2)
吃飯時間
準備時間
(2, 5, 3, 7, 4)
如果我們按照吃飯時間排序...
T = \max\limits_{1\le i\le n}(\sum\limits_{k=1}^{i}p_k+e_i)
(13,5,4,3,2)
吃飯時間
準備時間
(2, 5, 3, 7, 4)
-
證明這個策略不比其他任何一個差
- 假設吃飯時間中,存在一個順序數對:
- 則全體吃完時間會「變快」?「變慢」?「一樣」?
e_i > e_j , i > j
(2, 3, 5, 7, 4)
準備時間
吃飯時間
(13,4,5,3,2)
T = \max\limits_{1\le i\le n}(\sum\limits_{k=1}^{i}p_k+e_i)
Greedy Choice property
Optimal substructure

-
定義subproblem(i): 編號i~n的人吃飽的時間
- subproblem(i)的答案會是
- 欲證:如果T策略是sub(i)的最佳解,則T策略i~n人也是sub(i+1)的最佳解。
\max\{\sum\limits_{k=1}^ip_k+e_i, subproblem(i+1)\}
Icecream problem
- 假設你開了一間冰淇淋店A,並有一間與你競爭的店家B。
- 顧客會排在一個共同的隊伍上,每個顧客帶有一個數值 t 表示準備該顧客的冰淇淋所需要的時間。
- 你跟B店簽好合約,規定你可以選擇你要服務的客人(不一定是隊伍的第一人),但是在你選擇的人前面的人都會不高興(先來卻沒被服務到),因而跑去B店家消費。
- B店家的經營策略是每次都服務隊伍的第一個人
- 兩間店家一次只能服務一位客人,等到該客人對應的t分鐘後之後服務下一位客人。當你跟B同時服務完畢,你可以優先決定是否要服務隊伍的第一人。
- 請問你該如何選擇客人,才能保證你服務的客人不比B少
(3,3,3,3,3,3,3,3,3,3)
\\
(3,10, 8, 8, 2,3,6,9,1,6)
Philosophy: Greedy choice stays ahead.(永遠領先)
這題我們沒有要保證得到的客人最多,因此只要在任何時間點我們都服務「至少跟B店一樣多人」,就能達到目標。
Hint
假設現在有兩個人,分別是a分鐘和b分鐘,該如何選擇能保證我們比B先服務完?
Hint
Another Greedy:
挖石油問題
-
有20張1-20的紙卡排成一列,每隊輪流拿,每次都只能拿邊張。
- 第一輪:A隊先拿。
- 第二輪:B隊先拿。
- 第三輪:猜拳 / 如果兩隊prefer的不一樣就按照你們prefer的拿。
- 13 6 5 16 17 19 8 1 18 12 10 15 4 14 3 11 7 2 20 9
暇咪!先手必不輸!
Greedy Algorithm
By maclin726
Greedy Algorithm
建中科研社社課
- 351