繁体   English   中英

在使用大型集合(在Ruby中)时,为什么使用注入/减少比使用map.with_index更有效?

[英]Why is using inject/reduce more efficient than using map.with_index when working with large collections (in Ruby)?

我当时正在处理Codewar问题 ,我想出的方法适用于小型阵列,但不适用于大型阵列。

提供的解决方案使用了inject方法,我认为该方法比我拥有的mapwith_index组合的效率更高。

但是,我不确定我为什么会理解为什么inject方法比循环更有效。 有人可以照耀一下吗?

问题如下:给定一个数组,返回一个数组,其中每个元素都是数组子部分的总和。

示例: array = [0, 1, 3, 6, 10]

我在迭代数组时对每个数组元素求和(因此数组变得越来越小):

[0, 1, 3, 6, 10] => 20
[1, 3, 6, 10] => 20
[3, 6, 10] => 19
[6, 10] => 16
[10] => 10
[] => 0

因此,该方法将在此处返回: [20, 20, 19, 16, 10, 0]

我的解决方案(适用于小型阵列,但不适用于大型阵列):

def parts_sums(ls)
  (ls + [0]).map.with_index { |_, i| ls[i..-1].sum }
end

提供的解决方案:

def parts_sums(ls)
  ls.reduce([ls.sum]) { |sums, x| sums << sums.last - x }
end

通过浏览Codewars注释部分,我了解到这种性能差异与Big O表示法相关。 但是,我在该主题上发现的所有资源都远远超出了我对数学和算法的理解。

我也看过Ruby文档,但我对C的理解不足,无法阅读这些方法的实现。

可能有人请解释很简单而言,为什么inject / reduce的效率比map.with_index在这种情况呢?

让我们从reduce版本开始。

ls.reduce([ls.sum]) { |sums, x| sums << sums.last - x }

它对一个数组求和一次(在步骤零),然后在每次后续迭代中减去两个整数。


您的解决方案每一步的数组尾部求和 求和需要整个数组遍历,这就是为什么在大型数组上效率很低的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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