2016-03-23 59 views
3

我很好奇,如果我的標準偏差方法可以提高效率。通過高效率我的意思是快速,而且我的意思是指從方法調用到方法返回的延遲。我的標準偏差計算可以更有效嗎?

下面的代碼:

public double stdDev(ArrayList<Double> input) { 

    double Nrecip = (1.0/(input.size())); 
    double sum  = 0.0; 
    double average = 0.0; 

    for (Double input : inputs) { 
     average += input; 
    } average *= Nrecip; 

    for (Double input : inputs) { 
     sum += ((input - average)*(input - average)); 
    } sum *= Nrecip; 

    return Math.sqrt(sum); 

} 

我將不勝感激任何意見。

+0

你可以做'平均+ = Nrecip *輸入;',但不會做什麼更快 –

+2

你可以使用'double'代替Double'的'和使用的一小部分記憶。 –

+0

計算'(輸入 - 平均值)'而不是兩次? –

回答

4

您可以一次計算標準偏差。使用double[]也會更有效。

public static double stdDev(double... a) { 
    double sum = 0; 
    double sq_sum = 0; 
    for (int i = 0; i < n; ++i) { 
     double ai = a[i]; 
     sum += ai; 
     sq_sum += ai * ai; 
    } 
    double mean = sum/n; 
    double variance = sq_sum/n - mean * mean; 
    return Math.sqrt(variance); 
} 

這該解決方案in C here

傳遞內存曾經可以提高性能的轉換。

+0

很好的答案,謝謝。 「double ... a」是什麼意思?我不熟悉那種語法。另外,我正在使用'ArrayList ',因爲這個方法通常會以循環方式使用,所以使用'ArrayList'可以進行簡單的更新。兩種數據結構之間的速度損失是否顯着?我認爲'ArrayList'有恆定的時間讀取。 – d0rmLife

+1

@ d0rmLife ArrayList是一個常量時間,創建'new Double'的成本也是如此,但常數因子更高。使用'double..'就像一個數組,但是你可以使用'double d = stdDev(1,2,3,4,5);'使用'double []'可以使用' ArrayList '這可以在開始使用CPU緩存時發揮作用。 –

+1

@ d0rmLife這裏是一個包裝一個'double []'但行爲像一個ArrayList的類的例子http://trove4j.sourceforge.net/javadocs/gnu/trove/list/array/TDoubleArrayList.html –

0

使用org.apache.commons.math3.stat.descriptive

public double stdDev(ArrayList<Double> input) { 

    DescriptiveStatistics ds = new DescriptiveStatistics(input.toArray(new Double[0])); 

    return ds.getStandardDeviation(); 

}