ruby - 无需在 Erlang 或 Ruby 中保留堆栈即可生成集合的幂集

标签 ruby erlang subset powerset

我想生成一个相当大的集合(大约 30-50 个元素)的幂集,我知道需要 2^n 来存储幂集。

是否可以一次生成一个子集?

即通过迭代生成一个集合的幂集,将每个生成的子集保存到磁盘/数据库,将其从堆栈/内存中删除,然后才继续生成其他子集?

不幸的是我修改失败ErlangRuby我需要的示例。

最佳答案

编辑:如果没有给出 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/

相关文章:

unicode - Erlang、io_lib 和 unicode

ruby - to_proc 方法在 Ruby 中意味着什么?

ruby-on-rails - 枚举一个枚举

ubuntu - Rabbitmq 监听所有接口(interface)

Erlang 控制台不提供任何输出(在 Windows 上)

algorithm - 集合的每个子集的最小和最大元素的或之和

r - 根据数据帧子集在数据框中创建一个包含另一列变量的新列

r - 基于列类的列表内的子集数据框

ruby - 如何使用 ruby​​ 自动填写在线表格?

ios - 使用 RubyMotion 解析 JSON