mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Meist vorkommende Zahl in Double Array ermitteln


Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: LordZiu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Dennis U. (atmegadennis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Karl heinz Buchegger

Danke für deinen ausführlichen Post, habs nun so implementiert und 
funktioniert problemlos.

Grüsse Steffen

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kleiner Tip: Festkommaarithmetik

Autor: Route_66 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!
kann man nicht schon während des Abspeicherns im Array die Häufigkeit 
mitzählen? Das wäre dann ein "Abwasch".

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.