Il existe un flux continu d'entiers et la moyenne doit être calculée à une instance donnée en utilisant uniquement la mémoire. P>
3 Réponses :
La plate-forme Java 8 fournit un intestream qui vous permet d'appeler simplement moyenne () .
int[] allInts = { 1, 2, 3, ..., n }; OptionalDouble average = IntStream.of(allInts).average();
Par un flux d'entiers, je veux dire qu'il y a une demande d'entrée à une vitesse de 1 demande par seconde. Et je ne peux utiliser aucune bibliothèque interne pour calculer la moyenne. Existe-t-il un algorithme efficace pour calculer la moyenne à un moment donné?
Vous pouvez utiliser bigdecimal code> pour conserver la somme et la moyenne; Cela ne déborde pas.
public void test(int[] values) {
BigDecimal sum = BigDecimal.ZERO;
for (int count = 0; count < values.length; count++) {
sum = sum.add(new BigDecimal(values[count]));
System.out.printf("%s/%d = %s%n", sum, (count+1), sum.divide(new BigDecimal(count+1)));
}
}
Si le taux de demande d'entrée est augmenté de 1 demande par seconde à 1 demande par nano secondaire pourra toujours fonctionner? Et puis-je profiter sur le fait que la valeur de demande va aller de 0 à 100 et réinitialiser les valeurs pour éviter le débordement, car l'intervieweur m'a demandé de ne pas utiliser de classe BigInteger ou BigDecimal.
Aller de 1 seconde à 1 nano-seconde? Impossible d'utiliser BigDecimal? Maintenant, vous déplacez les poteaux de but. Et comme de côté, c'est au-delà de la conviction que les entreprises posent des questions à ces types de questions.
Ya j'avais le même sentiment lorsque l'intervieweur l'a changé à 1 demande par nano deuxième.
Avec une résolution nanoseconde, votre nombre d'articles débordera en quelques jours également.
Cependant, vous pouvez - au lieu de garder la somme - conserver la valeur moyenne et reproduite lorsque un nouvel article arrive. p> comme pour la raison pour laquelle cela fonctionne, disons que vous traversez les valeurs p> 3, 2, 5 p>
blockQuote> La première valeur entraînera une moyenne de p> 3/1 = 3 p>
blockQuote> (avec le "1" étant la quantité de valeurs). P> MAINTENANT, le 2 arrive. Cela signifie que nous voulons (3 + 2) / 2 ou (3/1) / 2 + (2/2), donc nous divisons la moyenne précédente "3" par (1 + 2) / 2. Nouvelle moyenne est maintenant p> 3/2 + 2/2 = 2.5 p>
BlockQuote> Maintenant, le 5 arrive. Maintenant, nous voulons P> (3 + 2 + 5) / 3 = (3 + 2) / 3 + 5/3 P>
blockQuote> ou - parce que nous n'avons plus les 3 et 2 dans (3 + 2), plus - P> = (3 + 2) / 2 * 2/3 P>
blockQuote> (3 + 2) / 2 est l'ancienne moyenne, 2 est l'ancien compte, et 3 est le nouveau compte. P> P>
Parfait, c'était celui que je cherchais. Merci. Pouvez-vous l'expliquer gentiment avec un exemple de la façon dont cela fonctionne? Merci encore.
J'ai ajouté une explication.
S'il vous plaît ajouter des exemples de code. À quoi ressemble le flux? Est-ce une croissance?
Un exemple serait bon pour illustrer l'exigence. Pas vraiment clair toujours imho.
En outre, montrez ce que vous avez essayé.
Cela ressemble à une mission scolaire. Pourquoi ne pas publier l'affectation, Verbatim, telle qu'elle a été fournie afin que nous puissions offrir des suggestions? Et déborder
C code> et
s code> n'a rien à voir avec l'efficacité. Mais si vous êtes inquiet du débordement, utilisez une longue.