ruby - 如何内存一个多维数组的生成方法

标签 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)。我如何内存和/或更改此方法以减少运行时间?

最佳答案

就减少运行时间而言,这取决于您是否将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 替换为计算成本非常高的东西,否则这样做没有任何意义。

关于ruby - 如何内存一个多维数组的生成方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46722414/

相关文章:

ruby-on-rails - 如何在 Ruby 中将数组元素作为单独的方法参数传递?

algorithm - 一种聚合相似序列的算法

algorithm - SML : Replacing a concat by printing the string directly

java - 加快全计数排序的方法

ruby-on-rails - Helper.rb 文件

ruby-on-rails - #<ApplicationHelperTest :0x000000075bf4d0> 的未定义方法 `remember'

javascript - 保存 Tensorflow.js 张量的先前值

c# - 在 C# 和 C++ 中将 float / double 乘以 0.5 而不是除以 2 是否安全?

sql - PostgreSQL 或 Rails 中的部分透视

algorithm - Prolog 练习 2-3-4 树