貪心算法-區間調度問題解之證明
一、貪心算法
定義:一個算法是貪心算法,如果它是通過一些小的步驟來一個求解,並且在每一步根據局部情況選擇一個決定,使得某些主要的指標得到優化。
二、區間調度問題
1. 問題:我們有一組需求{1,2,3,......,N},第i個需求與一個開始時間s(i),結束時間f(i)相對應。如果沒有兩個需求在時間上重疊,我們就說需求的子集是相容的。
2. 目標:尋找一個最大的相容子集O.
3. 算法:
初始令R是所有需求的集合,設A為空
While ( |R| > 0 )
選擇一個最早結束的需求
把i加入到A中
在R中刪除所有與i不相容的需求
End
返回集合A作為被接受的需求的集合
算法規則:該貪心算法的規則是,每一步選擇一個最早結束的需求,盡快釋放資源。
4. 證明算法的正確性:
假設O是最優解,由於最優解可能有多個,所以,我們只需要證明|A|=|O|,既證明集合A與集合O包含的需求個數相等。顯然,A,O都是相容的,既A,O中的任意兩個需要都不會重疊。
算法思想:該證明主要是想找出這樣一種認識,我們的貪心算法“領先”於這個最優解O. 我們把貪心算法構造的部分解與最優解O初始的一段進行比較,並且證明貪心算法以一步接一步的方式做的更好。
假設,A = { i1,i2,......,ik
對任意的i,有 f(ir) <= s(ir+1)
對任意的j,有 f(jr) <= s(jr+1)
現用數學歸納法證明k=m
1)r=1 , 顯然有f(i1) <= f(j1)
因為,貪心算法每一步驟都是選擇最早結束的區間,故而有f(i1) <= f(j1)
2)假設第r-1步有,f(ir-1) <= f(jr-1)
3)第r步,證明f(ir-1
因為O是相容的,故而有:f(jr-1) <= s(jr)
又因為:f(ir-1) <= f(jr-1)
所以:f(ir-1) <= f(jr-1) <= s(jr)
既:f(ir-1) <= s(jr)
根據以上貪心算法知,在第r步區間jr 還在R中,而貪心算法的第r步是要在R中選擇一個最早結束的區間ir,所以有:f(ir) <= f(jr)
總結: 對任意的r,都有f(ir) <= f(jr)
現在用反證法證明m=k,既A是最優解:
假設A不是最優解,既O中存在一個需求jk+1,該需求在jk 結束之後開始,又因為f(ik) <= f(jk),故而在需求也在ik 結束之後開始,故而jk+1與 i1,i2,......,ik相容,所以jk+1在R中;而由貪心算法知,該算法結束時R為空,故而矛盾。所以A是其中一個最優解。
貪心算法-區間調度問題解之證明