从列表中查找双精度(具有两个元素)的所有组合

时间:2011-12-19 06:03:59

标签: php c algorithm combinations

说我的清单是 {1,2,3,4}

我的标题可能不够描述,但这是我想做的事情.. 我希望我的代码生成以下

{ (1,2) , (3,4) }

{ (1,3) , (2,4) }

{ (1,4) , (2,3) }

{ (2,1) , (4,3) }

{ (3,1) , (4,2) }

{ (4,1) , (3,2) }

,即我想要该套装的所有4C2组合。

注意:这里最初的四个元素只是一个说明性的数字..数字可能会变化,直到8或10。

现在,我如何为它编写代码(在C或php中)。

基本上,我想知道算法。不是全部。甚至一个开端就足够了.. 我只是想不出任何事情。 请帮助。 感谢。

我想我没解释清楚;实际上我自己没有得到问题。 我想要的是,比方说我有4支球队,而且我希望每支球队都能对抗另一支球队,那么我如何生成所有的比赛。 在我上面的例子中;考虑1,2,3,4为4支球队。和 {(1,2),(3,4)}作为一组固定装置等。 我该怎么做呢。 因此我需要的是生成所有NC2 /(N / 2)组的灯具。 (在这种情况下N = 4)

2 个答案:

答案 0 :(得分:2)

  

基本上,我想知道算法。不是全部,甚至是   headstart会很好......我只是想不出什么可以开始   从

如果你想要一个headstart,Python文档会显示用于实现组合函数的算法。使用普通的for循环替换range(),使用 printf 替换 yield ,并且应该很容易转换为C或PHP:http://docs.python.org/library/itertools.html#itertools.combinations

请注意,一次两个采取的四件事的组合产生:(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)。您的示例输出还包括每个的补码(即(1, 2)附带(3, 4))。

答案 1 :(得分:1)

我做了这个(PHP)。我添加了第三个参数,可用于让函数返回每个可能的组合,无论元素的顺序是否重要。初始选项集和返回组合将是数组

function every_combinations($set, $n, $order_matters = false) {
    $combinations = [];
    foreach($set AS $k => $e) {
        $subset = $set;
        unset($subset[$k]);
        if($n == 1) $combinations[] = [$e];
        else {
            $subcomb = every_combinations($subset, $n - 1, $order_matters);
            foreach($subcomb AS $s) {
                $comb = array_merge([$e], $s);
                if($order_matters) $combinations[] = $comb;
                else {
                    $needle = $comb;
                    sort($needle);
                    if(!in_array($needle, $combinations)) $combinations[] = $comb;
                }
            }
        }
    }
    return $combinations;
}