Czy istnieje algorytm tasowania karabinu liniowego w czasie? Jest to algorytm, który niektóre szczególnie sprawne ręce są w stanie wykonać: równomierne dzielenie tablicy wejściowej o równej wielkości, a następnie przeplatanie elementów dwóch połówek.
Mathworld ma krótką stronę na temat losowania karabinów . W szczególności interesuje mnie odmiana przetasowania, która przekształca tablicę wejściową 1 2 3 4 5 6 w 1 4 2 5 3 6. Zauważ, że w ich definicji długość wejściowa wynosi .
Wykonanie tego w czasie liniowym jest proste, jeśli mamy pod ręką drugą tablicę o rozmiarze lub większym. Najpierw skopiuj ostatnie elementów do tablicy. Wtedy, zakładając, że indeksy 0 opartych skopiowanie pierwszego elementów z indeksów do . Następnie skopiuj Elementy z drugiej tablicy z powrotem do układu wejściowego, oznaczenia wskaźników do . (Możemy wykonać nieco mniej pracy niż to, ponieważ pierwszy i ostatni element na wejściu się nie poruszają.)
Jednym ze sposobów próby wykonania tego w miejscu jest rozkład permutacji na rozłączne cykle, a następnie przestawienie elementów zgodnie z każdym cyklem. Ponownie, zakładając indeksowanie oparte na 0, permutacja występująca w przypadku 6 elementów wynosi
Zgodnie z oczekiwaniami, pierwszy i ostatni element są stałymi punktami, a jeśli permutujemy środkowe 4 elementy, otrzymujemy oczekiwany wynik.
Niestety moje rozumienie matematyki permutacji (i ich ) opiera się głównie na wikipedii i nie wiem, czy można tego dokonać w czasie liniowym. Może permutacje związane z tym tasowaniem można szybko rozłożyć? Ponadto nie potrzebujemy nawet pełnego rozkładu. Wystarczyło określić tylko jeden element każdego z rozłącznych cykli, ponieważ możemy zrekonstruować cykl z jednego z jego elementów. Być może konieczne jest zupełnie inne podejście.
Dobre zasoby związane z matematyką są tak samo cenne jak algorytm. Dzięki!