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