给定重复元素集中不同元素子集总数的算法

时间:2015-10-06 20:41:12

标签: algorithm set

我必须找出'k'(k> 1)子集的总数,包含不同元素的长度。如果碰巧存在相同的元素但具有不同的索引,则认为两个子集是不同的。请参阅下面的示例。

  

给定A = {1,1,2,3}。

     

对于k = 2,可能的子集是{1(index = 1),2},{1(index = 2),2},   {1(index = 1),3},{1(index = 2),3}和{2,3}。总= 5。

     

对于k = 3,可能的子集是{1(index = 1),2,3},{1(index = 2),2,   3}。总= 2。

     

对于k = 4,可能的子集= 0。

我必须计算10 ^ 5长度的数组。它有任何组合逻辑吗?

1 个答案:

答案 0 :(得分:2)

以下是O(m * k)方法,其中mA中不同元素的数量。

A中的每个不同元素映射到其出现次数(您可以使用哈希映射O(n)运行时)。让这些数字

c[1], c[2], ..., c[m]

现在您可以看到k个不同的集合总数是所有可能产品的总和

c[i1] * c[i2] * ... * c[ik]

(在您的示例中为c[1] = 2, c[2] = 1, c[3] = 1,您可以看到包含2个不同元素的集合数为2*1+1*1+2*1 = 5)。

您还可以看到此数字是多项式中x^k前面的系数:

(1+c[1]*x)*(1+c[2]*x)*...*(1+c[m]*x)

这可以通过使用多项式k中的每一个乘法更新度1的多项式(在开始初始化为常数1 + c[i]* x)来迭代计算。

运行时间为O(m * k)