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

标签 algorithm set

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

Given a Set A={1, 1, 2, 3}.

For k=2, the possible subsets are {1(index=1), 2}, {1(index=2), 2}, {1(index=1), 3}, {1(index=2), 3} and {2, 3}. Total=5.

For k=3,the possible subsets are {1(index=1), 2, 3}, {1(index=2), 2, 3}. Total=2.

For k=4,possible subsets=0.

我必须为长度为 10^5 的数组计算这个。有什么组合逻辑吗?

最佳答案

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

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

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)

这可以通过用每个多项式 1 + c[i]* x.

运行时间是O(m * k)

关于给定重复元素集中不同元素子集总数的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32979355/

相关文章:

c++ - std::set 比较器函数如何工作?

java - NavigableSet 的方法上限不返回带有比较器的预期元素

python在删除重复项后保留集合中的顺序

python - 如何返回True和False?

java - 我如何计算给定日期列表中周数的日期数

algorithm - 在未排序数组中查找多个子数组的中位数

algorithm - 查找两组整数的所有成对 OR 的集合

algorithm - 按姓氏将人们分配到房间?

c++ - 尝试反转除特殊字符外的字符串时出错

php - 模式字符串替换算法(php + regexp)