是否有可能在 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}
答案 0 :(得分:5)
不。时间复杂度将始终受到输出大小的限制。由于大小为 n 的集合的幂集的大小为 2 n ,因此没有算法可以找到小于 O的幂集(2 n )。
就总空间而言,由于输出的大小为 2 n ,因此您做不到的任何事情都不会比 O (2 n )。
尽管就辅助空间而言,给定大小为 n 的集合 s ,幂集的任何元素都可以用二进制表示长度为 n 的字符串。表示 s 的元素 x 是否在集合中的每个位置。
通过示例,给定集合{a, b, c}
,字符串101
代表子集{a, c}
。
尤其是因为二进制字符串是整数的表示形式,所以您可以在集合上定义一些顺序并枚举其元素。作为中间存储,这只需要一个整数,其大小不超过 O(n)。
这在实现生成器的语言中特别有用,在该生成器中,如果功率集几乎没有辅助存储,则可以遍历所有元素。