Berechne alle Permutationen einer Zeichenkette in Swift

8

Für die Zeichenfolge "ABC" berechnet das folgende Code-Snippet 5 der insgesamt 6 Permutationen. Meine Strategie bestand darin, jedes Zeichen in jeden möglichen Index des Indexes einzufügen. Aber die Funktion bekommt niemals "CBA" als mögliche Permutation. Was vermisse ich?

%Vor%     
kiaraRobles 23.01.2016, 20:27
quelle

4 Antworten

14

Obwohl Stefan und Matt einen guten Punkt bei der Verwendung des Heap-Algorithmus machen, denke ich, dass Sie eine wichtige Frage haben, warum Ihr -Code nicht funktioniert und wie Sie das debuggen würden.

In diesem Fall ist der Algorithmus einfach falsch und der beste Weg, dies zu entdecken, ist mit Bleistift und Papier IMO. Sie picken jedes Element, entfernen es aus dem Array und injizieren es an jeder möglichen Stelle. Ihr Code tut, was Sie von ihm verlangt haben. Aber es ist nicht möglich, auf diese Weise zu "CBA" zu gelangen. Sie verschieben jeweils nur ein Element, aber "CBA" hat zwei Elemente außerhalb der Reihenfolge. Wenn Sie zu ABCD erweitert würden, würden Sie viele weitere fehlende Permutationen finden (es werden nur 10 der 24 generiert).

Obwohl der Algorithmus von Heap sehr effizient ist, ist der tiefere Punkt, dass er das gesamte Array durchläuft und jedes mögliche Paar tauscht, anstatt nur ein einzelnes Element durch das Array zu bewegen. Jeder Algorithmus, den Sie auswählen, muss diese Eigenschaft haben.

Und um meinen Hut in den Ring zu werfen, würde ich Matts Implementierung auf diese Weise erweitern:

%Vor%     
Rob Napier 23.01.2016 22:00
quelle
7

Hier ist ein Ausdruck von Heaps (Sedgewicks?) Algorithmus in Swift. Es ist effizient, weil das Array als Verweis übergeben wird und nicht als Wert übergeben wird (obwohl das natürlich bedeutet, dass Sie darauf vorbereitet sein müssen, das Array manipulieren zu lassen). Der Austausch wird effizient durch die Verwendung der integrierten Funktion swapAt(_:_:) ausgedrückt:

%Vor%

Versuchen wir es:

%Vor%

Ausgabe:

%Vor%

Wenn Sie mit jeder Permutation nicht nur drucken wollten, ersetzen Sie print(a) durch etwas anderes. Zum Beispiel könnten Sie jede Permutation an ein Array anhängen, das Array von Zeichen zu einer Zeichenfolge kombinieren, was auch immer.

    
matt 23.01.2016 21:41
quelle
1
%Vor%

Erfinde das Rad nicht neu. Hier ist ein einfacher Port des Heap-Algorithmus .

    
Stefan Kendall 23.01.2016 21:01
quelle
1

Hier ist meine Lösung.

%Vor%

Sie können es in eine Datei kopieren und einfügen und mit der Befehlszeile swift binary ausführen.

Für eine Permutation von 7 aller eindeutigen Zeichen benötigt dieser Algorithmus etwa 0,06 Sekunden zur Ausführung.

    
Steven 16.07.2017 06:44
quelle

Tags und Links