我有一个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*y
和y*x
)。如何记忆和/或改变此方法以减少运行时间?
答案 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
,否则这样做真的没有意义。