问题陈述
我们有一个雇主想要面试 N 个人,因此安排了 N 个面试名额。每个人都有这些时段的闲忙时间表。如果可能,请给出一个算法,将 N 人安排到 N 个插槽中,如果不可能,则返回标志 / 错误 / 等。最快的运行时复杂度是多少?
到目前为止我的方法
天真:有N个!安排N个人的方法。遍历所有这些,对于每个排列,检查它是否可行。在! )
回溯:
- 寻找任何只能有 1 人的面试时间段。安排此人,将其从候选人列表中删除并删除空档。
- 寻找任何只能进入 1 个位置的候选人。安排此人,将其从候选人列表中删除并删除空档。
- 重复 1 和 2,直到不再有类似的组合。
- 选择一个人,将他们随机安排到他们可用的位置之一。记住这个操作。
- 重复 1、2、3,直到我们有时间表或出现无法解决的冲突。如果我们有时间表,请将其退回。如果存在无法解决的冲突,请回溯。
这是 O(n!) 最坏的情况,我认为 - 这也好不到哪里去。
也可能有一个 DP 解决方案 - 但我还没有看到它。
其他想法
问题可以用 NxN 矩阵表示,其中行是“槽”,列是“人”,值为“1”表示空闲,“0”表示忙碌。然后,我们在这个矩阵中寻找一个行列交换的单位矩阵。步骤 1 和 2 正在寻找只有一个“1”的行或列。(如果矩阵的秩=N,则表示有解。但反之不成立)另一种看待它的方法是将矩阵视为未加权的有向图边矩阵。然后,每个节点代表 1 个候选和 1 个槽。然后,我们正在寻找一组边,以便图中的每个节点都有一条出边和一条入边。或者,如果有 2 个节点,它将是一个二分图。
矩阵示例:
1 1 1 1
0 1 1 0
1 0 0 1
1 0 0 1