問題文
N 人の面接を希望する雇用主が 1 人いるため、N 人の面接枠を作成します。すべての人は、それらのスロットの空き時間スケジュールを持っています。可能であれば N 人を N スロットにスケジュールするアルゴリズムを与え、それが不可能な場合はフラグ / エラー / などを返します。可能な限り最速の実行時の複雑さは?
これまでの私のアプローチ
ナイーブ: N あります! N 人をスケジュールする方法。それらすべてを調べて、順列ごとに実行可能かどうかを確認します。の上! )
バックトラッキング:
- 1 人しか参加できない面接の時間枠を探します。その人をスケジュールし、候補者のリストから削除し、スロットを削除します。
- 1 つのスロットにのみ入ることができる候補者を探します。その人をスケジュールし、候補者のリストから削除し、スロットを削除します。
- そのような組み合わせがなくなるまで、1と2を繰り返します。
- 人を選び、利用可能なスロットの 1 つにランダムにスケジュールします。この操作を覚えておいてください。
- スケジュールが決まるまで、または解決できない競合が発生するまで、1、2、3 を繰り返します。スケジュールがある場合は、それを返します。解決できない競合がある場合は、バックトラックします。
これは O( n! ) の最悪のケースだと思います - これ以上良くはありません。
DP ソリューションもあるかもしれませんが、まだ見ていません。
他の考え
問題は NxN マトリックスで表すことができます。行は「スロット」、列は「人」、値は空きの「1」とビジーの「0」です。次に、この行列内で行と列が入れ替わった恒等行列を探します。ステップ 1 と 2 は、「1」が 1 つしかない行または列を探しています。(行列の階数が = N の場合、I は解があることを意味します。しかし、その逆は成立しません) 別の見方として、行列を重み付けされていない有向グラフ エッジ行列として扱うこともできます。次に、ノードはそれぞれ 1 つの候補と 1 つのスロットを表します。次に、グラフ内のすべてのノードが 1 つの出力エッジと 1 つの入力エッジを持つようにエッジのセットを探します。または、ノードが 2 つある場合は、2 部グラフになります。
マトリックスの例:
1 1 1 1
0 1 1 0
1 0 0 1
1 0 0 1