貪心算法(Greedy Algorithm)之活動選擇問題(Activity-Selection Problem)

活動選擇問題是《算法導論》裏面關於貪心算法的第一個問題。這個問題是這樣的。我們有一組活動,每個活動都有一個開始時間Si和結束時間Fi。如下圖:

image

每個活動都共享同一個公共的資源(比如教室等)所以同一時間只能有一個活動。現在的問題就是要在指定的時間內讓舉辦的活動數量做大。

這個問題是貪心算法一個典型的應用。說到貪心,貪心基本解決問題的方案就是

#1.儘可能在局部找到一個最優的解

#2然後證明這個局部的優化解是全局優化解的一部分

#3最後把這個局部解用遞歸或者迭代的方式推廣到全局。

所謂貪心,一般都會把帶選擇的資源做個權重的排序,每次的最優化子結構的選取其實就是最大權重的選取。就這個活動選擇問題而言,我們將所有的活動結束時間排序。這裏的局部最優解就是指到特定的時間Fi爲止的最優解。這個最優解的貪心意義體現在每次最優解利用了最早結束時間,從而是剩餘時間最大化。

以上的activity_selector函數就是這樣的一個迭代的解。在迭代的過程中,每次都保留一個最近選擇活動的index,或者說最近活動的結束時間。用來給後面的活動做比較。(這裏的函數實現的不是很妥當,我加入了一些debug信息什麼的。)

需要注意的事情是,這個算法非常高效。僅用O(n)的時間就可以找到解決方案。如果動態規劃的話。下面就是他的遞歸式:

image2

簡單地說就是從活動i到j的選擇策略就是i-k和k-j的最大策略加1。這個表達式不由讓我們想起了矩陣鏈乘的O(n^3)複雜度.

 

 

 

發佈了70 篇原創文章 · 獲贊 9 · 訪問量 47萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章