Häufigkeitsverteilung von int Werten

Gast #4549007
Moin

Leider finde ich keinen direkten Befehl für Arduino / ESP,
der mir die beiden am häufigsten vorkommenden Werte aus einem Array 
wiedergibt.

Das Array hast 2 x 1000 Zeilen und die Werte gehen von 0-1024.
Was ja jetzt nich so viel ist.

Hat da jemand ne Idee oder Erfahrung?
Gast
1
uint16_t array [1024];
2
uint16_t h [1025] = {};
3

4
for (size_t i = 0; i < 1024; ++i) {
5
  ++h [array [i]];
6
}
7

8
uint16_t max1 = 0;
9
uint16_t max2 = 0;
10

11
for (size_t i = 1; i < 1025; ++i) {
12
  if (h[i] > h[max1]) {
13
    max2 = max1;
14
    max1 = i;
15
  } else if (h[i] > h[max2]) {
16
    max2 = i;
17
  }
18
}
19

20
printf ("Die beiden größten Werte sind %" PRIu16 " und %" PRIu16 "\n", max1, max2);
Gast
Hallo Dr.Sommer

So ganz kann ich deinen Code noch nicht nachvollziehen.

Gehe ich denn recht in der Annahme, das er mir die beiden größten Werte
und nicht die beiden häufigsten Werte ausgibt?
Gast
Kolja schrieb:
> Gehe ich denn recht in der Annahme, das er mir die beiden größten Werte
> und nicht die beiden häufigsten Werte ausgibt?

Er speichert die Häufigkeit der Werte im Array h und gibt dann davon die 
Position der zwei größten Werte aus, und damit die beiden häufigsten 
Werte im Original-Array. Hab mich auch vertan, 1024 sollte natürlich 
2000 sein. Der Text in der Ausgabe ist natürlich Quatsch, es sollte 
heißen "die beiden häufigsten Werte"...
Gast
Du brauchst leider entweder Platz (Histogramm) oder Zeit (sortieren; 
ohne Kopie natürlich nur, wenn die ursprüngliche Ordnung irrelevant 
ist).
Es gibt einen schönen, einfachen Algorithmus von Bob Boyer (A Linear 
Time Majority Vote Algorithm), aber der funktioniert hier auch in einer 
modifizierten Form nicht, da das jeweilige Element mindestens n/2 mal 
vorkommen muss.

Kolja schrieb:
> Aber kann man den Platz auch wieder freigeben?
> Z.B. um an einer anderen Stelle ein anderes array zu initialisieren?

Ich kenne mich mit der Arduino-Umgebung nicht aus, aber vielleicht hilft 
das hier weiter:

http://arduino.land/FAQ/content/4/26/en/how-to-use-dynamic-memory.html
Gast
Array sortieren, dann linear durchgehen und die Anzahl jeweils gleicher 
Elemente zählen und die beiden Elemente, die am häufigsten vorkommen 
sowohl von ihrem Wert als ihrer Häufigkeit merken.

Oder so wie Dr Sommer das macht.
Gast
> Leider finde ich keinen direkten Befehl für Arduino / ESP, der mir die beiden am 
häufigsten vorkommenden Werte aus einem Array wiedergibt.


Danke fuer einen tollen Vorschlag fuer die naechste Version von 
"muss-haben" Library, die dann als 25GB Package daherkommt.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.