【问题标题】: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
  • 你可以修改这个问题的答案:stackoverflow.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 中。

标签: php c algorithm combinations


【解决方案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;
    }
    

    【讨论】:

      猜你喜欢
      • 2015-07-02
      • 1970-01-01
      • 2015-11-12
      • 2020-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多