Generieren aller Permutationen von Zeichenkombinationen, wenn Anzahl der Arrays und Länge jedes Arrays unbekannt sind

8

Ich bin mir nicht sicher, wie ich meine Frage in knapper Form stellen soll, also werde ich mit Beispielen beginnen und von dort aus expandieren. Ich arbeite mit VBA, aber ich denke, dass dieses Problem nicht sprachspezifisch ist und nur einen hellen Verstand erfordern würde, der ein Pseudo-Code-Framework bereitstellen kann. Vielen Dank im Voraus für die Hilfe!

Beispiel: Ich habe 3 Character Arrays wie So:

%Vor%

Ich möchte ALLE möglichen Permutationen der Zeichenarrays wie folgt erzeugen:

%Vor%

Dies kann einfach mit 3 while-Schleifen oder for-Schleifen gelöst werden. Meine Frage ist, wie löse ich dafür, wenn die Anzahl der Arrays unbekannt ist und die Länge jedes Arrays unbekannt ist?

Also ein Beispiel mit 4-Zeichen-Arrays:

%Vor%

Ich müsste generieren:

%Vor%

Das verallgemeinerte Beispiel wäre also:

%Vor%

Gibt es eine Möglichkeit, eine Funktion zu strukturieren, die eine unbekannte Anzahl von Schleifen erzeugt und die Länge jedes Arrays durchläuft, um die Permutationen zu erzeugen? Oder vielleicht gibt es eine bessere Möglichkeit, über das Problem nachzudenken?

Danke allen!

    
Jay 14.05.2010, 17:08
quelle

5 Antworten

7

Rekursive Lösung

Dies ist die einfachste und einfachste Lösung. Das Folgende ist in Java, aber es sollte aufschlussreich sein:

%Vor%

( vollständige Ausgabe )

Hinweis: Java-Arrays sind 0-basiert, daher geht k von 0..arrs.length-1 während der Rekursion bis k == arrs.length , wenn es das Ende der Rekursion ist.

Nicht-rekursive Lösung

Es ist auch möglich, eine nicht-rekursive Lösung zu schreiben, aber das ist ehrlich gesagt weniger intuitiv. Dies ist tatsächlich sehr ähnlich zur Basenumwandlung, z.B. von dezimal zu hexadezimal; Es ist eine verallgemeinerte Form, bei der jede Position ihre eigenen Werte hat.

%Vor%

( sehen Sie die vollständige Ausgabe )

Dies erzeugt die Tuplets in einer anderen Reihenfolge. Wenn Sie sie in der gleichen Reihenfolge wie die rekursive Lösung generieren möchten, durchlaufen Sie arrs "backward" während decode wie folgt:

%Vor%

( vollständige Ausgabe )

    
polygenelubricants 15.05.2010 04:33
quelle
4

Dank @polygeneLubricants für die ausgezeichnete Lösung. Hier ist das Javascript-Äquivalent:

%Vor%     
Srini 19.09.2013 14:44
quelle
1

BEARBEITEN : Hier ist eine Rubin-Lösung. Es ist ungefähr dasselbe wie meine andere Lösung, aber angenommen, Ihre Eingabe-Zeichen-Arrays sind Wörter: Sie können also Folgendes eingeben:

%Vor%

~ / bin / perm.rb

%Vor%

OLD - Ich habe ein Skript, um dies in MEL zu machen (Maya's Embedded Language) - Ich werde versuchen, etwas in C zu übersetzen, aber erwarte nicht, dass es ohne etwas läuft der Fixierung;) Es funktioniert jedoch in Maya.

Zuerst - werfen Sie alle Arrays in einem langen Array mit Trennzeichen zusammen. (Ich überlasse das Ihnen - weil es in meinem System die Werte aus einer Benutzeroberfläche herausreißt). Das bedeutet, dass die Begrenzer zusätzliche Slots belegen: Um Ihre Beispieldaten oben zu verwenden:

%Vor%

Natürlich können Sie so viele Arrays verketten, wie Sie möchten.

%Vor%     
Julian Mann 15.05.2010 04:15
quelle
0

Wenn ich die Frage richtig verstehe, denke ich, dass Sie alle Ihre Arrays in ein anderes Array einfügen könnten, wodurch ein gezacktes Array entsteht.

Durchlaufen Sie dann alle Arrays in Ihrem gezackten Array und erstellen Sie alle benötigten Permutationen.

Macht das Sinn?

    
CubanX 14.05.2010 17:17
quelle
0

es klingt, als hättest du es schon fast herausgefunden.

Was ist, wenn Sie ein weiteres Array hineinstellen, nennen Sie es, sagen wir ArrayHolder , das alle Ihre unbekannte Anzahl von Arrays unbekannter Länge enthält. Dann brauchst du nur noch eine Schleife, nein?

    
rlb.usa 14.05.2010 17:17
quelle