活動安排問題 – 資源爭奪
- 問題描述
- 設有 n 個活動的集合 A = {1, 2, … , n}, 其中每個活動都要求使用同一資源,而在同一時間段內只有一個活動能使用資源
- 要求高效安排一系列爭用公共資源的活動
- 問題本質
- 在所給活動活動集合中選出最大相容活動子集 X
- 實例: 多個部門申請佔用一個資源
部門 | 物理 | 數學 | 化學 | 外語 | 生物 | 音樂 | 計算機 |
---|---|---|---|---|---|---|---|
起始時間 | 8 | 9 | 11 | 7 | 10 | 6 | 8 |
結束時間 | 9 | 10 | 12 | 10 | 12 | 8 | 11 |
-
問題描述
- 輸入: n(問題規模), s[i](開始時間),f[i](終止時間)
- 輸出: count(存放活動總數), x[n](邏輯數組:活動被安排爲 1,未被安排爲 0)
- 策略
- s[i] (起始時間) ×
- Δt (活動時間) ×
- f[i] (結束時間)√
顯然s[i] 和 Δt 不能作爲衡量標準,而f[i] 可以作爲衡量標準
-
算法實現
- 預處理: f[i] 非遞減序列
- 貪心選擇
- 最早完成的活動優先加入相容集合 x
使剩餘活動可安排時間段極大化,相容活動集最大
s[i] >= f[j] or s[j] >= f[i] -
設計分析
- 若輸入的活動已就序
- 算法實現最大相容集時間: O(n)
- 若給出的活動爲就序
- 重排: O(nlogn), 求最大相容集: O(n)
- T(n) = O(nlogn) + O(n) = O(nlogn)
- 算法中的3個數組和4個普通變量佔用存儲空間
- S(n) = O(3n) + O(4) = O(n)
- 若輸入的活動已就序