我有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
答案 0 :(得分:0)
我不知道理论速度,但我会使用each_cons并在速度变成实际问题时调查速度。
答案 1 :(得分:0)
stddev
是sqrt(variance)
。人口方差是人口平方和的平均值。你说你希望运行stddev超过20个元素的子列表。所以你可以通过计算前20个元素的平方和来开始计算,然后迭代剩下的元素,减去n-20元素的平方并添加新元素的平方并计算{{1对于stddev。与在N-20 20个元素子列表上独立计算stddev相比,这将导致计算量减少约20倍。
将stdev推送到n-20元素是微不足道的,因为它不涉及任何重大突变到大列表,只是附加到那个元素。
我现在要去参加一个会议,或者我会展示一些代码。也许今晚晚些时候如果不清楚的话。