php - 从数组中访问唯一值对而无需重复自己

标签 php arrays math permutation

我正在尝试以随机顺序从数组中访问唯一值对 - 在必要之前不重复自己。

例如,如果我有一个数组集 A、B、C、D(通常为偶数个项目,但最多 20 个),那么第一次我可能会将 A-B 和 C-D 配对。但我想保证,下次我这样做时,我会避免重复配对,并且在再次获得 A-B 和 C-D 之前,我会同时获得 A-C 和 B-D 以及 A-D 和 B-C。每个项目在每轮中只能调用一次。

我首先随机打乱数组的顺序,然后将两个值配对在一起 - 但我需要一种方法来防止某些配对比其他配对更频繁地发生(理想情况下,我希望它们自始至终均等地递增) .

因此,我开始研究排列 - 并设法使用以下代码获得包含所有可能配对的完整数组:

    $this->items = array('A','B','C','D');

    $input = $this->items;
    $input_copy = $input;
    $output = array();
    $i = 0;
    foreach($input as $val) {

        $j = 0;
        foreach($input_copy as $cval) {
            if($j == $i) break;
            print $val.'-'.$cval.'<br/>';
            //$output[] = array($val => $cval);
            $j++;
        }
        $i++;
    }

    //print_r($output);

例如,对于 A、B、C、D,我得到:

b-a
c-a
c-b
d-a
d-b
d-c

我想循环遍历集合 n-1 次并捕获另一个数组中的结果,但我不确定如何从这些独特的选项生成实际顺序

换句话说,我想把上面的列表变成下面的:

1st run =>
    1=> A-B, 
    2=> C-D, 
2nd run =>
    1=> A-C, 
    2=> B-D,
3rd run =>
    1=> A-D, 
    2=> C-B,

也许我可以通过 $this->items 更简单地做到这一点。我还查看了 Math_Combinatorics PEAR 包,但我不知道从哪里开始。

如果有任何帮助,我将不胜感激!

最佳答案

您可以使用round-robin tournament algorithm

Place elements in two rows. 
Fix one element - in this case A
For next round shift all other elements in circular manner. 
Pair them. 
Repeat N-1 times

A B
D C
-----
A D
C B
----
A C
B D
----

关于php - 从数组中访问唯一值对而无需重复自己,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27436665/

相关文章:

php - gmdate() 返回错误的时间

arrays - Append for array of maps raplaces all previous array items on the 最新的一个

c - fgets() 不会将文件内容读取到二维数组

c# - 线条旋转问题

performance - 在二维平面中找到距离 P 点最近的 K 个点

php - 在 PHP 和 MYSQL 中发送 ID 而不是名称

PHP Mysqli SELECT from Views 不起作用

javascript - 使用 AngularJS 方式通过对象数组中的属性查找对象

java - 无法在二次方程程序中找到 "java logical error"的解

php - 如果用户不是来自 HERE,则不处理 - 如何处理?