Greedy的基本思路
用一个方法在每一个阶段找到最好的决策。在算法终止时,可以得到全局最优解。
问题
Interval Scheduling Problem:
- a set of request { 1 , 2 , . . . , n } \{1, 2, ..., n\} {1,2,...,n}
- i t h i^{th} ith request corresponds to an interval of time with starting at s i s_i si and finishing at f i f_i fi
基本定义
Compatible: No two of the requests overlap in time.
Optimal: Compatible sets of maximum size.
问题
局部最优选择方法:
- 选择最早结束的任务 i i i。
- 删除所有与 i i i 时间重合的任务 (non-compatible request)。
- 从剩余的任务中选择结束时间最早的(如此往复,直到没有任务可以选择)。
算法伪代码
令
R
R
R 为既没有被 accept 也没有被 reject 的 requests 的集合。
令
A
A
A 为被 accept 的 requests 的集合。
- Initially let R R R be the set of all requests, and let A A A be empty
- While R R R is not yet empty
- \quad\quad Choose a request i ∈ R i \in R i∈R that has the smallest finishing time
- \quad\quad Add request i i i to A
- \quad\quad Delete all request from R R R that are not compatible with request i i i
- EndWhile
- Return the set A A A
定理
证明思路:
令
O
\mathcal{O}
O 为 optimal set of interval (最优解集)
令
A
=
{
i
1
,
i
2
,
.
.
.
,
i
k
}
A=\{ i_1, i_2, ..., i_k\}
A={i1,i2,...,ik}
令
O
=
{
j
1
,
j
2
,
.
.
.
,
j
m
}
\mathcal{O}=\{ j_1, j_2, ..., j_m\}
O={j1,j2,...,jm}
WTS:
∣
A
∣
=
∣
O
∣
|A|=|\mathcal{O}|
∣A∣=∣O∣, 即
k
=
m
k=m
k=m
在前半部分
A
A
A 与
O
\mathcal{O}
O 一样,但是后面
A
A
A 每一步更好
定理1: A A A is a compatible set of request.
定理2: For all indices
r
≤
k
r\leq k
r≤k, we have
f
(
i
r
)
≤
f
(
j
r
)
f(i_r)\leq f(j_r)
f(ir)≤f(jr).
证明:(归纳法)
r
=
1
:
i
1
r=1 : i_1
r=1:i1 has the minimum finishing time, 所以一定有
f
(
i
1
)
≤
f
(
j
1
)
f(i_1)\leq f(j_1)
f(i1)≤f(j1)
假设
f
(
i
r
−
1
)
≤
f
(
j
r
−
1
)
f(i_{r-1})\leq f(j_{r-1})
f(ir−1)≤f(jr−1)
因为
O
\mathcal{O}
O 是 compatible set,
f
(
j
r
−
1
)
<
s
(
j
r
)
f(j_{r-1})<s(j_{r})
f(jr−1)<s(jr)
∴
\therefore
∴
f
(
i
r
−
1
)
<
s
(
j
r
)
f(i_{r-1})<s(j_r)
f(ir−1)<s(jr)
因此 request
i
r
−
1
i_{r-1}
ir−1 和 request
j
r
j_r
jr 的时间不重叠,即
j
r
∈
R
j_r \in R
jr∈R
∵
\because
∵ Greedy Algorithm 选择
f
f
f 最小的 available interval 且
j
r
∈
R
j_r \in R
jr∈R
∴
\therefore
∴
f
(
i
r
)
≤
f
(
j
r
)
f(i_r)\leq f(j_r)
f(ir)≤f(jr)
定理2表明了 Greedy Algorithm remains ahead of O \mathcal{O} O
定理3: The greedy algorithm returns an optimal set
A
A
A.
证明:(反证法)
若
A
A
A 不是最优的,那么
∣
O
∣
>
∣
A
∣
|\mathcal{O}|>|A|
∣O∣>∣A∣, 即
m
>
k
m>k
m>k.
由定理2,当
r
=
k
r=k
r=k时,
f
(
i
k
)
≤
f
(
j
k
)
f(i_k)\leq f(j_k)
f(ik)≤f(jk)。
∵
m
>
k
\because m>k
∵m>k
∴
\therefore
∴
j
k
+
1
∈
O
j_{k+1} \in \mathcal{O}
jk+1∈O
j
k
+
1
j_{k+1}
jk+1 在
j
k
j_k
jk 结束之后才开始,因此
j
k
+
1
j_{k+1}
jk+1 也是在
i
k
i_k
ik 结束之后才开始的,即
j
k
+
1
∈
R
j_{k+1} \in R
jk+1∈R
但是我们假设贪婪算法在
i
k
i_k
ik 之后就结束了,矛盾
Implementation
Run-time: O ( n log n ) O(n \log n) O(nlogn)
- sort the requests in order of finishing time and label them, i.e., f ( i ) < f ( j ) f(i)<f(j) f(i)<f(j) when i < j i<j i<j. O ( n log n ) \quad \quad \quad O(n \log n) O(nlogn)
- Construct and array S [ 1... n ] S[1... n] S[1...n] ( S [ i ] = s ( i ) S[i]=s(i) S[i]=s(i)). O ( n ) \quad \quad \quad O(n) O(n)
- 选择 finishing time 最小的,然后按顺序查找一个 s ( j ) ≥ f ( 1 ) s(j) \geq f(1) s(j)≥f(1) 的 interval ,并选择它。如此往复。 O ( n ) \quad \quad \quad O(n) O(n)