我想生成一个相当大的集(大约30-50个元素)的powerset,我知道存储powerset需要2^n
一次可以生成一个子集吗?
即,生成一个包含迭代的集合的powerset,将每个生成的子集保存到磁盘/数据库中,从堆栈/内存中删除它,然后继续生成其他子集?
不幸的是,我未能根据自己的需要修改ErlangRuby示例。

最佳答案

编辑:如果没有给出块,则添加枚举器(如@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]]

09-17 05:08