[英]Improve Ruby function performance permutations
我正在尝试解决10秒超时限制的问题(如果函数运行时间超过10秒,则代码被视为“错误”)。 问题是给定一个整数(n),在总和为n的情况下,可以对数字1和2进行多少个唯一的可能组合?
例如:n = 3,连击包括[1,1,1] [1,2] [2,1]
我的代码“正确”,但对于编译器而言运行太慢,并被标记为错误。 如何使我的代码更高效,为什么它“慢”? 另外,应注意,n永远不会超过1000。
require 'benchmark'
def stairs(n)
possible_combos = []
((n/2)..n).each do |i|
[1,2].repeated_permutation(i) do |combo|
if combo.inject {|sum, num| sum + num } == n
possible_combos << combo
end
end
end
puts possible_combos.uniq.length
end
puts Benchmark.measure {stairs(10)}
#=> 0.000000 0.000000 0.000000 ( 0.003864)
puts Benchmark.measure {stairs(20)}
#=> 5.720000 0.040000 5.760000 ( 5.762111)
效率低下。 最明显的是您将所有排列的总和建立起来,然后进行修剪。 之后,您还只需要添加唯一的元素即可添加另一个order n操作。 相反,我会尝试在第一时间建立输出。 也许使用您知道数字是偶数还是奇数的事实。 您还知道,可以将任意两个压在一起以组成一个2。您能想到使用它的巧妙方法吗? 另外,您不必为每个块中的每个n重新计算事物。 您应该能够缓存结果并重用它们
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.