繁体   English   中英

改善Ruby函数的性能排列

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM