C++编程笔记:贪心算法实现活动安排问题
問題描述:
設有n個活動的集合E={1,2,…,n},其中,每個活動都要求使用同一資源,而在同一時間內只有一個活動能使用這一資源。每個活動i都有一個要求使用該資源的起始時間si和一個結束時間fi,且si<fi。如果選擇了活動i,則它在半開區間[si,fi)內占用資源。若區間[si,fi)與區間[sj,fj)不想交,則稱活動i與活動j是相容的。也就是說,當si>=fj或sj>=fj時,活動i與活動j相容?;顒影才艈栴}就是要在所給的活動集合中選出最大的相容活動子集合。
細節須知:
暫無。
算法原理:
a.對活動進行排序
將各活動的起始時間和結束時間存儲于數組中并按結束時間進行非減序排列,如果所給出的活動未按此序排列,可以進行重排。
b.依次向后尋找相容的且結束時間最早活動
算法開始選擇活動1,并將j初始化為1。然后依次檢查活動i是否與當前已選擇的所有活動相容,若相容則將活動i加入已選擇活動的集合A中;否則,不選擇活動i,而繼續檢查下一活動與集合A中活動的相容性。由于fj總是當前集合A中所有活動的最大結束時間,故活動i與當前集合A中所有活動相容的充分且必要的條件是其開始時間si不早于最近加入集合A的活動j的結束時間fi。若活動i與之相容,則i成為最近加入集合A中的活動,并取代活動j的位置。由于輸入的活動以其完成時間的非減序排列,所以算法每次總是選擇具有最早完成時間的相容活動加入集合A中。直觀上,按這種方法選擇相容活動為未安排活動留下盡可能多的時間。也就是說,該算法的貪心選擇的意義是使剩余的可安排時間段極大化,以便安排盡可能多的相容活動。
程序設計思路:
① 數據結構:結構體中存儲活動序號、活動開始時間、活動結束時間;
② 利用C++自帶的sort函數對結構體按照活動結束時間進行升序排列;
③ 算法開始選擇活動1,并將j初始化為1。然后依次檢查活動i是否與當前已選擇的所有活動相容,若相容則將活動i加入已選擇活動的集合A中;否則,不選擇活動i,而繼續檢查下一活動與集合A中活動的相容性。由于fj總是當前集合A中所有活動的最大結束時間,故活動i與當前集合A中所有活動相容的充分且必要的條件是其開始時間si不早于最近加入集合A的活動j的結束時間fi。若活動i與之相容,則i成為最近加入集合A中的活動,并取代活動j的位置。由于輸入的活動以其完成時間的非減序排列,所以算法每次總是選擇具有最早完成時間的相容活動加入集合A中。
時間復雜性分析:
首先,需要對輸入的事件按照結束時間進行非減序排列,需要用O(nlogn)的時間。其次,算法greedySelector的效率極高,當輸入的活動已按結束時間的非減序排列,算法只需θ(n)的時間安排n個活動,使最多的活動能相容地使用公共資源。
生成的數據可導入EXCEL中進行數據分析生成分析圖表。
博客園:Weisswire
學習C/C++編程可以湫湫掃下方二維碼,學習編程,碼上開始!
?
總結
以上是生活随笔為你收集整理的C++编程笔记:贪心算法实现活动安排问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Aix vmstat命令解析
- 下一篇: ASP.NET 常见参考项目的 UI、B