Hallo Leute Habe hier ein Array, welches 10 double Werte von 10 Messungen enthält. Nun möchte ich einfach diesen double Wert finden, welcher am meisten im Array vorhanden ist. Wie löse ich das am einfachsten, gibt es hier eine Funktion für? Die Methode sollte so schnell wie möglich sein. Grüsse Steffen
double-Werte kann man nicht so ohne weiteres auf Gleichheit prüfen. Da musst du dir schon Intervalle schaffen, bei denen du prüfst, wieviele Werte in jedem Intervall liegen.
Hallo Steffen, ich würde das Array zuerst sortieren und dann zählen wie oft hintereinander du den selben wert hast. Die andere Frage ist, wie genau deine Messung ist und wie groß die wahrscheinlichkeit, das du überhaupt 2 gleiche werte bekommst. Gruß Dennis
Hallo Stefan, wie groß ist denn die Wahrscheinlichkeit, dass sich unter 10 double Werten überhaupt zwei gleiche finden? Wie auch immer: Ich denke, effektiv, aber in O(2n) ist eine zweite Datenstruktur, der Form map<double, int>. Dann musst du dein Array einmal durchlaufen und dabei die Häufigkeiten in die map schreiben, und anschließend findest du in der map mit einem Durchlauf den größten Zähler. Das Konzept musst Du natürlich für die von Dir verwendete Programmiersprache anpassen. Grüße Andreas
Erstmals vielen Dank für die schnellen Antworten. Ich Programmiere das ganze in C im AVR Studio (GCC). Ich kann euch beruihgen, die Messung ist genau genug, dass unter 10 Werten immer mindestens 2 gleiche sind. Hab die Messung jetzt mehrmals durchgeführt und es waren praktisch immer nur 2 unterschiedliche Zahlen in den Ergebnissen vertreten. Da ich das Ergebnis sowiso auf 2 Nachkommastellen runden möchte, hab ich mir gedacht, nur integer Werte anstelle der Double werte ins Array zu laden. Also ich nehme das Messergebnis, rechne es *100 und +0.5. Mit dem Cast (int) schneide ich dann die Nachkommastellen ab und lade es ins Array. So hab ich nur Integer Werte vertreten, kann den meist vorkommenden raussuchen und anschliessend wieder in einen Double Wert wandeln. Ist dieses vorhaben einfacher? Wie finde ich in einem Int Array am schnellsten die meist vorkommende Zahl? Grüsse Stef
Steffen schrieb: > Da ich das Ergebnis sowiso auf 2 Nachkommastellen runden möchte, hab ich > mir gedacht, nur integer Werte anstelle der Double werte ins Array zu > laden. Das ist ein guter Gedanke. > Also ich nehme das Messergebnis, rechne es *100 und +0.5. OK. Dann dürfen aber keine negativen Zahlen vorkommen. Aber da du an die Rundungskorrektur gedacht hast, gehe ich davon aus, dass du weißt, das du bei negativen Zahlen die 0.5 abziehen musst > Mit dem > Cast (int) schneide ich dann die Nachkommastellen ab und lade es ins > Array. So hab ich nur Integer Werte vertreten, kann den meist > vorkommenden raussuchen und anschliessend wieder in einen Double Wert > wandeln. Wozu? Lass sie doch als int. Wenn irgendwie möglich solltest du dein Programm daraufhin abklopfen, ob es nicht generell möglich ist, grundsätzlich einfach alles in Hunderstel-Einheiten auszudrücken, also auf float komplett zu verzichten. > Ist dieses vorhaben einfacher? Wie finde ich in einem Int Array am > schnellsten die meist vorkommende Zahl? Gegenfrage: Wie würdest du das am Papier machen, wenn du die Aufgabe mit Papier und Bleistift lösen musst? Grundsätzlich ist die Idee mit zuerst aufsteiegend sortieren dann abzählen, wieviele gleichartige Zahlen hintereinander kommen nicht schlecht. Allerdings hast du nur 10 Zahlen, da könnte es sein, dass das Sortieren seinen Vorteil noch nicht richtig ausspielen kann. Wenn ich das Problem mit Papier und Bleistift angehe, dann würde ich das so machen: ich nehme die erste Zahl aus dem Array ich merke mir im Kopf (oder auf dem Papier), dass die Anzahl der vorkommen dieser Zahl gleich 1 ist. dann gehe ich der Reihe nach alle weitern Zahlen im Array durch und vergleiche jede davon mit der ersten Sind sie gleich, dann erhöhe ich meinen Anzahl Zähler Bin ich durch das Array durch, dann kenne ich somit die Anzahl der Vorkommen der ersten Zahl im Array Diesen Wert vergleiche ich mit einer zweiten Zahl, nämlich der bisher maximal vorgekommenen Anzahl und wenn die jetzige Anzahl höher ist, dann merke ich mir das als neues Maximum (und natürlich auch die Zahl dazu) Dann mach ich das ganze nochmal, mit der zweiten Zahl im Array, dann mit der dritten Zahl im Array, etc. bis ich durch bin
Steffen schrieb:
> Habe hier ein Array, welches 10 double Werte von 10 Messungen enthält.
Woher kommen denn die Werte, von einem 80Bit-AD-Wandler?
Wenns schnell sein soll, nimm einfach die Rohwerte (10Bit) als uint16_t
und rechne erst zur Anzeigeausgabe in float um.
Double werden Deine Meßwerte mit Sicherheit nicht benötigen.
Man muß ja Rechenzeit und Speicher nicht mit Gewalt verschwenden.
Peter
P.S.:
Deinen 80Bit AD-Wandler kannst Du ja für 1.000.000€ verkaufen.
@Karl heinz Buchegger Danke für deinen ausführlichen Post, habs nun so implementiert und funktioniert problemlos. Grüsse Steffen
Hallo! kann man nicht schon während des Abspeicherns im Array die Häufigkeit mitzählen? Das wäre dann ein "Abwasch".
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.