1. 程式人生 > >貪心算法-區間調度問題解之證明

貪心算法-區間調度問題解之證明

text body font 思想 gpo 排序。 開始時間 選擇 指標

一、貪心算法 

  定義:一個算法是貪心算法,如果它是通過一些小的步驟來一個求解,並且在每一步根據局部情況選擇一個決定,使得某些主要的指標得到優化。

二、區間調度問題

  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

}, O = { j1,j2,......,jm } ,既我們要證明k=m;同時,我們假設,A中的需求按照加入到A的順序排序,O中的需求也按照對應區間的自然順序排序。既有:

      對任意的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

) <= f(jr-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是其中一個最優解。

貪心算法-區間調度問題解之證明