活动安排问题

重新考虑讲稿中活动安排问题。不同的是,我们有两个礼堂可供使用。我们把问题重新定义一下。假设我们有n 个活动,a1a2 …, an,申请使用大礼堂。每个活动ai (1 £ i £ n) 有一个固定的开始时间si和一个结束时间fi0 £ si < fi < ¥我们有两个礼堂,H-1H-2,可供使用,都从t = 0开始。安排在同一礼堂的活动必须两两兼容。请设计一个O(nlgn)的贪心法的算法来找出最佳的活动调度计划使得总共被安排的活动数最大。

解:

解题的思路和解一个礼堂的问题相同。我们先把n 个活动按它们的完成时间排序,使f1 £ f2 ££fn然后从第一个活动开始,逐个检查,并作出决定如何安排。我们用变量Available-Time-1记录礼堂H-1目前的可用时刻。也就是说,下一个活动只能安排在时刻Available-Time-1之后。同理,我们用变量Available-Time-2记录礼堂H-2目前的可用时刻。开始时,Available-Time-1= Available-Time-2 = 0。从第一个活动开始,对每个活动ai(1 £ i £ n) 逐个作出决定的规则如下:(假设Available-Time-1 ³ Available-Time-2,否则对称处理。)

(1)     Available-Time-1£ si,那么把ai安排在H-1,并更新Available-Time-1fi 

(2)     如果Available-Time-2 £ si < Available-Time-1,那么把ai安排在H-2,并更新Available-Time-2fi 

(3)     如果si < Available-Time-2,则丢弃不安排。

下面是伪码。正确性证明随后。

 

Two-hall-schedule (A[1..n], S1, S2)

  1.  Available-Time-1¬ Available-Time-2 ¬ 0
  2. S1 ¬ S2 ¬ F
  3. Sort activities such that f1 £ f2 ££fn                 //按完成时间排序
  4. for i ¬1 to n do

5.        if Available-Time-1 ³ Available-Time-2

6.              then if Available-Time-1£ si

  1.            then {       S1 ¬ S1 È { ai }
  2.                               Available-Time-1 ¬ fi 
  3.                     }

10.              else if Available-Time-2 £ si

  1.                              then {       S2 ¬ S2 È { ai }
  2.                                       Available-Time-2 ¬ fi 
  3.                                                         }

14.           else if Available-Time-2 £ si

  1.            then {       S2 ¬ S2 È { ai }
  2.                               Available-Time-2 ¬ fi 
  3.                     }

18.              else if Available-Time-1 £ si

  1.                              then {       S1 ¬ S1 È { ai }
  2.                                       Available-Time-1 ¬ fi 
  3.                                                         }
  4. End

 

正确性证明

 

我们用归纳证明,有一个最优解和上述算法得到的解完全相同。

归纳基础。

我们证明 a1一定会被某个最优解选中。如果不是,那么假定ak 是最优解在H-1中有最小完成时间的活动。我们可以用a1换走ak。所得的解仍然最优。如果最优解选中了a1但安排在H-2中,那我们可以把在H-1中的所有活动与H-2中的所有活动交换,这样得到的解仍然最优且a1H-1中。

归纳步骤。

假设到第i步为止,即算法处理完以后,有一个最优解,它对a1ai的处理与算法完全一样。下面证明,存在一个最优解,它对a1ai+1的处理与算法完全一样。假设有一个最优解M,它对a1ai的处理与算法完全一样。现在考虑三种情况。

(1)     si+1  <  Min {Available-Time-2Available-Time-2}

如果是这种情况,最优解不可能选中ai+1,所以它与算法处理结果一样,即丢弃之。

(2)     si+1  ³ Available-Time-1 ³ Available-Time-2 (对称情况为si+1  ³ Available-Time-2 ³ Available-Time-1)

在这种情况下,如果最优解根本不取ai+1,而在H-1中安排的下一个结束最早的活动是ak,那么,我们用ai+1 换走ak所得的解仍然最优。如果最优解安排ai+1H-2,那么因为si+1  ³ Available-Time-1 ³ Available-Time-2,我们可以把ai+1以后(包括ai+1)的安排在H-1的所有活动与安排在H-2的所有活动交換。这样得到的解仍然最优且ai+1H-1中。这个道理图示如下。同理可证其对称情况。所以,有一个最优解,它对a1ai+1的处理与算法完全一样。

 

 

Figure 最优解总可以把ai+1安排在H-1

 

(3)     Available-Time-2 £ si+1 < Available-Time-1 (对称情况为Available-Time-1 £ si+1 < Available-Time-2)

这种情况下,最优解不可能安排ai+1H-1。如果最优解不取ai+1,而在H-2中安排的下一个结束最早的活动是ak,那么,我们用ai+1 换走ak所得的解仍然最优。所以,有一个最优解,它对a1ai+1的处理与算法完全一样。

以上证明了算法的正确性。算法的复杂度取决于排序,所以是O(nlgn)。如果排序是事先做好,则算法有O(n)线性复杂度。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值