找到所需人数的最佳方式

时间:2014-04-22 09:03:34

标签: python algorithm gantt-chart

我有一些日常数据,包含动作的开始时间和结束时间。每个动作都需要一个人。我想知道我需要多少人。

这是一个数据示例(我正在使用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']

这是问题的甘特图: Gantt-chart

我们可以看到6个动作将在同一时间完成。所以我们需要6个人。


我的解决方案

我可以每隔几分钟迭代一次并检查我所在的时间范围的数量。最大值是所需的最小人数。

我正在寻找更好的算法来实现这一目标。

1 个答案:

答案 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)扫描。