贪心算法实现

时间:2012-11-27 09:14:29

标签: greedy

所以我有一些问题可以解决调度n活动的问题,这些活动可能会使用尽可能少的课堂重叠。解决方案如下:

  

找到最少数量的课堂来安排一系列活动。有效地完成这项工作   根据开始和结束时间进行活动。保留两个教室列表:在时间t忙的房间和在时间t免费的房间。当t是开始时间   对于某些活动,将此活动安排到免费房间并将房间移动到忙碌列表。   同样,在活动停止时将房间移动到空闲列表。最初从零房间开始。如果   免费清单中没有房间可以创建一个新房间。

     

可以通过对活动进行排序来实现该算法。在每个开始或结束时我们都可以   安排活动并在恒定时间内在列表之间移动房间。因此总时间   以排序为主,因此是O(n lg n)。

我的问题是

1)首先,您如何同时通过开始和结束时间来完成活动?

2)我不太明白如何在不断的时间内在列表之间移动房间。如果您想将房间从忙列表移动到空闲列表,您是否必须遍历忙列表中的所有房间并查看哪些房间已经过了结束时间?

3)在执行此操作时,是否有任何“状态”变量需要跟踪以使其正常工作?

1 个答案:

答案 0 :(得分:2)

  1. 算法的工作方式,您需要创建一个列表,其中包含每个开始时间的元素和每个结束时间的元素(如果有n个活动,则总共包含2n个元素)。对此列表排序。当结束时间和开始时间相等时,首先对结束时间进行排序 - 这将导致大厅的背靠背预订工作。
  2. 如果您使用链接列表来保存免费和预订的大厅,您可以让您在步骤1中创建的元素将指针保持回活动结构,并且此结构可以包含指向包含此大厅的列表元素的指针活动被分配到。这最初将为NULL,并且当该大厅用于该活动时将采用值。然后,当该活动结束时,可以通过跟随活动结束元素的两个指针(第一个到活动对象,从那里到霍尔元素),在恒定时间内查找它的大厅。
  3. 希望如上所述,这应该是明确的。