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

Posted

技术标签:

【中文标题】从列表中查找所有双精度组合(具有两个元素)【英文标题】:Finding all combinations of doubles (having two elements) out of a list 【发布时间】:2012-01-23 08:49:36 【问题描述】:

假设我的清单是 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)

【问题讨论】:

nC2还是nCr 你可以修改这个问题的答案:***.com/questions/1435552/php-array-combination 遵循@mathematical.coffee 的建议....使用排列并简单地将 2 个连续的项目组合在一起。快! :) 你为什么要 (1,4) , (2,3) (4,1) , (3,2) 而不是 (4,1) , (2,3) @Mr.向导,因为 4,1 和 2,3 中的 2,3 已经涵盖在 1,4 和 2,3 中。 【参考方案1】:

基本上,我想知道算法。不是全部,甚至是 headstart 会足够好.. 我只是想不出任何开始 来自。

如果您想抢先一步,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))。

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于从列表中查找所有双精度组合(具有两个元素)的主要内容,如果未能解决你的问题,请参考以下文章

C#:组合相同列表的两个元素(不重复)

从Java中具有不同大小的2个数组列表中查找非相似元素

如何使用流从两个列表或数组乘法中查找元素对

Haskell中两个列表元素的所有组合

从两个数组创建所有可能的组合

在元组列表(SCALA)中将所有具有相同日期的双精度加起来