0

我有一个问题对我来说很复杂,但对你们中的一些人来说很容易。这里是:我有一个这样的 MySQL 表

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

等等。行数可以超过一百万。(请注意,可能存在未定义时区的用户。)有一个 PHP 脚本通过 cron 作业每小时运行一次,并从表中选择一定数量的行。现在是困难的部分。

  1. 每小时从表中选择的行数必须相等。( amount selected = COUNT()/24)
  2. 每一行每天不得选择超过一次(这就是我在表中添加“已选择”列的原因)。
  3. 本地时间为下午 1 点到 5 点时,必须选择每个用户。
  4. 如果用户的时区未定义,则必须从下午 5 点到晚上 8 点选择。
  5. 如果特定时间的用户数量不足,例如时区 +4 的用户数小于COUNT()/24,则可以使用未定义的用户或来自相邻时区的用户来补偿相等性。
  6. 如果在指定时间内有很多用户,则可以将它们传递到下一个相邻时区。

我不需要代码,但需要逻辑。如果有人可以提供帮助,我会非常满意。如果有任何问题,我可以更详细地讨论。

4

1 回答 1

3

你有一个垃圾箱包装问题。“从相邻时区借用”使这变得更加复杂。以下是有关如何解决问题的一些想法。

这是考虑解决方案的一种方法:

  1. 在表中添加一列“使用的时区”(selected如果需要,您可以重复使用)
  2. 在未被选中的用户中,从每个时区中随机选择一个用户
  3. 将其分配到时区
  4. 如果某个时区没有用户,则查看用户的相邻时区
  5. 为每个桶中的第 n 个人再次迭代

哦,这似乎很复杂。似乎还需要一堆游标来解决问题。

相反,让我们按时区而不是用户填充。

  1. 从人口最多的可用时区开始
  2. 从时区中随机选择可用用户,并将他们的“使用时区”设置为时区
  3. 如果没有足够的用户,请转到以前的时区并选择多余的可用用户。
  4. 遍历时区

这越来越接近了。您可以通过一次将用户分配到时区来进一步优化它。然后,对于未满的时区,去其他时区接多余的用户。

于 2013-05-09T18:46:04.360 回答