CLRS 習題 16.1-3 Interval-graph Coloring Problem
Posted on 2007-10-14 00:48 ZelluX 閱讀(1507) 評論(2) 編輯 收藏 所屬分類: Algorithm問題:
已知一些活動的起止時間{Si}, {Fi},把它們安排在若干個大廳中進行,要求任一大廳任意時間段內不能有兩項活動同時進行,求出所需的最少的大廳數。
分析:(from CLRS Instructor's Manual)
這是一個區間圖的著色問題(Interval-graph Coloring Problem),用點表示活動,把時間沖突的活動連起來,然后進行點的著色,要求同一線段的兩端不能有相同顏色的點。
首先最容易想到的就是用書上的Greedy-Activity-Selector找出可安排在大廳1的最長序列,然后刪去這些活動,再次調用該方法,找出安排在大廳2的活動,以此類推。
復雜度O(n*n)
還有一個O(n*logn)的算法,甚至在起止時間都是比較小的數字時復雜度只有O(n)。
主要思想是依次遍歷每個活動,把它們安排到不同的大廳中。
維護兩張表,一張記錄當前時間t已經安排了活動的大廳,另一張記錄當前時間空閑的大廳
然后從頭掃描排序后的時間點序列(如果事件a的結束時間等于時間b的開始時間,那么前者應該排在后者后面)
碰到開始時間t,把該活動放到空閑列表的第一個大廳中(如果空閑列表為空則新加一個大廳),然后把該大廳放入已安排的大廳列表中;
碰到結束時間t,從已安排的大廳列表中移出相應大廳到空閑列表。
復雜度分析:
排序:O(n logn),如果時間范圍有限制還可以做到O(n)
處理:O(n)
已知一些活動的起止時間{Si}, {Fi},把它們安排在若干個大廳中進行,要求任一大廳任意時間段內不能有兩項活動同時進行,求出所需的最少的大廳數。
分析:(from CLRS Instructor's Manual)
這是一個區間圖的著色問題(Interval-graph Coloring Problem),用點表示活動,把時間沖突的活動連起來,然后進行點的著色,要求同一線段的兩端不能有相同顏色的點。
首先最容易想到的就是用書上的Greedy-Activity-Selector找出可安排在大廳1的最長序列,然后刪去這些活動,再次調用該方法,找出安排在大廳2的活動,以此類推。
復雜度O(n*n)
還有一個O(n*logn)的算法,甚至在起止時間都是比較小的數字時復雜度只有O(n)。
主要思想是依次遍歷每個活動,把它們安排到不同的大廳中。
維護兩張表,一張記錄當前時間t已經安排了活動的大廳,另一張記錄當前時間空閑的大廳
然后從頭掃描排序后的時間點序列(如果事件a的結束時間等于時間b的開始時間,那么前者應該排在后者后面)
碰到開始時間t,把該活動放到空閑列表的第一個大廳中(如果空閑列表為空則新加一個大廳),然后把該大廳放入已安排的大廳列表中;
碰到結束時間t,從已安排的大廳列表中移出相應大廳到空閑列表。
復雜度分析:
排序:O(n logn),如果時間范圍有限制還可以做到O(n)
處理:O(n)