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


Finding all combinations of doubles (having two elements) out of a list

说我的列表是{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) }

。e我想要集合的所有4C2组合。

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

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

基本上,我想知道算法。不是全部。即使是领先一步也已经足够好了。我就是想不出从哪里开始。请帮助。谢谢。

我想我没有解释好;实际上,我自己也不明白这个问题。我想要的是,假设我有4支球队,我想让每支球队对阵另一支球队,那么我如何生成所有的赛程。在我上面的例子中;假设1 2 3 4是4支队伍。和{(1,2),(3,4)}作为一组夹具,以此类推。我该怎么做呢?因此,我需要的是生成所有NC2/(N/2)固定装置集。(本例中N=4)

基本上,我想知道算法。不是全部。,甚至是……领先一步就足够了。我只是想不出从什么开始从.

如果您想要一个开端,Python文档展示了用于实现组合函数的算法。将range()替换为普通的for循环,并将yield替换为printf,这样就可以很容易地转换为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))。

我做了这个(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;
}