堆排序的空闲时间

时间:2015-02-04 15:02:06

标签: algorithm

嗨,在算法的教科书中有这个问题,我迷失了,甚至不理解这个问题。这是一个问题:

  

空闲时间。假设并行机器处理N个作业。编写一个程序,在给定作业开始和结束时间列表的情况下,找到机器空闲的最大间隔和机器不空闲的最大间隔。

有人能够先解释这个问题,也许会给我一些非常有用的伪代码吗?

2 个答案:

答案 0 :(得分:2)

您的计算机可以同时执行多个作业。当机器根本不处理任何作业时,它处于空闲状态。您将获得所有作业的开始和停止时间列表,并询问机器何时处于空闲状态,因此当没有作业运行时。

所以给出了这个时间表:

  • 工作1:从00:00开始,到10:00结束
  • 工作2:从11:00开始到12:00结束
  • 工作3:从05:00开始,到06:00结束

机器在10:00到11:00之间闲置,这是唯一且最大的间隔。

如果作业每天重复,则会有另一个间隔时间从12:00到00:00,但为了保持示例简单,您可以假设这些作业只运行一次。

伪代码:

busy = []
for each Job
    find intervals in busy that overlap with job
    if no overlapping intervals are found
        add job interval to busy
    else
       remove overlapping intervals from busy  
       merge overlapping intervals with job interval
       add new interval to busy


find longest busy interval
create non-busy intervals from busy intervals
find longest non-busy interval

答案 1 :(得分:1)

问题未指定成对或单独给出的开始和结束时间。对于不太简单的情况,有一个简单的算法,当它们在这里单独给出时。 因此,我们总是在一个列表中,但如果它开始工作时间或完成工作时间,请保留信息。

例如:

13:00 start    
15:00 finish
8:30  start
10:00 finish
9:00  start    
12:00 finish

然后按时间对此列表进行排序:

8:30  start
9:00  start
10:00 finish
12:00 finish
13:00 start
15:00 finish

我们需要一个打开工作的计数器,我们可以处理列表,处理开始时间时递增计数器,并在处理完成时间时递减计数器;如果counter为0,则表示我们进入空闲状态。

list.sort()
open_jobs = 0
state_changed_time = list[0].time; 
max_idle_interval = -1;
max_not_idle_interval = -1;
for each (element in list)
{
     if (element.type == start)
     {
          if(open_jobs == 0)
          {
               interval = element.time - state_changed_time;
               if (interval > max_idle_interval) max_idle_interval = interval;
               state_changed_time = element.time;
          }
          open_jobs +=1;
     }
     if (element.type == finish) 
     {
          open_jobs -= 1;
          if(open_jobs == 0)
          {
               interval = element.time - state_changed_time;
               if (interval > max_not_idle_interval) max_not_idle_interval = interval;
               state_changed_time = element.time;
          }
     }
}