您提出的問題非常好,這是理解貪心演算法核心的關鍵!證明一個貪心策略能夠得到最佳解通常需要更嚴謹的數學方法,但我們可以透過「交換論證」(Exchange Argument) 或「反證法」來理解為什麼「按結束時間最早排序」是活動選擇問題的最佳策略。
以下是一種常見的證明思路(使用交換論證):
目標: 選擇最大數量的互不重疊活動。
貪心策略:
- 將所有活動按照結束時間由早到晚(升序)排序。
- 選擇排序後的第一個活動(即結束時間最早的活動)。
- 從剩下的活動中,繼續選擇與已選活動不重疊且結束時間最早的活動,直到沒有活動可選。
證明思路(交換論證):
假設存在一個最佳解 OPT = {o_1, o_2, ..., o_k},其選擇了 k 個活動,並且這些活動也是按照結束時間排序的。 同時,我們使用上述貪心策略得到的解是 GREEDY = {g_1, g_2, ..., g_m},其選擇了 m 個活動,同樣按照結束時間排序。 我們想證明 m=k (即貪心解選擇的活動數量與最佳解相同)。
-
比較第一個活動:
- 貪心策略選擇的第一個活動 g1 是所有活動中結束時間最早的。
- 最佳解 OPT 中的第一個活動 o1 的結束時間必然大於或等於 g1 的結束時間 (因為 g1 是最早結束的)。
- 這意味著 finish(g1)≤finish(o1)。
-
構造一個新的最佳解:
- 如果 g1=o1,那麼貪心策略的第一步與最佳解一致。
- 如果 g1=o1,我們可以考慮一個新的活動集合
OPT' = {g_1, o_2, o_3, ..., o_k} (即用 g1 替換掉 o1)。
- 因為 finish(g1)≤finish(o1),所以 g1 與 o2 (以及後續的 o3,...,ok) 不重疊的條件仍然滿足(甚至更好)。如果 o1 和 o2 不重疊,那麼 g1 和 o2 也一定不重疊,因為 g1 結束得更早或一樣早。
- 因此,
OPT' 也是一個包含了 k 個互不重疊活動的解,所以 OPT' 也是一個最佳解。
- 這一步證明了:總是可以找到一個最佳解,它的第一個活動與貪心策略選擇的第一個活動相同。
-
遞迴/歸納論證:
- 現在我們已經證明了,可以假設最佳解的第一個活動就是貪心選擇的 g1。
- 問題就變成了:在排除了 g1 以及所有與 g1 重疊的活動之後,如何在剩下的活動中選擇最多的互不重疊活動。
- 這是一個規模更小的子問題,具有相同的結構。
- 貪心策略會繼續在剩下的活動中選擇結束時間最早的 g2。根據與步驟 2 類似的論證,我們同樣可以證明,存在一個最佳解的子集,其第二個活動是 g2。
- 以此類推,貪心策略選擇的每一個活動,都可以被證明是某個最佳解的一部分。
-
結論:
- 由於貪心策略在每一步都做出了一個「局部最優」的選擇(選擇當前可選活動中結束最早的),並且這個選擇可以被證明是通往「全局最優」路徑上的一步(即它不會排除掉得到最佳解的可能性),因此貪心策略最終得到的活動數量 m 必然等於最佳解的活動數量 k。
- 如果貪心解得到的活動數少於最佳解,那麼在某一步,貪心選擇的活動 gi 會使得後續無法達到最佳解的數量,這與我們每一步都能用 gi 替換最佳解中對應活動 oi 而不影響最優性的結論相矛盾。
為什麼其他策略可能不行?
- 按開始時間最早排序: 如果選擇一個開始很早但持續時間很長的活動,可能會佔用掉很多本可以安排其他更短活動的時間。例如:A(0,10), B(1,3), C(4,6), D(7,9)。按開始時間最早選 A,則只能選 1 個。但選 B, C, D 可以選 3 個。
- 按持續時間最短排序: 可能會選取很多短活動,但它們可能恰好位於一個長活動的時間段內,導致長活動無法被選取,而選取長活動可能是更優的。例如:A(0,3), B(4,7), C(0,7)。按持續時間最短選 A 和 B (各3小時),共 2 個。但選 C (7小時) 也是 1 個。如果 C 是 (0,10),而 A(1,2), B(3,4), E(5,6), F(7,8), G(9,10),選 C 只有 1 個,選其他可以有 5 個。
- 按重疊最少排序: 計算每個活動與其他活動的重疊數量,然後選擇重疊最少的。這個計算本身就很複雜,而且局部重疊最少不一定導致全局最優。
因此,「按結束時間最早排序」的貪心策略之所以有效,是因為它盡快地釋放出資源(時間),為後續盡可能多的活動留出空間。每選擇一個活動,都是在保證當前選擇是「安全」的(不排除最優解)前提下,讓剩餘問題的可用時間段盡可能早地開始。