0

私には複雑に思える質問がありますが、一部の人にとっては簡単かもしれません。ここにあります:私はこのようなMySQLテーブルを持っています

id  |  username  |  time_zone | selected
 1      XXX           +4          1
 2      XXX           -6          0
 3      XXX           NULL        1

等々。行数は 100 万を超える場合があります。(タイム ゾーンが定義されていないユーザーがいる可能性があることに注意してください。) cron ジョブを介して 1 時間ごとに実行され、テーブルから一定量の行を選択する PHP スクリプトがあります。今、難しい部分です。

  1. テーブルから選択される行数は、1 時間ごとに等しくなければなりません。( amount selected = COUNT()/24)
  2. 各行は 1 日に複数回選択してはなりません (そのため、テーブルに「選択済み」列を追加しました)。
  3. 現地時間が午後 1 時から午後 5 時までの場合、すべてのユーザーを選択する必要があります。
  4. ユーザーのタイムゾーンが定義されていない場合は、午後 5 時から午後 8 時の間で選択する必要があります。
  5. ユーザー数が特定の時間に十分でない場合、たとえば、タイム ゾーン +4 のユーザー数が 未満の場合COUNT()/24、未定義のユーザーまたは隣接するタイム ゾーンのユーザーを使用して均等性を補うことができます。
  6. 指定された時間に多くのユーザーがいる場合は、次の近隣のタイム ゾーンに渡すことができます。

コードは必要ありませんが、ロジックが必要です。誰かが私を助けることができれば、私は非常に充実しています。質問があれば、もっと詳しく説明できます。

4

1 に答える 1

3

ビンの梱包に問題があります。これは、「近隣のタイムゾーンからの借用」によってさらに複雑になります。ここでは、問題にどのようにアプローチできるかについていくつかのアイデアを示します。

解決策について考える 1 つの方法を次に示します。

  1. テーブルに「使用されたタイムゾーン」列を追加します(必要に応じて再利用selectedできます)
  2. 選択されていないユーザーの中から各タイムゾーンからランダムに 1 人のユーザーを選択します
  3. タイムゾーンに割り当てます
  4. タイムゾーンのユーザーがいない場合は、ユーザーの近隣ゾーンを調べます
  5. 各バケットの n 番目の人についてもう一度繰り返します

ああ、これは複雑なようです。また、問題を解決するにはたくさんのカーソルが必要になるようです。

代わりに、ユーザーではなくタイムゾーンで入力しましょう。

  1. 最も人口の多い利用可能なタイムゾーンから始めます
  2. タイムゾーンから利用可能なユーザーをランダムに選択し、その「使用されたタイムゾーン」をタイムゾーンに設定します
  3. 十分な数のユーザーがいない場合は、以前のタイム ゾーンに移動して、利用可能な余剰ユーザーを選択します。
  4. タイムゾーンを反復する

これは近づいています。ユーザーをタイムゾーンに一度に割り当てることで、さらに最適化できます。次に、満員でないタイム ゾーンについては、他のタイム ゾーンから余分なユーザーをピックアップします。

于 2013-05-09T18:46:04.360 に答える