迭代一个对象数组并添加到一个早期元素...比迭代一小部分更有效吗?

时间:2013-03-27 22:02:17

标签: ruby

我有1000个对象的列表。我想在每个对象中添加一个字段来表示最后20个对象的标准偏差。在列表的末尾,我将有980个滚动标准偏差和20个零。

如果我遍历列表并找到stdev,但我之前将它推送到一个元素20个对象,那是什么类型的问题?这是一个2n问题吗?

以下是我的代码示例:

(0...thelist.length-20).each do |n|
       ...do some calculations on n 
       if n == 20:
           ...use the calculations to calculate stdev
           thelist[n-20].push(stdeviation)
       end
end

基本上我想知道[n-20]如何影响函数的理论速度。

我也可以做类似下面的事情来计算标准偏差,但我觉得最好的会更快,因为我在每个单独的元素上计算更多,而在下面对20个元素进行迭代。速度有什么不同吗?

 (0...thelist.length-20).each do |n|
       (n..n+20).each do |m|
            ...calculate stdev
       end
 end

2 个答案:

答案 0 :(得分:0)

我不知道理论速度,但我会使用each_cons并在速度变成实际问题时调查速度。

答案 1 :(得分:0)

stddevsqrt(variance)。人口方差是人口平方和的平均值。你说你希望运行stddev超过20个元素的子列表。所以你可以通过计算前20个元素的平方和来开始计算,然后迭代剩下的元素,减去n-20元素的平方并添加新元素的平方并计算{{1对于stddev。与在N-20 20个元素子列表上独立计算stddev相比,这将导致计算量减少约20倍。

将stdev推送到n-20元素是微不足道的,因为它不涉及任何重大突变到大列表,只是附加到那个元素。

我现在要去参加一个会议,或者我会展示一些代码。也许今晚晚些时候如果不清楚的话。