【问题标题】:Improve Ruby function performance permutations改进 Ruby 函数性能排列
【发布时间】:2014-07-29 22:54:14
【问题描述】:

我正在尝试解决 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)

【问题讨论】:

  • 问题不清楚。为什么[1, 2][2, 1]要分开计算?
  • 这是因为它们是独立的数组; [1,2] != [2,1]

标签: ruby performance big-o benchmarking permutation


【解决方案1】:

有几个效率低下。最明显的一点是,您构建了所有排列的总集,然后对其进行修剪。之后,您也只需要添加另一个 order n 操作的唯一元素。相反,我会尝试第一次正确构建输出。也许使用您知道数字是偶数或奇数的事实。你也知道任何两个都可以被挤压在一起形成一个 2。你能想出一些聪明的方法吗?此外,您不必为每个块中的每个 n 重新计算事物。您应该能够缓存结果并重复使用它们

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-17
    • 1970-01-01
    • 2017-06-24
    • 2010-10-22
    • 2019-12-25
    • 2015-03-21
    • 2016-12-30
    相关资源
    最近更新 更多