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