从列表中查找所有双精度组合(具有两个元素)
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;
【讨论】:
以上是关于从列表中查找所有双精度组合(具有两个元素)的主要内容,如果未能解决你的问题,请参考以下文章