Gibt es einen linearen Time-In-Place-Riffle-Shuffle-Algorithmus? Dies ist der Algorithmus, den einige besonders geschickte Hände ausführen können: Ein Eingangsarray mit gerader Größe wird gleichmäßig aufgeteilt und die Elemente der beiden Hälften werden verschachtelt.
Mathworld hat eine kurze Seite über Riffle Shuffle . Insbesondere interessiert mich die Out-Shuffle-Variante, mit der das Eingangsarray 1 2 3 4 5 6 in 1 4 2 5 3 6 umgewandelt wird. Beachten Sie, dass die Eingangslänge in ihrer Definition beträgt .
Es ist unkompliziert, dies in linearer Zeit durchzuführen, wenn wir ein zweites Array mit der Größe oder mehr zur Hand haben. Kopieren Sie zuerst die letzten Elemente in das Array. Dann, unter der Annahme , 0 basierte Indizierung, kopiert die ersten Elemente aus Indizes auf . Dann kopieren Sie die Elemente aus der zweiten Anordnung zurück zu der Eingangsanordnung, Abbilden Indizes auf . (Wir können etwas weniger arbeiten, da das erste und das letzte Element in der Eingabe nicht verschoben werden.)
Eine Möglichkeit, dies an Ort und Stelle zu versuchen, besteht darin, die Permutation in disjunkte Zyklen zu zerlegen und die Elemente dann nach jedem Zyklus neu anzuordnen. Unter der Annahme einer 0-basierten Indizierung ist die Permutation im 6-Element-Fall wieder
Wie erwartet sind das erste und das letzte Element feste Punkte, und wenn wir die mittleren 4 Elemente permutieren, erhalten wir das erwartete Ergebnis.
Leider ist mein Verständnis der Mathematik der Permutationen (und deren ) basiert hauptsächlich auf Wikipedia, und ich weiß nicht, ob dies in linearer Zeit möglich ist. Vielleicht können die mit diesem Mischen verbundenen Permutationen schnell aufgelöst werden? Außerdem brauchen wir nicht einmal die vollständige Zerlegung. Nur ein einzelnes Element aus jedem der disjunkten Zyklen zu bestimmen, würde ausreichen, da wir den Zyklus aus einem seiner Elemente rekonstruieren können. Möglicherweise ist ein völlig anderer Ansatz erforderlich.
Gute Ressourcen zur verwandten Mathematik sind ebenso wertvoll wie ein Algorithmus. Vielen Dank!