Chapter 4 -- Greedy algorithms ( 2 )
Interval Partition
Scenario
$Let\ {I(i)=\big[s(i),f(i)\big)\mid i=1,2,3,\cdots,n}\ is\ a\ set\ of\ requests\ interval.$
$Partition\ these\ requests\ into\ a\ minimum\ number\ of\ compatible(no\ overlap)\ subsets.$
給定一個區間,以及 $n$ 個子區間,試圖將這個子區間分成最少的子集合,子集合內的子區間互不重疊。

要處理這個問題前,我們先定義 $depth$ 這個名詞。
$depth$ 指的就是在這些 requests 中,在同一個時間點上最多有幾個 requests 重疊。
(這邊我認為課程中江蕙如教授並沒有講得很清楚,究竟 $depth$ 指的是同一時間最多重複的 requests 數量? 還是就整個時間軸來看重複率最多的那個重複數量? 舉例來說,如果整個時間軸掃過去,有一個時間點出現了 4 個requests 重複,但有四個時間點出現了 3 個 requests 重複,那 $depth$ 應該是 3還是4 ?就後面的討論來看,$depth$ 應該是 4)
Claim : $depth$ is the least number of partition subset
Proof :
Suppose that $depth=d$
$\therefore \exists I_1,I_2,\cdots,I_d$ ,這些子區間會在某一個時間點互相重疊。
$\Longrightarrow$ 這些子區間就必須要被分配到不同的 subsets 中。
$\Longrightarrow$ 我們至少就需要 $d$ 個 subsets。
現在我們有幾個問題 :
- 我們能不能用 $O(n\log n)$ 的複雜度找出 $d$ ?
- $d$ 是我們想要找的答案的下界,那有沒有可能 $d$ 就是答案 ? 怎麼找 ?
如果這兩個問題都能解決,那我們勢必可以確定這樣找出來的答案 $d$ 一定是最優解。
如何用 $O(n\log n)$ 的時間複雜度找出 $depth$ ?
1 | 1. 首先將所有子區間按照 start time 進行排序 |
整個過程大概可以用下圖來表示

這樣的過程我們可以計算總時間複雜度 :
Step 1. $O(n\log n)$
Step 2. $O((2n)\log (2n))=O(n\log n)$
Step 3. $O(1)$
Step 4. $O(n)$
總時間複雜度則為 $O(n\log n)$,而且整個複雜度不與所佔的時間總長度相關,即使今天有 request 站了一百萬個時間單位都不影響整個複雜度。
$d$ 就是最小的 partition number of subsets
1 | Interval-Partitioning(R): |
我們一樣用動畫來呈現整個流程較為清楚 :

Correctness of Algorithm
每一個子區間都一定會有 Label
仔細看看上面的 procedure 其實最後一步的 else 似乎不會碰到 ? 的確,這是整個演算法的一個防呆措施,但其實根本不會有「配不到 label」 的情況發生。
假設我們在整個演算法過程中檢查到 $I(i)$ 這個子區間,而它與前面的 $t$ 個子區間都有重疊到。根據我們一開始找出來的 $depth\ d$ 我們可以知道 $t+1\leq d$。
( $I(i)$ 跟前面 $t$ 個子區間重疊的深度一定不會超過 $d$ )
$\Longrightarrow t\leq d-1$
$\Longrightarrow$ 檢查到 $I(i)$ 時一定至少有一個 label 可以跟它搭配
$\Longrightarrow$ $I(i)$ 一定可以配到 label,因此 else 的步驟一定不會發生。
每一個 subset 內的子區間必然不會 overlap
$\forall$ overlapping $I(i)$ and $I(j)$
W.L.O.G. ,$i<j$
從我們提出的演算法來看,當我們在 $I(j)$ 這個 iteration 時,$I(i)$ 已經被處理過了,而且也已經有了一個 Label。此時,在這個 iteration 中的第一步,我們會先排除掉所有衝突的 Label,而 $I(i)$ 的 Label 勢必會被排除,因此 $I(j)$ 也絕對不會跟 $I(i)$ 配在同一個 Label 裡面。
從以上的說明發現,這樣的演算法一定可以做出一個 $d$ 個 partition subsets ,而且這樣的結果一定是最優解。
Scheduling to Minimize Lateness
Scenario
$Let\ {I(i)\ with\ lenth\ t(i)\ and\ deadline\ d(i)\mid i=1,2,3,\cdots,n}\ is\ a\ set\ of\ requests\ interval.$
$Scheduling\ these\ requests\ without\ overlapping\ and\ minimize\ maximum\ lateness.$
$Lateness : I(j)=max{0,f(i)-d(i)}$
給定一個區間,以及 $n$ 個子區間,這些子區間沒有限定 strat time 及 finish time,但有限制其長度及 deadline,試圖將這個子區間安排順序使這些子區間完全不重複,並且盡可能使延遲 ( finish time 超過 deadline) 最小化。

