0

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

如果我遍历列表并找到 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
4

2 回答 2

0

我不知道理论速度,但是当它成为一个实际问题时,我会使用each_cons并研究速度。

于 2013-03-27T22:14:58.823 回答
0

stddevsqrt(variance)。总体方差是总体平方和的平均值。您说您希望在 20 个元素的子列表上运行 stddev。因此,您可以先计算前 20 个元素的平方和,然后迭代剩余元素,减去第 n-20 个元素的平方并加上新元素的平方并计算sqrt(current_sum_of_squares/20.0)stddev . 这将导致计算量减少约 20 倍,因为在 N-20 个 20 元素子列表上独立计算 stddev。

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

我现在得跑去开会,否则我会展示一些代码。如果不清楚的话,也许今晚晚些时候。

于 2013-03-28T01:05:44.097 回答