2016-03-23 15 views
3

Ich bin gespannt, ob meine Standardabweichung Methode effizienter gemacht werden kann. Mit effizient meine ich schnell, und mit schnell meine ich die Latenz vom Methodenaufruf zur Methodenrückgabe.Kann meine Standardabweichungsberechnung effizienter gemacht werden?

Hier ist der Code:

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); 

} 

ich einen Rat schätzen würde.

+0

Sie tun könnte 'Durchschnitt + = Nrecip * Eingang;', aber das wird nichts schneller –

+2

machen Sie 'verwenden könnte double' statt' Double' und verwenden einen Bruchteil die Erinnerung. –

+0

Berechne '(Eingabe - Durchschnitt)' nur einmal statt zweimal? –

Antwort

4

Sie können die Standardabweichung in einem einzigen Durchgang berechnen. Mit einem double[] wäre auch effizienter.

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); 
} 

Dies ist eine Umsetzung dieser Lösung einmal in C here

den Speicher Passing die Leistung verbessern könnte.

+0

Schöne Antwort, danke. Was bedeutet "double ... a"? Ich kenne diese Syntax nicht. Außerdem verwende ich 'ArrayList ', weil diese Methode oft auf einer rollenden Basis verwendet wird, so dass die Verwendung einer 'ArrayList' eine einfache Aktualisierung ermöglicht. Ist der Geschwindigkeitsverlust zwischen den beiden Datenstrukturen signifikant? Ich dachte "ArrayList" hatte konstante Zeit gelesen. – d0rmLife

+1

@ d0rmLife ArrayList ist eine konstante Zeit, ebenso wie die Kosten für die Erstellung von 'new Double', aber der konstante Faktor ist höher. Die Verwendung von 'double..' ist wie ein Array, aber Sie können' double d = stdDev (1,2,3,4,5) verwenden; 'Mit' double [] 'können ~ 28% des Speichers eines' 'verwendet werden ArrayList 'was einen Unterschied machen kann, wenn Sie anfangen, Ihre CPU-Caches zu verbrauchen. –

+1

@ d0rmLife hier ist ein Beispiel für eine Klasse, die eine 'double []' umschließt, aber sich wie eine ArrayList verhält http://trove4j.sourceforge.net/javadocs/gnu/trove/list/array/TDoubleArrayList.html –

Verwandte Themen