如何计算最大值可能的组合数量?

时间:2010-08-06 17:00:04

标签: php algorithm powerset

  

可能重复:
  Display possible combinations of string
  algorithm that will take numbers or words and find all possible combinations

如果我有3个字符串,例如:

"abc def xyz"

我想通过重新排列这些字符串找到我可以生成的最大组合数,例如:

  • abc xyz def
  • def xyz abc
  • xyz abc def

等。计算这个的公式/算法是什么?

4 个答案:

答案 0 :(得分:8)

这不是一种组合,而是排列。算法 n!,其中n是元素的数量。

为什么?

因为你有三个值放置在三个地方,所以对于第一个地方你有三个选项,第二个只有两个(因为你已经宫殿第一个字符串)和最后你只有一个选项。

3 * 2 * 1 = 3! = 6

但是如果你可以重复那些选择而不是重复排列

所以对于第一名你可以选择3个字符串,第二个也可以选择一个

3 * 3 * 3 = 3 ^ 3 = 27

n ^ k - 其中n是字符串的数量,k是“位置”的数量

代码算法如下所示:

function fact($n)
{
  if ($n == 0)
  {
    return 1;
  }
  else
  {
    return $n * fact($n - 1);
  }
}

这是一个递归的例子

答案 1 :(得分:1)

如果我没记错的话就是n!组合

所以对于9你会有

9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 = 362880种组合

答案 2 :(得分:0)

考虑排列。 O'Reilley通过谷歌提供了一些很好的信息。如果我有一些额外的时间,我会尝试为你起草一个例子。

<强>更新

以下是一些代码,如果它正常工作,则不是100%,但您应该能够根据需要对其进行修改(核心代码来自O'Reilley网站,fyi):

<?php
function pc_permute($items, $perms = array( )) {
    if (empty($items)) { 
        print join(' ', $perms) . "\n";
    }  else {
        for ($i = count($items) - 1; $i >= 0; --$i) {
             $newitems = $items;
             $newperms = $perms;
             list($foo) = array_splice($newitems, $i, 1);
             array_unshift($newperms, $foo);
             pc_permute($newitems, $newperms);
         }
    }
}

pc_permute(array('abc', 'xyz', 'def', 'hij'));
?>

修改

只是看到他想要算法,或者代码应该为其他潜伏者生成结果:)请参阅算法的其他答案,这是n!

答案 3 :(得分:0)

3 * 2 * 1 = 6阶乘!

3弦= 6种组合...... 4个字符串= 24个组合.....等