[英]Why is using inject/reduce more efficient than using map.with_index when working with large collections (in Ruby)?
我当时正在处理Codewar问题 ,我想出的方法适用于小型阵列,但不适用于大型阵列。
提供的解决方案使用了inject
方法,我认为该方法比我拥有的map
和with_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.