【问题标题】:Best way of finding the number of people needed [duplicate]查找所需人数的最佳方法[重复]
【发布时间】:2014-04-22 09:03:34
【问题描述】:

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

以下是数据示例(我使用的是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个人。


我的解决方案

我可以每分钟进行一次迭代并检查我所处的时间范围的数量。最大值将是所需的最少人数。

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

【问题讨论】:

  • 请澄清您的问题
  • 我会做一个甘特图,它会帮助我解释。
  • 不,我没有看到这个问题。我不知道它被称为“重叠”。谢谢!

标签: python algorithm gantt-chart


【解决方案1】:

让我说明一下我的想法,看看这是否合适。令 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) 扫描。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-18
    • 2022-12-15
    • 2018-05-26
    • 2019-03-05
    • 2014-07-22
    • 1970-01-01
    • 2019-11-22
    相关资源
    最近更新 更多