给定开始/结束时间数组的总空闲时间的算法

时间:2009-04-14 17:09:11

标签: algorithm

假设您有开始和结束时间。

此外,您还会获得一系列作业,以其开始和结束时间来描述。这些作业可能重叠(即,可以同时运行多个作业)。我需要找到一种方法来确定空闲时间和未运行任何工作的时间。

当然,如果任何时候只能运行一个作业,我可以减去每个作业的运行时间,但重叠部分让我难过。

6 个答案:

答案 0 :(得分:12)

对时间进行排序,然后按顺序运行它们 如果时间是开始时间,请将运行的任务数加1 如果是停止时间,则减去1.
跟踪任务数量为0时的时间。

答案 1 :(得分:6)

将所有开始和结束时间放入单个数组中,将它们标记为开始或结束时间。按时间排序数组。现在遍历排序列表,记录正在运行的作业数量:

  • 在读取开始时间时递增计数器
  • 在阅读结束时间时递减计数器

每当从0增加到1时,将(current_time - previous_time)添加到总空闲时间。如有必要,请记住特殊情况的开始和结束。

答案 2 :(得分:3)

这是一种略有不同的方法。第一部分是为了说明目的。

创建一个表示所有作业的完整时间轴的整数数组。这可以是几小时,几分钟或任何你需要的。我会假设几个小时。找到最早的开始时间和最晚的结束时间来设置数组的大小。将所有元素初始化为零。

循环执行每个作业,在作业运行的每个小时的时间线中递增计数器。因此,如果一份工作从下午3点到下午5点运行,那就是两个小时,所以你要增加3小时和4小时的时间段,以表明工作在这几个小时内正在运行。

遍历时间轴,记录您遇到的零数。那些是没有工作的时间段。

现在,如果您了解这一点,那么摆脱阵列非常容易。而不是创建(大型)数组,只需跟踪整个时间线的开始和结束时间。对于该范围中的每个小时,循环遍历所有作业,并查看在此期间运行的数量。任何零都是空闲时间。

答案 3 :(得分:0)

Sort the jobs based on their end times.

Jobs<startTime,EndTime>[] = contains the Sorted list.

Take first Job in the list
Jobs[0]

intialize:
    EndTime = Job[0].EndTime
    StartTime = Job[0].StartTime
     idleTime =0;

For i = 1 till Jobs.size
{
    if ( Jobs[i].EndTime >= StartTime )
    {
        //Do nothing, its overlapping
    }
    else
    { //Previoys Job time doesnot overlap, so get the idle time.
        idleTime += (StartTime -Jobs[i].EndTime);
    }

     StartTime = Jobs[i].StartTime;
     EndTime = Jobs[i].EndTime;
}

答案 4 :(得分:0)

当一个或多个作业正在运行时,您有繁忙的时间。 空闲时间是繁忙组块之间的时间跨度的总和。 伪代码:

idle_time = 0
sort jobs by start time
foreach job in jobs
{
  if (job.start > current_chunk.end)
  {
    idle_time += job.start - current_chunk.end
  }
  if (job.end > current_chunk.end)
  {
    current_chunk.end = job.end
  }
}

注意:为简单起见,我省略了处理第一个元素的代码。

答案 5 :(得分:0)

我们有2个阵列的开始时间和结束时间。作业可以像下面的两个示例数组一样重叠。

startTime = [2.1, 5.0, 8.3, 14.1 ,16.5, 24.2 ,28.1, 40.6 ,42.3 , 45.4 ]
endTime =  [4.0 ,10.0 ,9.3 ,18.1 ,26.5 ,25.3, 36.6 ,60.6, 44.3 ,55.4]

我们必须计算系统的空闲时间。在这种情况下,计算为: Total idle time = 2.1 + (5.0-4.0) + (14.1-10.0) + (28.1-26.5) + (40.6-36.6) = 12.8 units

因此,解决方案是:

startTime = [2.1 , 5.0  , 8.3 , 14.1 , 16.5 , 24.2 , 28.1 , 40.6 , 42.3 ]
endTime =   [4.0 , 10.0 , 9.3 , 18.1 , 26.5 , 25.3 , 36.6 , 60.6 , 44.3 ]

if len(startTime)>0:
    idleTime = startTime[0];
    eT =  endTime[0];
    i = 1 
    while i < len(startTime):
        if startTime[i]>eT:
            idleTime += (startTime[i] -eT)
            eT = endTime[i]
        else:
            if endTime[i]>eT:
                eT = endTime[i]
        i+=1
    print("Idle Time is : " , idleTime )    
else:
    print ("Idle Time is : " , 0 )