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
    456
    

    Die 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^^


Anmelden zum Antworten