Permutationen berechnen
-
Hallo,
Ich wollt mal erfragen wie ich alle möglichen Permutationen bei einer vorgegebenen Symbol-Menge + Anzahl an Stellen am besten erzeuge?
Also ich habe als Symbole: 0 -7 (0,1,2,3,4,5,6,7)
Und will damit 6 stellen zu belegen.Wie generiere ich mir daraus eine Liste (array) die alle Kombinationen beinhaltet (000000 …. 123456 …. 654321 ….. 777777)
Gibt es da einen Trick ohne 7 Schleifen?
Weil ich mir das grad versucht habe zusammen zu bauen und daran auch scheitereLg,
Hans
-
Für diesen speziellen Fall gäbe es die ganz einfache Methode:
#include <stdio.h> int main(void) { int i; /* Alles im Oktalsystem */ for(i = 0; i < 01000000; ++i) { printf("%06o\n", i); } return 0; }
...und wenn du ein bisschen über diese Lösung meditierst, kriegst du das bestimmt auch für beliebige Zahlensysteme und beliebig lange Folgen hin.
-
Die Frage ist irreführend. Permutation heißt eine Umordnung einer Folge, damit bijektiv, was man von 777777 nicht unbedingt sagen kann.
Hast du dich mit dem Begriff Permutationen vertan und meintest eigentlich die Wörter über dem gegebenen Alphabet mit entsprechender Länge oder ist dein Beispiel falsch (das nicht nur Permutationen zeigt)?
-
hans234 schrieb:
Gibt es da einen Trick ohne 7 Schleifen?
Ja, du kannst es mit Rekursion probieren. Da hast du dann keine 7 Schleifen.
-
Du kannst es auch mit nur einer Schleife machen, wie dir seldon schon gezeigt hat.
-
JFB schrieb:
Die Frage ist irreführend. Permutation heißt eine Umordnung einer Folge, damit bijektiv, was man von 777777 nicht unbedingt sagen kann.
Hast du dich mit dem Begriff Permutationen vertan und meintest eigentlich die Wörter über dem gegebenen Alphabet mit entsprechender Länge oder ist dein Beispiel falsch (das nicht nur Permutationen zeigt)?Womöglich wäre Variationen richtiger?
Ich vertu mich da immer.Wutz schrieb:
hans234 schrieb:
Gibt es da einen Trick ohne 7 Schleifen?
Ja, du kannst es mit Rekursion probieren. Da hast du dann keine 7 Schleifen.
Das stell ich mir im Moment noch komplizierter als die 7 Schleifen vor. Wobei vl muss ich mir das noch überlegen.
SeppJ schrieb:
Du kannst es auch mit nur einer Schleife machen, wie dir seldon schon gezeigt hat.
Echt, könntest du mir sagen wie das geht?
seldon schrieb:
Für diesen speziellen Fall gäbe es die ganz einfache Methode:
#include <stdio.h> int main(void) { int i; /* Alles im Oktalsystem */ for(i = 0; i < 01000000; ++i) { printf("%06o\n", i); } return 0; }
...und wenn du ein bisschen über diese Lösung meditierst, kriegst du das bestimmt auch für beliebige Zahlensysteme und beliebig lange Folgen hin.
Stimmt, habe mir jetzt mit deinem Tipp was für meinen konkreten Fall gebastelt.
Aber eigentlich klappt das nur für den Fall, dass es in eine Variable gepackt wird, und tatsächlich Zahlen sind (und nicht Wörter/Buchstaben(wobei das ginge ja wieder)).
Wobei in der Symbolmenge aus Zahlen keine Lücken sein dürften.Wie könnte es aussehen wenn es Wörter wären (Aal, Bär, Car) und nachher in einem (2Dim) Array stehen sollen?
Also
Array[1] = {Aal, Aal, Aal};
Array[2] = {Aal, Aal, Car};
Array[3] = {Aal, Aal, Bär};
Array[4] = {Aal, Bär, Aal};
Array[5] = {Aal, Car, Aal};
Array[6] = {Bär, Aal, Aal};
Array[7] = {Car, Aal, Aal};
Array[8] = {Car, Bär, Aal};
Array[9] = {Bär, Car, Aal};
...Ne einfache Idee?
Was mir grad durch den Kopf spukt:
Mit ähnlichem Verfahren wie oben einmal die Zahlen Generieren.
Jedem Symbol (Wort) Einen Wert Zuweisen und dann wird per Digit auswerten für welches Wort/Symbol die Zahl steht und das Array aufbauen.
Dabei wäre zu berücksichtigen dass der Array eintrag nur komplett erstellt werden kann wenn für alle Digits der Zahl ein Zugewiesenes Wort existiert.
Also
Aal = 1
Bär = 2
Car = 3Zahl 1 der schleife ist: 111 --> Aal, Aal, Aal
Zahl 2 der schleife ist: 112 --> Aal, Aal, BärMan müsste hald auch schauen das führende nullen dabei sind und man das Zerlegen kann ...