确定不同长度变化的算法

时间:2010-06-08 18:17:42

标签: algorithm language-agnostic math theory

我有四个对象 - 为了争论,请说它们是以下字母: A B C D

我需要计算在以下两个条件下可以为这些变化做出的变化数量:

  1. 不重复
  2. 对象与位置无关
  3. 考虑到上述情况,这意味着使用四个对象序列,我只能有一个符合条件的序列(因为顺序不被认为是唯一的):

    • ABCD

    四个对象池中的三个对象组合有四种变体:

    • ABC,ABD,ACD和BCD

    四个对象池中的两个对象组合有六种变体:

    • AB,AC,AD,BC,BD和CD

    最简单的一个,如果一次接受:

    • A,B,C和D

    我发誓,这是很多年前在学校里所涵盖的事情 - 而且可能已经忘记,因为我认为我不会使用它。 :-)我期待阶乘会发挥作用,但只是试图强迫一个方程式不起作用。

    任何建议都将受到赞赏。

2 个答案:

答案 0 :(得分:4)

n个对象有2 ^ n个组合,其中每个对象可以是(在集合中)或(不在集合中)。因此,您可以将组合集中的每个组合视为(0, (2^n-1))范围内的一个整数。

要获得每个组合,只需迭代此范围并将每个整数视为位掩码。对于整数中的每个1位,相应的元素属于集合。

除此之外:这称为power set

答案 1 :(得分:1)

你想到的是一个组合,一组n个项目中组合k的数量是

n!/((n-k)!k!)

当提到组合的数量时,通常会说“n选择k”,因为您实际上是从n中“选择”k个元素。

编辑:啊,我误读了一下。您想要所有可能组合的计数,基本上是sum(nCk,k = 0到n)。这是功率集,如果您不想计算空集,则为2 ^ n(或2 ^ n - 1)。