Criterion ( Greedy Rule )
我們這個問題也一樣先找出 Greedy Rule :
- 最短區間優先 ?
若有兩個區間 $I_1$ : deadline=100, lenth=1 ; $I_2$ : deadline=10, lenth=10,若以最短區間優先,則我們會先排序 $I_1$ 再來排序 $I_2$,但這樣很明顯地會產生 Lateness=9。但我們排序的方式為 $I_2$, $I_1$ ,則 Lateness=0。 - 最短餘裕優先 ?
若有兩個區間 $I_1$ : deadline=2, lenth=1 ; $I_2$ : deadline=10, lenth=10,我們以最短餘裕優先的方式進行,排序的方式會是 $I_2,I_1$,產生的 Lateness=9。但若我們排序方式改為 $I_1,I_2$ ,則 Lateness可以壓到 1。 - Deadline 最早優先 ?
相較於 Interval Scheduling 的 Greedy Rule,這個 Greedy Rule 相對來說比較貼近直覺。
1 | Min-Lateness(R,s): |
這樣的演算法中,我們並不限定必須要從 time=0 開始進行 scheduling,所以我們可以任意給定一個 start time s。
再來比較重要的一個概念是,這個演算法可以確保最後輸出的 solution 中間不會有閒置時間 ( idle time ),但是事實上,一個合理的 optimal solution 是可以容許有 idle time 的。
Correctness of Algorithm
Claim : 一定存在一個最優解中間沒有 idle time
假設我們手中有一個含有 idle time 的 optimal solution,那麼顯而易見的,我們可以將這接閒置時間進行壓縮,讓每一個子區間的頭尾相連,這樣的解也一定會是 optimal solution。
Claim : 任何沒有 inversion 及 idle time 的 schedule,必然擁有相同的 Maximum Lateness
首先我們先定義 inversion : 如果在 schedule 中存在兩個子區間 $I(i),I(j)$ 滿足 $s(i)<s(j)$ 但 $d(j)<d(i)$ 者稱之。白話一點說,一般我們會按照 deadline 來安排順序,deadline 比較早的,我們就會比較早排序,它的 start time 也會比較早,但 inverstion 就是排列順序與 deadline 順序相反的子區間。
兩個沒有 inversion 及 idle time 但卻不同的 schedule 中,不同的部分只會出現在 「相同 deadline,卻不同 start time」的子區間中。如果真的有可能會出現不同的 Lateness 也會出現在這部分。
因此,我們現在只考慮這樣子的 deadline $d$,以及有相同 deadline $d$ 的這些區間。
因為這些區間最後排序的 start time 與總長度勢必都一樣,但又具有相同的 deadline $d$,所以不管最後一個被排序的子區間是哪一個,它的 finish time 與 deadline $d$ 的時間差一定會一樣。

Claim : 一定有一個 optimal solution 沒有 idle time 及 inversion
(1) 一定存在 optimal solution 沒有 idle time : Clearly.
(2) 一定存在 optimal solution 沒有 inversion
假設現在有一個帶有 inversion 的 optimal solution,我們只需考慮出現 inversion 的區間 finish time 都在它們的 deadline 之後。
( 如果 finish time 都在它們的 deadline 之前,就沒有 Lateness 的問題,我們只要直接將兩個區間調換位置即可,不會影響 optimal solution )
考慮到上述的狀況,當我們針對 inversion 的子區間進行調換時,Lateness 勢必會改變,但絕對不會大於原本 inversion 的 Lateness。

所以如果原本已經是 optimal solution,經過這樣的子區間調換後,他也依舊會是 optimal solution。
Theorem : The Min-Lateness(R,s) Algorithm schedule S is optimal.
假設,我們可以找到一個 optimal schedule $O$
$\Longrightarrow$ $Max-Lateness(O)$ is minimal.
W.L.O.G. 假設 $O$ 無 idle time
(Case 1.) 如果 $O$ 無 inversions :
那麼 $O$ 與 $S$ 同樣都是沒有 idle time 且不具 inversions 的 schedules,則兩者具有相同的 max lateness,$\Longrightarrow Max-Lateness(S)=Max-Lateness(O)$ is minimal.
(Case 2.) 如果 $O$ 有 inversions :
我們可以經由不斷的 inversion 區間的對調產生一個 Schedule $O’$,但從之前的證明過程我們可以知道 $Max-Lateness(O’)\leq Max-Lateness(O)$
$\Longrightarrow O$ is not optimal. $(\rightarrow\leftarrow)$
補充
Interval-Graph
前面介紹的三種問題型態,都跟 interval 有關,而其中 interval-partition 又跟 graph 有某種程度上的關聯性。那我們能不能將 interval 問題 轉換為 graph 問題 ?
事實上是可以的。我們將每一個 interval 都視為一個 node,如果有 overlap 的兩個 node 我們就給予一條 edge,這樣便可以將interval 問題 轉換為 graph 問題來去處理。
然而,並非所有 interval 問題都可以藉由 graph 來簡化問題,一般我們在生活中遇到的問題都是複雜且困難的,要想利用 graph 配合 greedy algorithm 來處理基本上都是不可行。
但是,簡單的問題上,或許我們可以從這樣的角度來嘗試看看,畢竟 greedy algorithm 的想法很直覺而且比較簡單。
從時間管理 ( Time-management ) 角度來看 interval 問題

在上圖中,你會怎麼安排你的工作優先順序呢 ?
一般人的做法 (包含我) 或許第一時間是這樣安排的 :
$$
I > III > II > IV
$$
但在一般時間管理的角度來看,這樣的安排比較適當 :
$$
I > III > IV > II
$$
差別在於 $II$ 跟 $IV$ 的順序不同。
時間管理專家 (我沒聽清楚名稱) 認為,如果先從事輕且急的工作,把重且緩的工作排程放在後面,最後這些重且緩的工作會演變成為又重又急的工作,這將在後面造成非常大的時間壓力。