0

たとえば、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
4

2 に答える 2

0

stddevですsqrt(variance)。母分散は、母集団の二乗和の平均です。20 要素のサブリストに対して実行中の stddev が必要だとします。したがって、最初の 20 要素の二乗の合計を計算することから始めて、残りの要素を反復処理し、n-20 番目の要素の二乗を減算し、新しい要素の二乗を追加しsqrt(current_sum_of_squares/20.0)て stddevを計算することで、これをより速く計算できます。 . これにより、N-20 個の 20 要素のサブリストに対して独立して stddev を計算するので、計算が約 20 分の 1 になります。

stdev を n-20 番目の要素にプッシュすることは、大きなリストへの大きな変更を伴わず、その 1 つの要素に追加するだけなので簡単です。

今すぐ会議に行かないと、コードを見せたくなります。これが明確でない場合は、おそらく今夜遅くに。

于 2013-03-28T01:05:44.097 に答える
0

理論上の速度についてはわかりませんが、実用的な問題になったときにeach_consを使用して速度を調べます。

于 2013-03-27T22:14:58.823 に答える