Frage zu Kombinatorik-Algorithmmus
-
Hallo, gibt es einen effizienten Algorithmus, alle Kombinationen für folgendes Problem darzustellen?
Es werden 3 Zahlen aus x Zahlen gezogen. Ich will jetzt alle möglichkeiten für 3er-Gruppen anzeigen lassen, wobei die Reihenfolge der Zahlen in den 3er-Gruppen egal ist.
Insgesamt sollte es also (x über 6) 3er-er Gruppen geben.Beispiel:
Input: 3 aus 6 Zahlenpool: 1 2 3 4 5 6 6 über 3 = 20 Output: 123 124 134 234 125 135 235 145 245 345 126 136 236 146 246 346 156 256 356 456Die einzige Möglichkeit, die mir gerade einfällt, ist, einfach alle 3er Kombinationen zu Bruteforcen und dann die doppelten auszusortieren (hab ich bei dem Beispiel oben auch gemacht). Allerdings bekommt man dann natürlich eine Unmenge 3er-Gruppen (nämlich y! bzw oben 6!).
Gibt es einen Ansatz, um diese Gruppen systematisch zu finden?
-
Sowas in etwa?
for( int first = 6; first > 0; --first ) { for( int second = first; second > 0; --second ) { for( int third = second; third > 0; --third ) { std::cout << first << second << third; } } }
-
Genau da hab ich gesucht! Vielen vielen Dank!
-
Rekursiv ist das ziemlich einfach. Die Grundidee: Wenn man alle k-Teilmengen ausgeben will, geht man das Array von links nach rechts durch und hängt jeweils das aktuelle Element vor alle k-1-Teilmengen, die sich aus dem Rest-Array rechts von der aktuellen Position ergeben.
Dann klappt es auch für beliebige k. Decimads Algorithmus ist ja auf k=3 festgelegt.
-
Der ist ja auch zusätzlich auf ein lückenloses Zahlen-Alphabet festgelegt. Aber wenn man das so erstmal eingesehen hat, dann kommt doch der Glücksmoment, dass man sieht, was man daran wie generalisieren könnte^^