Calculer le minimum, le maximum et la moyenne des nombres entrés

Existe-t-il un moyen de calculer la moyenne / min / max de tous les nombres sans utiliser de tableau? Besoin de calculer jusqu’à 10 000 nombres par seconde.

Oui,

Conservez une variable minimale initialisée avec une valeur élevée et mettez-la à jour si vous voyez une valeur inférieure.

Faites l’inverse avec une variable maximale.

Additionnez tous les nombres et divisez cette sum par le nombre total pour obtenir la moyenne.

Le code suivant ne fait pas de vérification des limites (par exemple, compte> 0, le total ne déborde pas) mais devrait vous donner une idée:

int minimum = // Initialize to large #, in C# would be int.MaxValue int maximum = // Initialize to most negative #, in C# would be int.MinValue int count = 0; int total = 0; void StatsForNewNumber(int number) { if (number < minimum) minimum = number; if (number > maximum) maximum = number; count++; total += number; } int Average() { return total / count; } 

Sûr. Conservez le plus petit et le plus grand nombre que vous avez reçu, ainsi que la sum et le nombre de chiffres. Lorsque vous avez besoin du plus petit ou du plus grand, renvoyez-le. Lorsque vous avez besoin de la moyenne, divisez la sum par le nombre.

Boost Accumulators inclut des implémentations de tout ce qui précède, ainsi que de nombreuses autres.

Absolument: tout ce qui peut être calculé élément par élément.

Conservez le minimum actuel et le maximum actuel, calculez le total cumulé et le nombre. Lorsque vous avez besoin de la moyenne, divisez le total cumulé par le nombre et vous obtiendrez votre réponse.

 class calc { double minVal, maxVal, total; int count; public: calc() : minVal(numeric_limits::max) , maxVal(numeric_limits::min) , total(0) , count(0) { } void process(double num) { minVal = min(minVal, num); maxVal = max(maxVal, num); total += num; count++; } double getAvg() { // TODO: Check count to be > 0 here return total / count; } double getMin() { return minVal; } double getMax() { return maxVal; } } 

Créez quatre variables: une pour stocker minVal, une pour maxVal, une pour la sum totale et une pour incrémenter après chaque nouvelle entrée. compare chaque nouvelle entrée à minVal et maxVal et met à jour si nécessaire. Ajoutez la valeur d’entrée à la sum totale, incrémentez le compteur. La moyenne est toujours la sum totale / compteur, vous pouvez donc interroger cette valeur à la volée si vous en avez besoin ou simplement la calculer à la fin lorsque vous avez terminé.

Vous n’avez pas vraiment besoin de stocker des nombres dans un tableau pour trouver la moyenne / min / max, car vous parcourez les nombres que vous faites

 if(currentSmallest > currentNumber) currentSmallest = currentNumber if(currentLargest < currentNumber) currentLargest = currentNumber 

et en plus vous garderez un compteur et la sum totale, et en divisant ces nombres, vous obtiendrez la moyenne. Pas besoin de les stocker dans un tableau.