【问题标题】:Is there any algorithm to generate all subsets of a given set in O(n^2) time?是否有任何算法可以在 O(n^2) 时间内生成给定集合的所有子集?
【发布时间】:2016-04-07 12:13:26
【问题描述】:

我只是在尝试不同的算法来练习,我遇到了这个问题,我必须生成给定元素集的所有子集(非重复)。

对此的简单解决方案是使用位掩码技术。但这具有指数时间复杂度,即 O(2^n)。在最坏的情况下,n 的值可以达到100000,所以在这种情况下 O(n^2) 的解决方案不是很明智。

我只是想知道是否有任何其他更有效的算法可以在 ~O(n^2) 中解决这个问题?

【问题讨论】:

  • 你的意思是——有没有办法在 n^2 步中生成 2^n 个东西?也许是魔法。
  • 真正的问题是你想用 2^n 集做什么。如果你真的需要输出它们,显然不可能花费少于 2^n 的时间。但是如果你想计算它们的一些聚合,即找到最大化/最小化某个属性的子集,它可能是可能的
  • @NiklasB。好吧,我无法说出整个问题,因为它来自现场比赛,我不想作弊。顺便说一句,谢谢你的解释。
  • @user 好的,这很公平。如果你愿意,你可以在比赛结束后询问,以防没有文章
  • 我可以向您保证,在这种情况下您不需要枚举所有子集。祝你好运。

标签: algorithm set subset


【解决方案1】:

例如,如果您想打印所有子集或将它们显式存储在没有此类算法的任何地方。请注意,2^n 是一组 n 元素的子集,简单地枚举它们需要 exponential time

【讨论】:

    【解决方案2】:

    虽然显然没有多项式时间方法可以生成 n 元素集的所有子集,但某些方法比其他方法更有效。特别是,如果您使用Gray code,您可以通过从连续子集中添加或删除单个元素来从一个子集转到另一个子集。这将使例如蛮力背包解决方案明显更有效(例如 n 大约 30 或更小)。

    【讨论】:

    • 能否请您解释一下格雷码的方法?
    • @user 这有点涉及,但我链接到的维基百科文章描述了一种生成它们的算法。请注意,即使出于许多目的,格雷码比以 2 为基数的方法中从 0 到 2^n-1 的幼稚计数要好,但没有免费的午餐,从 1 个子集到下一个子集在算法上并不容易.如果使用格雷码值得额外的编程工作,这真的取决于你想对子集做什么。
    猜你喜欢
    • 2018-12-15
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多