Bonjour,
j'utilise l'algorithme suivant pour calculer la moyenne des X derniers elements d'un gros flux de données (comprendre qu'il n'est pas stocké entièrement en mémoire). Je veux que ma moyenne soit mise à jour très rapidement à chaque nouvelle entrée, donc j'utilise une file sous la forme d'une LinkedList (voir classe Moyenne dans le code ci-dessous)
Je peux ainsi obtenir, par exemple, la moyenne des 1000 derniers elements
Maintenant, je veux obtenir en plus la moyenne des 500 derniers elements du même flux. Je peux creer un Moyenne(1000) et un Moyenne(500) et faire un addLast() sur les deux, mais 1500 elements seront stockés en mémoire dont 500 en doublon, et je souhaite ne pas avoir de doublons. J'ai pensé faire une classe SousMoyenne qui met à jour un Iterator sur la LinkedList, mais l'itérateur devient obsolète lorsque l'on fait un addLast() sur la liste chainée (... je regrette mes bon vieux pointeurs C)
Vous voyez une solution ?
Ne vous cassez pas la tête à faire du code, juste une vague idée, je creuserais![]()
Merci d'avance![]()
je souhaite pouvoir faire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 class Moyenne { LinkedList<Integer> list = new LinkedList<Integer>(); int maxNbEntrees, total = 0; Moyenne(int maxNbEntrees) { this.maxNbEntrees = maxNbEntrees; } void addLast(int val) { list.addLast(val); total += val; if (list.size() > maxNbEntrees) total -= list.removeFirst(); } double moyenne() { return (list.size() == 0) ? 0 : total / list.size(); } public static void main(String args[]) { Moyenne moy = new Moyenne(2); moy.addLast(10); moy.addLast(4); moy.addLast(6); // le 10 est supprimé de la liste System.out.println(moy.moyenne()); // 5 } }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 GroupeMoyenne grp = new GroupeMoyenne(1000); // hérite de SousMoyenne(1000); SousMoyenne moy500 = new SousMoyenne(grp, 500); while (...) { ... grp.addLast(element); // met grp ET moy500 à jour moy500.moyenne(); // moyenne des 500 derniers elements grp.moyenne(); // moyenne des 1000 derniers elements }
Partager