可以使用给定数字集生成的固定长度的不同序列的数量

时间:2015-01-09 14:03:34

标签: algorithm set permutation combinatorics sequences

我试图找到不同的固定长度序列,这些序列可以使用给定集合中的数字(不同的元素)生成,这样来自集合的每个元素都应该出现在序列中。以下是我的逻辑:

例如。让该集合由S个元素组成,并且我们必须生成长度为K(K> = S)

的序列

1)首先,我们必须从K中选择S个位置,并以随机顺序放置集合中的每个元素。所以, C(K,S)* S!

2)之后,可以从集合中的任何值填充剩余的位置。因此,因素

(K-S)^ S 应该相乘。

所以,总体结果是

  

C(K,S)的取值!((K-S)^ S)

但是,我得到了错误的答案。请帮忙。

PS:C(K,S):无论顺序如何,从K个元素(K> = S)中选择S个元素的方式的数量。此外,^:幂符号,即2 ^ 3 = 8。

这是我在python中的代码:

# m is the no. of element to select from a set of n elements
# fact is a list containing factorial values i.e. fact[0] = 1, fact[3] = 6& so on. 
def ways(m,n):
    res = fact[n]/fact[n-m+1]*((n-m)**m)
    return res

1 个答案:

答案 0 :(得分:1)

你要找的是主域函数的数量,其域是一组K元素(我们在输出序列中填写的K个位置),图像是一组S元素(你的输入集) 。我认为这应该有效:

    static int Count(int K, int S)
    {
        int sum = 0;
        for (int i = 1; i <= S; i++)
        {
            sum += Pow(-1, (S-i)) * Fact(S) / (Fact(i) * Fact(S - i)) * Pow(i, K);
        }
        return sum;
    }

... PowFact就是您所期望的。

查看此this math.se question

这就是为什么你的方法无法工作。我没有检查代码,只是你对其背后逻辑的解释,但是我是我确定我理解你要做的事情。我们假设K = 4,S = {7,8,9}。让我们检查序列7,8,9,7。这是一个独特的序列,但您可以通过以下方式实现:

  • 随机选择位置1,2,3,随机填充7,8,9(您的步骤1),然后随机选择7作为剩余位置4(您的步骤2)。

    < / LI>
  • 随机选择位置2,3,4,随机填充8,9,7(您的步骤1),然后随机选择7作为剩余位置1(您的步骤2)。

    < / LI>

根据你的逻辑,你将两种方式计算,即使它只计算一次,因为最终结果是相同的。等等...