Hallihallo, ich habe gerade das Problem 8 Variablen zu vergleichen. Es darf kein Wert zweimal vorkommen. Muss ich wirklich jede mit jeder einzeln vergleichen oder gibts da ne einfachere Möglichkeit? MfG Sascha
Bei 8 wird wohl jede mit jeder am schnellsten gehen. sind 23 Vergleiche und das ist schwer zu unterbieten. Bei wesentlich mehr Werten würde schneller gehen: Daten sortieren Wenn es gleiche gibt, dann stehen sie dann hintereinander.
Karl heinz Buchegger schrieb: > Bei 8 wird wohl jede mit jeder am schnellsten gehen. > sind 23 Vergleiche und das ist schwer zu unterbieten. Nur damit wir uns richtig verstehen: Selbstverständlich in 2 geschachtelten Schleifen. Nicht dass du jetzt alle 23 Vergleiche händisch ausprogrammierst.
Danke für die schnelle Antwort. Das mit den Schleifen geht mir noch nicht ganz auf aber ich werd mich mal dransetzen. MfG Sascha
Sascha schrieb: > Ich komme irgendwie auf 28 Vergleiche. Sicher? Das müssten ( n * ( n - 1 ) ) / 2 sein. Jeder mit jedem (und klarerweise nicht mit sich selbt) 8 * 7 / 2 Oh Shit. Kopfrechnen. Die Hälfte von 56 ist 28 und nicht 23 Merci vielmals.
Vergleiche Wert 1 mit 2,3,4,5,6,7,8 (7 Vergleiche) 2 mit 3,4,5,6,7,8 (6 gesamt 13) 3 mit 4,5,6,7,8 (5 gesamt 18) 4 mit 5,6,7,8 (4 gesamt 22) 5 mit 6,7,8 (3 gesamt 25) 6 mit 7,8 (2 gesamt 27) 7 mit 8 (1 gesamt 28)
Sascha schrieb: > Danke für die schnelle Antwort. Das mit den Schleifen geht mir noch > nicht ganz auf aber ich werd mich mal dransetzen. > MfG > Sascha der 0-te wird mit verglichen mit 1, 2, 3, 4, 5, 6, 7 0 1, 2, 3, 4, 5, 6, 7 1 2, 3, 4, 5, 6, 7 2 3, 4, 5, 6, 7 3 4, 5, 6, 7 5 6, 7 6 7 Jeder mit jedem. Einfach alle von 0 bis zum vorletzten durchgehen und mit allen vergleichen, die einen größeren Index haben. Machst du ja auch nicht anders: Du hast 8 Karten in der Hand, du nimmst die erste und vergleichst sie mit den restlichen 7. Dann legst du die erste beiseite und nimmst die nächste. Die vergleichst du mit den verblenden 6 usw. usw. Doppelte = FALSE; for( i = 0; i < 7; ++i ) for( j = i + 1; j < 8; ++j ) { if( wert[i] == wert[j] ) { Doppelte = TRUE; } } } if( Doppelte ) { ... } Bonuspunkte gibts noch für einen vorzeitigen Ausstieg bei Erkennen eines Doppels.
Karl heinz Buchegger schrieb: > Doppelte = FALSE; > > > > for( i = 0; i < 7; ++i ) > > for( j = i + 1; j < 8; ++j ) { > > if( wert[i] == wert[j] ) { > > Doppelte = TRUE; goto raus; > > } > > } > > } > > raus: > > if( Doppelte ) { > > ... > > } Hab den Ausstieg eingefügt ;) Wo sind meine Bonuspunkte? avr
So ähnlich sehen meine Schleifen jetzt auch aus. Vielen Dank nochmal für die Ausführungen. Habs jetzt ;-) MfG Sascha Doppelte = FALSE; for( i = 0; i < 7; ++i ) for( j = i + 1; j < 8; ++j ) { if( wert[i] == wert[j] ) { Doppelte = TRUE; j=8; // Ausstieg innere Schleife i=7; // Ausstieg äußere Schleife } } } if( Doppelte ) { ... } Vieleicht nicht elegant aber durchaus funktional.
Karlheinz, diesmal bist du zu weit gegangen! Die fertige Lösung kam echt zu schnell. A bissl nachdenken hätter der OP schon noch können.
Tom schrieb: > Karlheinz, diesmal bist du zu weit gegangen! Die fertige Lösung kam echt > zu schnell. A bissl nachdenken hätter der OP schon noch können. Das hat er mit seiner Variante des vorzeitigen Ausstiegs wieder gut gemacht :-)
entity schrieb: > oder, falls es C# ist: break; Macht das break in C# nicht dasselbe wie in C(++), also die direkt umschließende Schleife verlassen? Dann würde in diesem Fall eben die darüberliegende Schleife weiter ausgeführt werden, was nicht Sinn der Sache ist. Deshalb auch das goto von "avr". MfG Mark
Sascha schrieb: > for( i = 0; i < 7; ++i ) > for( j = i + 1; j < 8; ++j ) { > if( wert[i] == wert[j] ) > { > Doppelte = TRUE; > j=8; // Ausstieg innere Schleife > i=7; // Ausstieg äußere Schleife > } > } > } Also da ist aber goto mit Sicherheit eleganter. Mark .. schrieb: > entity schrieb: >> oder, falls es C# ist: break; > > Macht das break in C# nicht dasselbe wie in C(++), also die direkt > umschließende Schleife verlassen? Ich weiß nicht, wie's bei C# ist, aber es gibt zumindest Sprachen, wo man dem break noch die Anzahl an Schachtelungsebenen, die verlassen werden sollen, angeben kann.
Stimmt, break in C# beendet nur die umschließende Schleife. Abgesehen davon finde hier ein return am schönsten.
Sascha schrieb: > Hallihallo, > ich habe gerade das Problem 8 Variablen zu vergleichen. Es darf kein > Wert zweimal vorkommen. Muss ich wirklich jede mit jeder einzeln > vergleichen oder gibts da ne einfachere Möglichkeit? Es gibt noch die Möglichkeit, zu zählen, wie oft die Werte vorkommen. Da weder was über die Typen der Werte noch über deren Wertebereich noch über die Plattform auf der das läuft, gesagt ist, kann auch nicht gesagt werden, ob das praktikabler/eleganter ist als zu vergleichen/sortieren. Da mit == verglichen wird sind's offenbar keine double/float-Werte.
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.