【问题标题】:Optimize nested loops in Ruby优化 Ruby 中的嵌套循环
【发布时间】:2017-02-22 18:59:42
【问题描述】:

在 Ruby 中,我有三个嵌套循环:

array.each do |a|
  array.each do |b|
    array.each do |c|
      puts a * b * c
    end
  end
end

如果嵌套循环的数量可以增加到 5-10 次或更多迭代,我该如何优化这段代码?

例子:

array.each do |a|
  array.each do |b|
    array.each do |c|
       array.each do |d|
         array.each do |e|
           array.each do |f|
             puts a * b * c * d * e * f
           end
         end
      end
    end
  end
end

【问题讨论】:

  • 对不起我的英语不好(我是俄罗斯人)。

标签: ruby optimization nested-loops


【解决方案1】:

你可以这样做:

array.repeated_combination(array.size).each do |combination| 
  puts combination.reduce(:*)
end

Array#repeated_combination 返回一个枚举器,它产生所有可能的组合。

由于此方法在打印任何输出之前生成所有组合,因此可能需要一段时间,具体取决于数组的大小。请记住,可能的组合数量增加得非常快:O(nⁿ) 其中n 是数组中的元素数量。

【讨论】:

    【解决方案2】:

    这里有另外两种方法(虽然我更喜欢@spickermann 的回答)

    #1

    array = [1,2,3]
    n = 4
    arr = array.product(*[array]*(n-1)).map { |arr| arr.reduce(:*) }
    arr.size #=> 81 = arr.size**n
    arr.each { |e| puts e }
    1
    2
    3
    2
    4
    6
    3
    6
    9
    ...
    54
    27
    54
    81
    

    如果您只想打印产品,请将map 替换为each,将arr.reduce(:*) 替换为puts arr.reduce(:*)

    #2

    sz = array.size
    (0...sz**n).map { |i| i.to_s(sz)
                           .rjust(n,'_')
                           .chars
                           .reduce(1) { |t,e| t * (e=='_' ? 1 : array[e.to_i]) }
                    }
    

    【讨论】:

      猜你喜欢
      • 2021-01-21
      • 1970-01-01
      • 1970-01-01
      • 2013-05-30
      • 1970-01-01
      • 2012-01-27
      • 2015-05-29
      • 2020-05-18
      相关资源
      最近更新 更多