Forum: Mikrocontroller und Digitale Elektronik Häufigkeitsverteilung von int Werten


von Kolja (Gast)


Lesenswert?

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?

von Dr. Sommer (Gast)


Lesenswert?

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);

von edgar S. (hbl333)


Lesenswert?

Spieglein Spieglein an der Wand
Wer ist der häufigste im Land

von Kolja (Gast)


Lesenswert?

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?

von Dr. Sommer (Gast)


Lesenswert?

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"...

von Peter D. (peda)


Lesenswert?

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

Sicher?
Wieviel RAM hat der denn?

von Falk B. (falk)


Lesenswert?

Es gibt auch "große" Arduinos mit ARM-Prozessor, z.B. den Due mit 96kB 
RAM.

http://www.arduino.cc/en/Main/ArduinoBoardDue

von Kolja (Gast)


Lesenswert?

Ist n ESP8266-12e
Ich glaube bis array[3][3000] hat es funktioniert.

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

von Flauschig-weicher Qualitätsgarant (Gast)


Lesenswert?

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

von Der Andere (Gast)


Lesenswert?

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.

von blechiger Dampftroll (Gast)


Lesenswert?

> 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.

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
Noch kein Account? Hier anmelden.