ERLEDIGT
NEIN
NEIN
ANTWORTEN
6
6
ZUGRIFFE
574
574
EMPFEHLEN
-
Ich hab ein ziemlich komisches Problem:
Ich suche einen Alorithmus um einen Durschnittswert zu berechnen ohne jeden Wert zusammen zu zählen und durch die Anzahl zu teilen.
einfaches Beispiel:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13
int werte[100]; for(int i=0; i<100; ++i) { werte[i] = rand(); } // folgendes würde nun nicht gehen wenn die zahlen zu groß sind int sum = 0, avg; for(int i=0; i<100; ++i) { sum += werte[i]; } avg = sum / (sizeof(werte) / sizeof(werte[0]));
Wenn ich nun diese Werte alle zusammen zähl kann es ja sein dass die größer/kleiner werden (-)2.147.483.647 und dann würde gar nichts mehr stimmen.
Hat jemand eine Idee wie das geht?Geändert von FireFlow (23.01.05 um 16:02 Uhr)
-
23.01.05 15:15 #2
- Registriert seit
- Jul 2003
- Ort
- Duisburg (NRW)
- Beiträge
- 1.788
Also, bei meinem VC++ eist der Maximalwert, den rand() ergibt, RAND_MAX. Das ist folgendermassen definiert:
The constant RAND_MAX is the maximum value that can be returned by the rand function. RAND_MAX is defined as the value 0x7fff.
0x7fff ist dezimal 32767. Der Wertebereich von int ist wesentlich grösser, so dass du dir keinerlei Sorgen machen musst, mit 100 Ergebnissen einen Overflow zu erzeugen, weil du auf maximal 3276700 kommst.
Hm? Wie bitte?ohne jeden Wert zusammen zu fählenChor: "Wir sind der Chor, und wir stimmen zu. Wir stimmen zu, wir stimmen zu, wir stimmen zu."
-
Das war ja nur ein Beispiel. Wie sieht es aus wenn ich 1000 oder 10000 Werte hab. Eigentlich kommen die Werte von einer Schnittstelle. Das Problem ist nicht dass ich sehr hohe Zahlen hab sondern sehr viele. Gibts da keine Lösung?
-
also wenn du mit double precission nicht auskommst (hier wäre es dann aber vielleicht besser jedes einzelnen element mit 1/N zu dividieren und diese zu addieren)
Als letzte Lösung wäre es sich eine eigene Klasse zu schreiben die z.B.: ein riesen Integer mit quasi unbegrenztem Wertebereich abbildet
-
23.01.05 18:11 #5
- Registriert seit
- Jul 2003
- Ort
- Duisburg (NRW)
- Beiträge
- 1.788
Den Algorithmus würde ich gerne mal analysiert sehen. Ich bin nicht sicher, aber ich glaube, da steckt ein Denkfehler drin.also wenn du mit double precission nicht auskommst (hier wäre es dann aber vielleicht besser jedes einzelnen element mit 1/N zu dividieren und diese zu addieren)
So was findet sich ja fertig auch im Netz.Als letzte Lösung wäre es sich eine eigene Klasse zu schreiben die z.B.: ein riesen Integer mit quasi unbegrenztem Wertebereich abbildet
Alternativ wären auch 64-Bit-Integers einsetzbar. Du könntest dann knapp 562949953421312 Werte summieren, falls du es schaffst, an so viele Daten zu kommen und sie zwischenzuspeichern. Hm, bin gerade zu faul, auszurechen, wieviel Gigabyte an Eingabedaten das wären.
Übrigens könnte man auch immer solange Werte addieren, bis man kurz vor Overflow steht und dann den Mittelwert bilden. Diesen merkt man sich mitsamt der Anzahl von Werten, die zu seiner Bildung beitrugen. Dasselbe macht man mit den restlichen Werten, bis alle Werte verarbeitet sind. Nun kann man die gebildeten Mittelwerte noch einmal gewichtet mitteln.Chor: "Wir sind der Chor, und wir stimmen zu. Wir stimmen zu, wir stimmen zu, wir stimmen zu."
-
23.01.05 18:16 #6
Ein Ansatz für einen anderen Algorithmus wäre der, dass du jeweils den Durchschnitt einer Zahl n und den Durchschnitt aller Zahlen von 1 bis n - 1 berechnest.
Ok, klingt jetzt verwirrend, Beispiel:Die beiden /2 Operationen, weil [1,3] zwei Zahlen sind. Da käme dann einfach n rein.Code :1 2 3
Zahlen: 1, 3, 5 Durchschnitt von 1 und 3: 2 Durchschnitt von [1,3] und 5: (5/2 + 2) / (3/2)
Hm... ich befürchte, das hat niemand verstanden.
-
Naja mit 1/N multiplizieren natürlich; Wenn N vorher bekannt ist und alle Zahlen im Speicher sind bzw. einlaufen ... ist das einfach das disrtibutiv gesetztalso wenn du mit double precission nicht auskommst (hier wäre es dann aber vielleicht besser jedes einzelnen element mit 1/N zu dividieren und diese zu addieren)
(a + b) c = ac + bc
bzw, (1/N) sum(Xn) = sum( Xn / N )
Ich glaub was Silent warrior meinte:
Mn = ((n-1)/n) Mn-1 + Xn
M2 = (X1 + X2)/2
Mn : Mittelwert nach dem n-ten Wert
Xn der neue Wert
Aber hier musst du auf jeden fall mit double rechnen und ich weiß net wie lange des mit (n-1)/n gut geht, weil double ja präzission verliert wenn die Zahlen sehr groß werden aber mit 10000 wirds da noch keinen ärger gebenGeändert von basd (23.01.05 um 22:00 Uhr)
Ähnliche Themen
-
RSA Algorithmus
Von spliff im Forum Algorithmen & Datenstrukturen mit JavaAntworten: 2Letzter Beitrag: 12.02.09, 10:54 -
sha-256 Algorithmus lib ?
Von Anime-Otaku im Forum Algorithmen & Datenstrukturen mit JavaAntworten: 3Letzter Beitrag: 18.12.06, 13:15 -
Was ist Algorithmus?
Von SMoeller im Forum JavaAntworten: 1Letzter Beitrag: 28.09.05, 20:42 -
DES-Algorithmus...
Von DoRiMaN im Forum Coders TalkAntworten: 7Letzter Beitrag: 29.08.04, 12:15 -
Algorithmus
Von Husky im Forum PHPAntworten: 19Letzter Beitrag: 10.10.01, 22:10





)
Zitieren
Login





