我有一批用户,每个用户都有一个指定的开始和结束时间,例如:
{ Name = "Peter", StartTime = "10:30", EndTime = "11:00" },
{ Name = "Dana", StartTime = "11:00", EndTime = "12:30" },
{ Name = "Raymond", StartTime = "10:30", EndTime = "14:00" },
{ Name = "Egon", StartTime = "12:00", EndTime = "13:00" },
{ Name = "Winston", StartTime = "10:00", EndTime = "12:00" }
我希望根据它们重叠的时间将它们放入桶中(基于可配置的阈值,例如,它们需要至少重叠半个小时)。我希望桶理想情况下是4个项目,但接受任何2-5范围内的项目。
在上面的示例中,没有4个人匹配,因此我会有一个3个人的桶(Peter,Raymond,Winston)和一个2人的桶(Dana,Egon)。
我已经设计出了一个算法,似乎依赖于机会而不是科学:
- 按StartTime对列表进行排序
- 创建一个空桶
- 从列表中选择第一个用户
- 将该用户与桶中的所有用户进行比较
- 如果该用户与桶中的每个人都重叠,请将该人放入其中并将其从列表中删除
- 如果桶达到理想大小(4),或者我正在循环并检查同一用户超过三次,则关闭桶并创建新的空桶
我可以更改算法,从列表中删除所有理想的桶并重新洗牌并再次尝试,但我觉得这应该是一个常见的问题 - 就像工人的转移任务或背包问题一样。
有人知道这种类型问题的标准算法吗?
(标记组合数学,因为我认为这适用于数学领域,如果我错了请纠正我)