Voici un algorithme qui sera un peu le travail à économiser de l'efficacité dans certains cas:
Comme les événements de venir dans, le tampon complètement, et de calculer un exécutant sum
, count
, min
, max
(trivial).
-
Lorsqu'une demande d' average
, min
ou max
est faite, en boucle à partir de l'arrière de la zone tampon et de commencer à supprimer les valeurs vieux de plus d'une seconde. Soustraire sum
et count
comme vous allez.
Si les valeurs sont toutes au-dessus de min
vous pouvez garder votre min
. Si les valeurs sont inférieures max
, vous pouvez garder votre max
. Dans ce scénario, vous avez average
, min
, et max
mis à jour de manière efficace.
Si les valeurs sont inférieures min
ou au-dessus de max
, vous aurez besoin d'une boucle sur le reste de la matrice et de calcul.
L'étape deux fois une seconde également, de sorte que le tampon ne soit pas trop plein. Ce code peut être effectuée sur chaque tampon d'insérer également, ou partout où cela fait sens.
La meilleure structure pour ce type de travail est une mémoire tampon circulaire, afin d'éviter les allocations de mémoire et GC obtenir de la manière. Il devrait être assez grand pour couvrir le pire scénario pour la taille des messages par seconde.
Les mises à jour
En fonction du scénario d'utilisation d'un autre chose à faire serait de exécuter l'algorithme ci-dessus, mais en 10 x 100ms morceaux plutôt que 1 x 1000ms pièce. C'est, garder la course min, max, sum et count sur ces 10 morceaux. Ensuite, lorsque vous atteignez une 'invalidation du scénario, en général seulement besoin de regarder à travers la dernière 100ms de données ou un passage rapide à travers le min et le max de les 9 autres morceaux.
@ja72 fourni une excellente idée d'enregistrer sur la recherche sur les valeurs min et max s'ils sont invalidés:
Au lieu de garder les valeurs min/max x_min, x_max garder au lieu de l'indice de l'endroit où ils sont situés dans le x[i] tableau avec i_min et i_max. Puis de les trouver, peut-être trivial, parfois, mais lors de la dernière valeur considérée comme détient les min et max, l'ensemble de la liste doit être analysé pour établir de nouvelles limites.
Sam Titulaire a eu une autre bonne idée dans les commentaires - maintenir un réseau parallèle qui est toujours triée, cela vous permet de lop nombre le haut ou le bas pour trouver de nouveaux minimums et maximums plus facile. Cependant, insérez la vitesse ici est compromis un peu (il doit rester dans l'ordre).
En fin de compte, le bon choix dépend de l'utilisation des caractéristiques du programme. Quelle sera la fréquence des valeurs de vs lire comment souvent ils sont insérées?