簡體   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