假设您有开始和结束时间。
此外,您还会获得一系列作业,以其开始和结束时间来描述。这些作业可能重叠(即,可以同时运行多个作业)。我需要找到一种方法来确定空闲时间和未运行任何工作的时间。
当然,如果任何时候只能运行一个作业,我可以减去每个作业的运行时间,但重叠部分让我难过。
答案 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 )