effizienter C-Code zum Vergleichen von 6 Werten

Gast #880348
Lesenswert?

Das ganze sollte halt möglichst schnell abgearbeitet werden. (ca. 10us 
bei einem Takt von 16Mhz im ATMega168)

Ich komme grade auf keinen sauberen Code, nur auf etliche if-Abfragen 
und Vergleichsoperationen.
#880379
Lesenswert?

Bei sowenig Werten ist nur der Vergleich von jedem Wert mit jedem 
anderen Wert effizient (wobei du doppelte Vergleiche natürlich 
ausschließen kannst, und die Sache ist transitiv).

Du kannst auch einen Merge- oder Quicksort inplace implementieren, 
brauchst dann halt ein Array mit 6 Einträgen. Bucketsort lohnt bei 6 
Werten nicht.
Gast #880444
Lesenswert?

Jochen Müller schrieb:

> <pseudocode>
> zielwert=wert[1]
> for a=2 to 6 if wert[a]>zielwert dann zielwert=wert[a] und break
> </pseudocode>

Der break ist zuviel, sonst stimmts.

Wenn es noch etwas schneller gehen soll, oder wenn die sechs Zahlen
nicht in einem Array vorliegen, kann man die Schleife natürlich auch
auseinanderrollen, so dass 5 If-Anweisungen dastehen. Das dürfte dann
etwa 16 Zyklen, also 1 µs dauern.
Gast #880618
Lesenswert?

Geht für Arrays der Länge 2(!)-255

byte i=sizeof(array)/sizeof(array[0])-1; //Länge des Arrays -1
max=array[0];

do {
if (max<array[i] max=array[i];
} while (--i); //dekrement und anschließendes prüfen auf 0
               //erzeugt am wenigsten "overhead"

//in max steht das maximum
#880858
Lesenswert?

@Andreas Schwarz

Jeden mit jedem unter Ausnutzung von Transitivität und Umkehrbarkeit ;)

Transitiv: a>b, b>c => a>c


Aber du hast natürlich recht, ich bin irgendwie von Sortieren 
ausgegangen, nicht von Maximum. War wohl etwas spät... In dem Fall 
reichen aber 5 Vergleiche:

max=a;
if(a<b) max=b;
.
.
.

... und eine Zuweisung ;)
Gast #881099
Lesenswert?

Ok,
so sollte es recht zügig funktionieren:

void CompIndukt(void)
{

  extern uint16_t werte[];
  extern uint8_t max;
  uint8_t index=0;
  uint16_t store=werte[0];

  for (index=0;index<6;index++)
  {

         if(werte[index]>store)
    {
    store=werte[index];
    max=index;
    }
  }

}

max gibt dann die Position der Größten Zahl im Aray an.
Gast #881106
Lesenswert?

Wie wäre es damit:
1
byte i=5;
2
byte max=5;
3

4
do {
5
   if (werte[max] < werte[i-1]) {
6
      max = i-1;
7
   }
8
} while (--i);

Nach Durchlauf steht max auf den Index des Array-Elements mit dem 
größten Wert.

Gruß
Christoph

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren