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