随叫随到调度算法
On-call Scheduling Algorithm
第一个问题在这里发布,感谢您的帮助!
轮班 DS:
{
hourStart: 0,
hourEnd: 23,
primaryOnCall: "dpeters@example.com",
secondaryOnCall: "mfurgeson@example.com",
}
鉴于 0-23 小时总是有一个“默认”班次,n 个班次可能相互重叠,最早的班次具有最高优先级(默认除外)。轮班可能会重叠到第二天。 Return 涵盖一整天的一系列新班次。
示例输入:
[
{
hourStart: 0,
hourEnd: 23,
primaryOnCall: "dpeters@example.com",
secondaryOnCall: "mfurgeson@example.com",
},
{
hourStart: 18,
hourEnd: 2,
primaryOnCall: "mfrugal@example.com",
secondaryOnCall: "ismith@example.com",
},
{
hourStart: 07,
hourEnd: 15,
primaryOnCall: "jswanson@example.com",
secondaryOnCall: "hcotel@example.com",
}
]
示例输出(无需排序):
[
{
hourStart: 0,
hourEnd: 2,
primaryOnCall: "mfrugal@example.com",
secondaryOnCall: "ismith@example.com",
},
{
hourStart: 3,
hourEnd: 6,
primaryOnCall: "dpeters@example.com",
secondaryOnCall: "mfurgeson@example.com",
},
{
hourStart: 7,
hourEnd: 15,
primaryOnCall: "jswanson@example.com",
secondaryOnCall: "hcotel@example.com",
},
{
hourStart: 16,
hourEnd: 17,
primaryOnCall: "dpeters@example.com",
secondaryOnCall: "mfurgeson@example.com",
},
{
hourStart: 18,
hourEnd: 23,
primaryOnCall: "mfrugal@example.com",
secondaryOnCall: "ismith@example.com",
},
]
我的一位同事建议通过创建一天中每个小时的哈希图来强制执行它,然后在最后循环遍历它以重新创建时间表。如果有什么是固定的(一天总是只有 3 个班次,时间表不重叠,重叠的优先级无关紧要),这将有所帮助,但 none 在这里发挥作用。再次感谢您的阅读,期待您的回复!
有一件事是一天只有 24 小时,因此您可以创建一个具有 24 个槽的 table(以下称为 TimeSlot
),每个槽都可以有一个条目有一个优先编号。这些条目是班次的较小组成部分。每个条目都按班次的开始时间标记为优先级。可以将默认班次设置为 +∞
的优先级,以便它始终获得最低优先级。
例如
决定默认班次if hourStart == 0 && hourEnd == 23
。现在遍历此班次的小时数并将它们逐小时插入 TimeSlot
[Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞)]
移动到下一个插槽,从 18 到 2,现在 TimeSlot
看起来像
[S1(18), S1(18), S1(18), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), S1(18), S1(18), S1(18), S1(18), S1(18), S1(18), S1(18)]
因为所有默认插槽的优先级都低于 S1
。
移动到下一个插槽,从 7 到 15,现在 TimeSlot
看起来像
[S1(18), S1(18), S1(18), Def(+∞), Def(+∞), Def(+∞), Def(+∞), S2(7), S2(7), S2(7), S2(7), S2(7), S2(7), S2(7), S2(7), S2(7), Def(+∞), S1(18), S1(18), S1(18), S1(18), S1(18), S1(18), S1(18)]
再次用 S2
.
替换所有默认插槽(如果有这样的重叠,甚至 S1
)
就是这样。你有时间表。
第一个问题在这里发布,感谢您的帮助!
轮班 DS:
{
hourStart: 0,
hourEnd: 23,
primaryOnCall: "dpeters@example.com",
secondaryOnCall: "mfurgeson@example.com",
}
鉴于 0-23 小时总是有一个“默认”班次,n 个班次可能相互重叠,最早的班次具有最高优先级(默认除外)。轮班可能会重叠到第二天。 Return 涵盖一整天的一系列新班次。
示例输入:
[
{
hourStart: 0,
hourEnd: 23,
primaryOnCall: "dpeters@example.com",
secondaryOnCall: "mfurgeson@example.com",
},
{
hourStart: 18,
hourEnd: 2,
primaryOnCall: "mfrugal@example.com",
secondaryOnCall: "ismith@example.com",
},
{
hourStart: 07,
hourEnd: 15,
primaryOnCall: "jswanson@example.com",
secondaryOnCall: "hcotel@example.com",
}
]
示例输出(无需排序):
[
{
hourStart: 0,
hourEnd: 2,
primaryOnCall: "mfrugal@example.com",
secondaryOnCall: "ismith@example.com",
},
{
hourStart: 3,
hourEnd: 6,
primaryOnCall: "dpeters@example.com",
secondaryOnCall: "mfurgeson@example.com",
},
{
hourStart: 7,
hourEnd: 15,
primaryOnCall: "jswanson@example.com",
secondaryOnCall: "hcotel@example.com",
},
{
hourStart: 16,
hourEnd: 17,
primaryOnCall: "dpeters@example.com",
secondaryOnCall: "mfurgeson@example.com",
},
{
hourStart: 18,
hourEnd: 23,
primaryOnCall: "mfrugal@example.com",
secondaryOnCall: "ismith@example.com",
},
]
我的一位同事建议通过创建一天中每个小时的哈希图来强制执行它,然后在最后循环遍历它以重新创建时间表。如果有什么是固定的(一天总是只有 3 个班次,时间表不重叠,重叠的优先级无关紧要),这将有所帮助,但 none 在这里发挥作用。再次感谢您的阅读,期待您的回复!
有一件事是一天只有 24 小时,因此您可以创建一个具有 24 个槽的 table(以下称为 TimeSlot
),每个槽都可以有一个条目有一个优先编号。这些条目是班次的较小组成部分。每个条目都按班次的开始时间标记为优先级。可以将默认班次设置为 +∞
的优先级,以便它始终获得最低优先级。
例如
决定默认班次if hourStart == 0 && hourEnd == 23
。现在遍历此班次的小时数并将它们逐小时插入 TimeSlot
[Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞)]
移动到下一个插槽,从 18 到 2,现在 TimeSlot
看起来像
[S1(18), S1(18), S1(18), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), S1(18), S1(18), S1(18), S1(18), S1(18), S1(18), S1(18)]
因为所有默认插槽的优先级都低于 S1
。
移动到下一个插槽,从 7 到 15,现在 TimeSlot
看起来像
[S1(18), S1(18), S1(18), Def(+∞), Def(+∞), Def(+∞), Def(+∞), S2(7), S2(7), S2(7), S2(7), S2(7), S2(7), S2(7), S2(7), S2(7), Def(+∞), S1(18), S1(18), S1(18), S1(18), S1(18), S1(18), S1(18)]
再次用 S2
.
S1
)
就是这样。你有时间表。