Schleife soll Permutationen n-ter Ordnung liefern
-
Hallo zusammen,
ich habe gerade ein Problem, bei dem ich gedanklich nicht weiter komme. Es geht darum eine gewisse iterative Schleife zu haben (mir fällt kein besserer Begriff ein). Im wesentlichen ist es so, ich habe ein Array:
type array[] = {e, e2, e3, .... en};
nun möchte ich eine Schleife schreiben, die mir alle "Permutation n-ter Ordnung" liefert (mir fällt keine bessere Beschreibung ein). D.h. die Schleife soll zuerst, alle Element einzeln bearbeiten, also e, e2, e3, e4, ... , en (1-te Ordnung). Dann die zweiter Ordnung: e1e1, e1e2, e1e3, ..., e1en, e2e1, e2e2, ..., enen und so weiter bis zur n-ten Ordnung. Ich schaffe es nicht meinen Algorithmus auf die n-te Ordnung auszudehnen. Über Hilfe würde ich mich sehr freuen,
Mit freundlichen Grüßen, Matthias
-
- Wie machst du es denn wenn du es aufschreibst?
- Nimm dir mal {e1, e2, e3} und mach daraus deine "Permutationen 2ter Ordnung" und die "Permutationen 3ter Ordnung" und versuch Gemeinsamkeiten und Unterschiede zu finden.
-
So, ich habe beides gemacht und bin nun auf folgenden Code gekommen:
type elements[] = {...}; const uint arraylength = array.length(); const uint max_order = 6; uint count[max_order] = {0, 0, 0, 0, 0, 0}; type suffix; //Start algo for(uint order = 0; order < max_order; order++) { //n-permutation while(count[0] < arraylength ) { suffix.clear(); //create suffixes for(uint l = order; l > 0; l--) { suffix.append(elements[count[l]]); } //last element for(uint i = 0; i < arraylength ; i++) { doStuff(suffix + elements[i]); } if(order != 0) { count[order-1]++; for(uint l = max_order; l > 1; l--) { if(count[l-1] == arraylength) { count[l-1] = 0; count[l-2]++; } } } else break; } }
ist das so richtig? Weil wenn ich mit doStuff die Werte ausgebe erhalte ich bloß Unsinn. Zum Prinzip: mit count speichere ich ab welche Elemente als Suffix verwendet werden sollen, und wenn count[0] denn "gültigen" Bereich verlässt, weiß ich dass ich fertig bin.
-
Huch, noch keine Antwort hier? Das Problem hat sich jedenfalls erledigt, trotzdem danke für die Hilfe.