我々はそれぞれが整数、時間と 終了時刻を開始有する、n個のタスクのセットを与えられています。任意の時間に並列実行されているタスクの最大量は ですか?
アルゴリズムは、O(n log n)時間で実行する必要があります。
限り、彼らは、JavaやScalaであるとして歓迎され、私は直接の回答が、任意のコードスニペットを必要としないので、これは学校の割り当てです(割り当てはScalaで書かれることになって。)
一部ヒントのうち、私は優先度キューを利用すべきだと言います。私はドキュメンテーションを読んでいますが、実際の使用方法は分かりませんので、コードスニペットは大歓迎です。
入力データは、たとえばArray[Pair[Int,Int]] = Array((1000,2000),(1500,2200))
とすることができます。
私は本当にプライオリティキューのオーダーを設定するのに苦労しているので、他に誰かがそれを手伝ってくれることを願っています。
PS: プライオリティキューは、PriorityQueue()(ord)で初期化されているものとします。
編集:私は優先度キューを使用して解決策を考え出しましたが、すべての回答に感謝します。あなたは私が論理を理解するのを手伝った!
タスクは2つのリスト(開始時刻と終了時刻でソートされたもの)で作成され、それぞれの「現在の」タスクのインデックスが維持されているものとします。次に、次の開始と次の終了が発生する時刻を知っています。だから、配列を同時に歩き、最大値を覚える必要があります。同様に、2つのプライオリティキューを使用することもできますが、これはソートされた配列よりもおそらく遅くなります(これはちょうど推測ですが、確かめるために測定する必要があります)。 –
@NicoSchertlerもし私がトラフに行くと、ソートされた配列は同時にアルゴリズムが線形時間で実行されないでしょうか? – Jonatan
はい、最初にソートする必要があります。したがって、n log n。 –