我有一些日常数据,包含动作的开始时间和结束时间。每个动作都需要一个人。我想知道我需要多少人。
这是一个数据示例(我正在使用python):
[str(d.start) + " || " + str(d.end) for d in dailyJobs]
>> ['2013-08-09 07:30:00 || 2013-08-09 11:45:00',
'2013-08-09 07:25:00 || 2013-08-09 10:45:00',
'2013-08-09 07:35:00 || 2013-08-09 10:35:00',
'2013-08-09 09:35:00 || 2013-08-09 12:05:00',
'2013-08-09 10:15:00 || 2013-08-09 13:20:00',
'2013-08-09 09:15:00 || 2013-08-09 12:55:00',
'2013-08-09 12:35:00 || 2013-08-09 15:35:00',
'2013-08-09 13:05:00 || 2013-08-09 15:25:00',
'2013-08-09 17:10:00 || 2013-08-09 18:32:44']
这是问题的甘特图:
我们可以看到6个动作将在同一时间完成。所以我们需要6个人。
我的解决方案
我可以每隔几分钟迭代一次并检查我所在的时间范围的数量。最大值是所需的最小人数。
我正在寻找更好的算法来实现这一目标。
答案 0 :(得分:0)
让我说明一下我的想法,看看这是否合适。设L是具有计数的非重叠时间范围的有序列表。最初L是空的。
对于dailyJobs中的每个时间范围d,d可能与L中的某个时间范围重叠。
例如:
L: [ c ][ c ][ c ][ c ]
d: [ ]
结果:
L: [ c ][c ][c+1 ][c+1][c+1 ][ c ]
这是合并L和d s.t. L仍然是非重叠时间范围的有序列表。在dailyJobs中迭代所有d之后,遍历L中的条目以获得最大值。计数。
当然,你也可以保留一个maxCount变量s.t.在L和d的每个合并中,你将这个变量保持为最大计数s.t.你可以避免最后的O(n)扫描。