問題: N 人と S スロットがあります。各人は、自分が忙しいスロットのリストを持っています。すべてが空いているスロットを見つけるには、アルゴリズムを見つける必要があります。
複雑さが O(NS) であるアルゴリズムを既に知っています。より良いアルゴリズムが必要です。
最終的に空いているスロットを見つけるために使用できる、さまざまなデータ構造を動的に維持することができます (会議がスケジュールされるたびに更新されます)。
スロットごとにスロットカウンターを保持します。ビジー スロットごとに、そのスロット slotcounter に 1 を追加します。すべての人々の忙しいスロットのために。
すべての人が使用中のスロットを考慮した後もまだゼロであるスロット カウンターは、すべての人が空いているスロットのカウンターです。おそらくO(k)アルゴリズムです。
カウントする代わりに、ビットマスク/ビットセットを設定して、人物 N のビットマスクのビジー状態のすべての位置にビット S を設定することができます。すべての人のビットマスクのビットごとの OR は、すべての空きスロットに対応するゼロのビットを持ちます。
更新: 問題を述べる方法は、人々を追跡する必要はなく、スロット占有率インジケーターの配列を保持するだけです。最初はすべて無料とマークされています。各人のビジースロットを通過すると、適切な占有インジケータがビジーとしてマークされます。完了したら、まだ空いている配列インジケーターのいずれかが答えになります。
S がビジーの場合に設定されたビットを使用して、サイズ S のビットマスクを生成します。すべてのビットマスクをビットごとに OR し、設定されていないビットを抽出します。
編集:アルゴリズムは、各人のスロットのソートされたリストがあると仮定して機能します
したがって、全体的な複雑さ = N*log(S) + S*log(N)
これは、元のリストがソートされていることを前提としています。そうでない場合、複雑さは N(SlogS) まで上がります。
解決策がない可能性があることを念頭に置いて、ハンガリーのアルゴリズムが最も近い答えを提供します