【问题标题】:count number of subsets with atmost k distinct elements计算最多具有 k 个不同元素的子集的数量
【发布时间】:2014-05-07 18:00:29
【问题描述】:

给定一组整数,计算最多有 k 个不同元素的子集的数量。
例如:设置为 {1,1,2,3,3} 并且 k = 2:

可能的子集是:
{} - 空集
{1}
{1}
{2}
{3}
{3}
{1,1}
{1,2}
{1,3}
{1,3}
{1,2}
{1,3}
{1,3}
{2,3}
{2,3}
{1,1,2}
{1,1,3}
{1,1,3}
{1,3,3}
{1,3,3}
{2,3,3}
{1,1,3,3}
我的解决方案是迭代所有可能的子集并检查是否有更少的 k+1 个元素.. 但它太慢了.. O(2^n)

【问题讨论】:

  • 根据集合论,{1} 与 {1, 1} 完全相同。您对“集合”的定义与数论中的定义相同吗? en.wikipedia.org/wiki/Set_(mathematics)#Describing_sets
  • 我认为您正在寻找的概念是multiset。将订购一个数组。
  • {1, 3} 和 {3, 1} 是否被视为同一个子集?在集合论中它们是。
  • 您是在寻找多组还是只是组? {1} 和 {1} 不会是同一个集合吗?
  • 可能更清晰的描述是,给定非负整数 k

标签: algorithm set subset combinatorics


【解决方案1】:

让我们将您的值集压缩为S = [1:2, 2:1, 3:2] 之类的表示形式,您只需保存每个元素的值和计数并为它们分配一些顺序。设 n 为序列 S 的大小。然后您有 2^count 种可能性来为每个值选择一个子集。

对于每个小组,您必须决定是否参加。如果你接受它,不同值的数量会增加,并且你有 2^count - 1 次这样做的可能性。如果不是,则不同值的数量保持不变。

这会产生以下 DP 方法:假设您只能使用 k 个不同的值,让 f(i, k) 是从索引 i 上做出决策的方法数。

重复次数是

f(n, k) = 1   if k >= 0
f(n, k) = 0   if k < 0
f(i, k) = f(i + 1, k) + (2^count[i] - 1) * f(i + 1, k - 1)

导致 O(n * k) 算法。结果将是 f(0, k)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-07
    • 1970-01-01
    • 2021-11-29
    • 2015-10-31
    • 2018-04-20
    • 1970-01-01
    • 1970-01-01
    • 2012-03-29
    相关资源
    最近更新 更多