¿Hay un algoritmo de tiempo aleatorio lineal en el lugar? Este es el algoritmo que algunas manos especialmente hábiles son capaces de realizar: dividir uniformemente una matriz de entrada de tamaño par y luego intercalar los elementos de las dos mitades.
Mathworld tiene una breve página sobre riffle shuffle . En particular, estoy interesado en la variedad de reproducción aleatoria que transforma la matriz de entrada 1 2 3 4 5 6 en 1 4 2 5 3 6. Tenga en cuenta que, en su definición, la longitud de entrada es .
Es sencillo realizar esto en tiempo lineal si tenemos una segunda matriz de tamaño o más útil. Primero copie los últimos elementos a la matriz. Luego, suponiendo una indexación basada en 0, copie los primeros elementos de los índices a . Luego copie los elementos de la segunda matriz de nuevo a la matriz de entrada, asignando índices [0,1,2, ..., n-1] a [1,3,5, ..., 2n-1] . (Podemos hacer un poco menos de trabajo que eso, porque el primer y el último elemento de la entrada no se mueven).
Una forma de intentar hacer esto en el lugar implica la descomposición de la permutación en ciclos disjuntos, y luego reorganizar los elementos de acuerdo con cada ciclo. Nuevamente, suponiendo una indexación basada en 0, la permutación involucrada en el caso de 6 elementos es
Como se esperaba, el primer y el último elemento son puntos fijos, y si permutamos los 4 elementos del medio, obtenemos el resultado esperado.
Desafortunadamente, mi comprensión de las matemáticas de las permutaciones (y su ) se basa principalmente en wikipedia, y no sé si esto se puede hacer en tiempo lineal. ¿Quizás las permutaciones involucradas en esta mezcla pueden descomponerse rápidamente? Además, ni siquiera necesitamos la descomposición completa. Bastará con determinar un solo elemento de cada uno de los ciclos disjuntos, ya que podemos reconstruir el ciclo a partir de uno de sus elementos. Tal vez se requiere un enfoque completamente diferente.
Los buenos recursos en las matemáticas relacionadas son tan valiosos como un algoritmo. ¡Gracias!