【发布时间】:2018-06-21 13:51:41
【问题描述】:
是否有可能在 O(n) 时间 和 O(n) 空间 复杂度中找到所有可能的集合子集(即幂集)?
放入程序 >> {a,b,c}
预期输出在 O(n) 时间和 O(n) 空间复杂度,这里 n 为 3。
{}、{a}、{b}、{c}、{a,b}、{b,c}、{a,c}、{a,b,c}
【问题讨论】:
标签: algorithm big-o subset subset-sum
是否有可能在 O(n) 时间 和 O(n) 空间 复杂度中找到所有可能的集合子集(即幂集)?
放入程序 >> {a,b,c}
预期输出在 O(n) 时间和 O(n) 空间复杂度,这里 n 为 3。
{}、{a}、{b}、{c}、{a,b}、{b,c}、{a,c}、{a,b,c}
【问题讨论】:
标签: algorithm big-o subset subset-sum
没有。时间复杂度总是受限于输出的大小。由于一组大小为 n 的幂集的大小为 2n,因此没有算法可以在小于 O 的时间内找到幂集(2n).
就总空间而言,由于输出的大小是2n,你不能做得比O更好(2n).
虽然就辅助空间而言,给定一个大小为n的集合s,幂集的任何元素都可以用二进制表示长度为 n 的字符串。每个位置表示 s 的元素 x 是否在集合中。
例如,给定集合{a, b, c},字符串101代表子集{a, c}。
特别是由于二进制字符串是整数的表示,您可以在集合上定义一些顺序并枚举其元素。这需要,作为中间存储,只需要一个整数,其大小不超过O(n)。
这在实现生成器的语言中特别有用,如果 powerset 几乎没有辅助存储,您可以遍历所有元素。
【讨论】: