如何制作循环赛?或者除了Round Robin之外还有更简单的方法吗?

时间:2012-06-03 04:34:43

标签: php mysql

如果出现如下例子的问题,我面临的问题是

代码1000,2000,3000,4000,5000

ID 1,2,3

========================================

此:

ID号1的代码为1000,2000,3000,4000

ID号码2的代码为2000,4000,3000

ID号3的代码为3000,4000,5000

========================================

连接所有字段后,每个ID都找到相同的代码。 从上面的例子中,我想产生公平的结果并调整到之前在每个ID上的代码,如下所示:(在ID的集合上产生公平代码)

========================================

成为:

ID号1的代码为1000,2000 (1000必须是1号,因为它只有其他代码)

ID号码2的代码为3000,4000

ID号3的代码为5000 (5000必须是3号,因为它只有其他代码)

========================================

有人说使用 Round Robin ,但之前我从未听过Round Robin,我也不知道如何使用它,这是一个空白的头脑。 还有另一种比较容易使用PHP的方式吗?我输了。

感谢。

=============================================== ==============

解释

我正在创建一个应用程序,其中每个用户都有一个预定义的代码,并且没有相同的代码。例如,用户A具有1000-1500之间的代码范围,用户B具有1600到2000之间的代码范围。用户C具有1300-1550之间的代码范围。如我们所见,A(A - > 1000-1500,C - > 1300-1550)上的代码中包含的C上的代码的距离肯定会在两个用户之间重复。 在这种情况下,如何分离和分割它使其更公平。设C为1300,A为1301,C为1302等,直到1500。

我认为我之前给出的简单例子可以理解,但这似乎是一团糟,我的错误。

1 个答案:

答案 0 :(得分:3)

$codes = array(1000, 2000, 3000, 4000, 5000);

// set up the receiving "containers"
$ids = array(
  array(),
  array(),
  array(),
);

$n_ids = count($ids);
$i = 0;

foreach ($codes as $code) {
    // use ($i % $n_ids) to distribute over $n_ids containers
    $ids[$i % $n_ids][] = $code;
    ++$i;
}

print_r($ids);

输出:

Array
(
    [0] => Array
        (
            [0] => 1000
            [1] => 4000
        )

    [1] => Array
        (
            [0] => 2000
            [1] => 5000
        )

    [2] => Array
        (
            [0] => 3000
        )

)

此问题是一个简单的分发任务:在M个容器上分配N个项目。

对于每个i(0 <= i&lt; N,您选择一个容器来放置项目N[i];选择是使用以下表达式完成的:i mod Mi modulo M)。

这个表达式可以称之为循环法,因为它像这样循环:

i    :  0  1  2  3  4
i % M:  0  1  2  0  1

更快

array_chunk函数也执行此任务,但我想您首先要了解该问题。此外,array_chunk会产生稍微不同的结果。

$ids = array_chunk(array(1000, 2000, 3000, 4000, 5000), round(count($codes) / 3));

输出:

Array
(
    [0] => Array
        (
            [0] => 1000
            [1] => 2000
        )

    [1] => Array
        (
            [0] => 3000
            [1] => 4000
        )

    [2] => Array
        (
            [0] => 5000
        )

)