Esiste un algoritmo di riffle shuffle sul posto lineare nel tempo? Questo è l'algoritmo che alcune mani particolarmente abili sono in grado di eseguire: dividere uniformemente un array di input di dimensioni pari e quindi intercalare gli elementi delle due metà.
Mathworld ha una breve pagina sulla riproduzione casuale dei riffle . In particolare, sono interessato alla varietà out-shuffle che trasforma l'array di input 1 2 3 4 5 6 in 1 4 2 5 3 6. Si noti che nella loro definizione, la lunghezza di input è .
È semplice eseguirlo in tempo lineare se abbiamo un secondo array di dimensioni o più utili. Prima copia gli ultimi elementi nell'array. Quindi, assumendo l'indicizzazione basata su 0, copiare i primi elementi dagli indici su . Quindi copiare gli elementi dal secondo array di nuovo nell'array di input, mappando gli indici su . (Possiamo fare un po 'meno lavoro di quello, perché il primo e l'ultimo elemento nell'input non si muovono.)
Un modo per tentare di eseguire questa operazione sul posto consiste nella decomposizione della permutazione in cicli disgiunti e quindi nel riordinare gli elementi in base a ciascun ciclo. Ancora una volta, supponendo l'indicizzazione basata su 0, la permutazione implicata nel caso dei 6 elementi è
Come previsto, il primo e l'ultimo elemento sono punti fissi e se permutiamo i 4 elementi centrali otteniamo il risultato atteso.
Sfortunatamente, la mia comprensione della matematica delle permutazioni (e del loro ) si basa principalmente su Wikipedia, e non so se questo possa essere fatto in tempo lineare. Forse le permutazioni coinvolte in questo mescolamento possono essere rapidamente decomposte? Inoltre, non abbiamo nemmeno bisogno della decomposizione completa. È sufficiente determinare un singolo elemento di ciascuno dei cicli disgiunti, dal momento che possiamo ricostruire il ciclo da uno dei suoi elementi. Forse è necessario un approccio completamente diverso.
Buone risorse sulla matematica correlata sono preziose quanto un algoritmo. Grazie!