我必须找出'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长度的数组。它有任何组合逻辑吗?
答案 0 :(得分:2)
以下是O(m * k)
方法,其中m
是A
中不同元素的数量。
将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)
。