如何记忆多维数组生成方法

时间:2017-10-13 04:12:07

标签: ruby algorithm optimization dynamic-programming

我有一个table_data方法用于为乘法表构建一个多维数组。表的第一行和第一行是相同的,每个单元格包含相应行和列的产品。下面是最终打印的内容:

    2   3   4 . . n

2   4   6   8

3   6   9  12

4   8  12  16
.
.
n

正如您所看到的,有许多重复项可以记忆。以下是生成多维数组的代码:

def table_data(n)
  table_header(n).map do |x|
    table_header(n).map do |y|
      x*y
    end
  end
end

def table_header(n)
  @header_data ||= (1..n).to_a
end

table_data方法需要二次时间;它正在做两倍的必要工作(x*yy*x)。如何记忆和/或改变此方法以减少运行时间?

1 个答案:

答案 0 :(得分:1)

在减少运行时方面,这取决于您是否认为x*y操作可忽略不计。如果用某种SQL查询替换它或者具有更实际成本的东西,那么缓存它就有意义了。但就大O复杂性而言,这里的动态变量是表格的宽度/高度,例如迭代次数,我没有看到减少的好方法。

无论如何,要缓存x*y,你可以创建一个像这样的辅助类

class MultiplicationCache
  def initialize
    @cache = {}
  end
  def multiply(a,b)
    @cache[[a,b].sort] ||= a * b
  end
end

# usage
cache = MultiplicationCache.new
puts cache.multiply(1,2) # => 2

同样,除非用一些计算成本非常高的东西替换x*y,否则这样做真的没有意义。