数组的各个部分的总和

时间:2013-01-24 15:00:09

标签: ruby

我有一个数组xs,我需要计算其中三个连续部分的元素总和。对于某个整数xs[0],这些部分为xs[1, N]xs[N + 1, N]N。例如,对于N = 2

[1, 2, 3, 4, 5] #=> 1, 5, 9

我的实施如下。我无法让内存/速度更快,但它仍然困扰我,我想我现在没有别的事可做,但也许有更优雅和简洁的方法来做到这一点?我不必生成数组,它可以是任何其他结构。

xs.each_with_index.reduce([0, 0, 0]) do |m, x|
  v, i = x
  j = (i > N ? 2
       : i > 0 ? 1
       : 0)
  m[j] += v.to_i
  m
end

2 个答案:

答案 0 :(得分:2)

[xs[0..0],xs[1..N],xs[N+1..-1]].map{|x|x.reduce{|a,b|a+b}}

a.rb

N = (rand * 1E6).to_i
xs = 1.upto(1E6).to_a

xs.each_with_index.reduce([0, 0, 0]) do |m, x|
  v, i = x
  j = (i > N ? 2
       : i > 0 ? 1
       : 0)
  m[j] += v.to_i
  m
end

b.rb

N = (rand * 1E6).to_i
xs = 1.upto(1E6).to_a

[xs[0..0],xs[1..N],xs[N+1..-1]].map{|x|x.reduce{|a,b|a+b}}

时间:

$ time ruby a.rb 
ruby a.rb  0.85s user 0.01s system 99% cpu 0.860 total

$ time ruby b.rb 
ruby b.rb  0.29s user 0.01s system 99% cpu 0.296 total

Ruby版本:

$ ruby -v
ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-darwin12.0.0]

答案 1 :(得分:2)

小变种:

[xs[0..0],xs[1..N],xs[N+1..-1]].map{|x|x.inject(:+)}