4

問題を解決しようとしていますが、残念ながら私の解決策はこのタスクに最適ではありません。

仕事:

パーティーには N 人のゲストがいます (0 < N < 30000 )。すべてのゲストは、いつパーティーに参加し、いつ退席するかを伝えます ([10;12] など)。タスクは、パーティーでできるだけ多くの人々の写真を撮ることです。1 枚の写真には 2 人 (ペア) しか写っていません。もちろん、写真は2人が同時にパーティーに参加している場合にのみ撮影できます。これは、出席間隔が重複する場合です。

私の考え:間隔から接続のグラフを作成するプログラムを書きました。グラフから接続数が最も少ない人を探します。つながりのある人の中から、つながりが最も少ない人も選びます。次に、これらの 2 つが写真のペアとして選択されます。どちらもグラフから削除されます。アルゴリズムは、接続がなくなるまで実行されます。

このアプローチは機能しますが、プログラムの計算には 10 秒の制限があります。1000 エントリでは 2 秒で実行されますが、4000 エントリでもかなりの時間がかかります。さらに、25000個のデータで試してみたところ、メモリ不足エラーでプログラムが停止し、接続を正しく保存することさえできません。

ここでは新しいアプローチが必要だと思いますが、これを機能させる他の方法が見つかりませんでした。

このタスクの適切なアルゴリズムを理解するのを手伝ってくれる人はいますか?

どうもありがとうございました!

サンプルデータ:

10
1 100
2 92
3 83
4 74
5 65
6 55
7 44
8 33
9 22
10 11

最初の行はゲストの数で、それ以降のデータはパーティーでの人の間隔です。

4

6 に答える 6

3

ここでグラフを作成する必要はありません。この問題は、間隔構造でうまく解決できます。退出時間(インターバルの終点)の昇順で人を並べ替えます。次に、ソートされた順序でそれらを繰り返します。現在の人物が誰とも交差していない場合は、削除する必要があります。彼が複数の人と交差している場合は、出発時刻が最も早い人をペアとして取ります。反復中は、各人物を次の人物とのみ比較する必要があります。

このアプローチを証明することはそれほど難しくないので、自分で証明できることを願っています。実行時間に関しては、単純な解はO(N^2)ですが、O(N * logN)に短縮できると思います。とにかく、通常の PC では O(N^2) は 10 秒で収まります。

于 2013-03-07T10:26:46.980 に答える
2

私には古典的な最大マッチング問題のように思えます。

一緒に写っている可能性のある (時間間隔が交差する) 人々をエッジで接続するグラフを作成し、たとえば エドモンドのブロッサム アルゴリズムを使用して、最大の一致を見つけます。

実装が非常に簡単だとは言いません。ただし、 2 部グラフでの最大一致のためのクーンのアルゴリズムを使用すると、これのかなり良い近似を得ることができます。これは非常に簡単に実装できますが、正確な解決策は得られません。

于 2013-03-07T09:34:27.083 に答える
1

私はいくつかの本当に簡単な考えを持っています:

パーティーがXhを取り、1時間ごとにXセットを作成し、適切な人を追加するとします。もちろん、1時間以上そこにいる人は数セットになります。これで、偶数のpplを持つ「一緒に」2つのセットがある場合、各セットに対してn/2の写真を撮ることができます。奇数の人が2セットいる場合は、その2つのセットのそれぞれに参加する人を探して、そのうちの1人に移動します(つまり、同時に2つの偶数の人が参加することになります)パーティー)。

使用済みのすべてのpplを削除することを忘れないでください(いくつかを考慮してくださいclass-Man彼/彼女のすべての時間のリストを使用してください)。

私の考えは、おそらく、複数の隣接するセットを介して、より高度な「人を動かす」アルゴリズムに拡張する必要があります。

于 2013-03-07T09:28:35.590 に答える
1

私は次のことができると思います:

まず、すべてのゲストのデータを読み取り、時間の昇順に配列に並べ替えます。次に、配列の最初の要素を取得し、最初の時間一致が見つかるまで次の要素を繰り返します (次のゲストの入場時間は、このゲストの退出時間よりも短い)。見つかった場合は、ペアとして配列から両方を削除し、別の場所に報告します。 . そうでない場合は、まったくペアリングできないため、ゲストを削除します。配列が空になるまで繰り返します。

これの最悪のケースも N^2 です。パーティーは[1,2],[3,4],...ゲスト同士がペアリングできないようなものであり、アルゴリズムは常に 30000 人のゲストすべてを無駄に検索します。したがって、これが最適なアルゴリズムだとは思いませんが、正確な答えが得られるはずです。

于 2013-03-07T11:33:56.890 に答える
0

あなたはすでにグラフ構造表現を持っていると言います。あなたの頂点はゲストと彼らがパーティーに滞在する間隔を表し、エッジはそれぞれの間隔の重なりを表していると思います。次に解決しなければならないのは、以前に解決されたグラフ理論最大一致問題です。

ただし、上記の私のコメントに示されているように、問題の特性、特に推移性のようなものを利用できると思いますこれ:

まだ写真を撮っていない次のゲストが出発するまで待ってから、出席者の中で次に出発するゲストと一緒に写真を撮ります。

于 2013-03-07T09:35:25.847 に答える
-1

写真を撮ることができる最も早い時間について考えることに成功するかもしれません: それは 2 番目の人がパーティーに到着した時間です。

写真家として、最初の人であるパー​​ティーに行き、待ちます。人が到着するたびに、その人とパーティーにいる他のすべての人たちと一緒に写真を撮ります。人物は一度しか登場しないため、重複することはありません。

写真を撮っている間 (つまり、ゲストのリストを繰り返し処理している間)、実際にパーティーを去ったゲストを削除します。

于 2013-03-07T08:59:27.257 に答える