【问题标题】:Algorithm for total number of subsets of distinct elements in a given set of repetitive elements给定重复元素集中不同元素子集总数的算法
【发布时间】:2015-10-07 06:42:14
【问题描述】:

我必须找出 '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 的数组计算此值。有什么组合逻辑吗?

【问题讨论】:

  • k 怎么样?你有限制吗?如果你有类似k < 1000 的东西就好了。
  • k 是子集的长度。唯一的限制是元素应该是不同的并且元素应该是递增的。
  • 所以它可以和n一样大?
  • k 从 2 变化到小于或等于 n 的任何值
  • 我目前有一个O(n k) 算法,但似乎无法解决问题

标签: algorithm set


【解决方案1】:

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

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

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

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

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 乘法更新次数为k(在开始时初始化为常数1)的多项式来迭代计算。

运行时间是O(m * k)

【讨论】:

  • @fjardon 我们要计算固定大小的子集的总数,而不是所有大小
  • 这是解决这个问题的正确想法,因为它得到了所有可能的乘法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-13
  • 1970-01-01
  • 2011-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多