我想生成一个相当大的集合(大约 30-50 个元素)的幂集,我知道需要 2^n
来存储幂集。
是否可以一次生成一个子集?
即通过迭代生成一个集合的幂集,将每个生成的子集保存到磁盘/数据库,将其从堆栈/内存中删除,然后才继续生成其他子集?
最佳答案
编辑:如果没有给出 block ,则添加枚举器(如@Jörg W Mittag)。
class Array
def powerset
return to_enum(:powerset) unless block_given?
1.upto(self.size) do |n|
self.combination(n).each{|i| yield i}
end
end
end
# demo
['a', 'b', 'c'].powerset{|item| p item} # items are generated one at a time
ps = [1, 2, 3, 4].powerset # no block, so you'll get an enumerator
10.times.map{ ps.next } # 10.times without a block is also an enumerator
输出
["a"]
["b"]
["c"]
["a", "b"]
["a", "c"]
["b", "c"]
["a", "b", "c"]
[[1], [2], [3], [4], [1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]]
关于ruby - 无需在 Erlang 或 Ruby 中保留堆栈即可生成集合的幂集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8533336/