Aquí está la respuesta que desarrolla el algoritmo del documento vinculado por Joe: http://arxiv.org/abs/0805.1598
Primero consideremos un algoritmo Θ ( n logn ) que usa divide y vencerás.
1) Divide y vencerás
Se nos da
una1, una2, ... , b1, b2, ... bnorte
Ahora, para usar divide y vencerás, para algunos m = Θ ( n ) , intentamos obtener la matriz
[ a1, una2, ... , unmetro, b1, b2, ... , bmetro] , [ am + 1, ... , unnorte, bm + 1, ... bnorte]
y recurse.
Observe que la porción si1, b2, ... bmetro, unam + 1, ... anorte
es un desplazamiento cíclico de
unam + 1, ... anorte, b1, ... bmetro
por metro lugares.
Este es un clásico y se puede hacer en el lugar mediante tres reversiones y en el tiempo O (n) .
Por lo tanto, divide y vencerás te da un algoritmo Θ ( n logn ) , con una recursión similar a T( n ) = 2 T( n / 2 ) + Θ ( n ) .
2) Ciclos de permutación
Ahora, otro enfoque del problema es considerar la permutación como un conjunto de ciclos disjuntos.
La permutación viene dada por (suponiendo que comienza en 1 )
j ↦ 2 jmod2 n + 1
Si de alguna manera supiéramos exactamente cuáles son los ciclos, usando un espacio adicional constante, podríamos realizar la permutación seleccionando un elemento , determinar a dónde va ese elemento (usando la fórmula anterior), colocar el elemento en la ubicación objetivo en un espacio temporal, colocar el elemento en esa ubicación objetivo y continuar a lo largo del ciclo. Una vez que hemos terminado con un ciclo, pasamos a un elemento del siguiente ciclo y seguimos ese ciclo y así sucesivamente.UNAUNA
Esto nos daría un algoritmo de tiempo , pero supone que "de alguna manera sabíamos cuáles eran los ciclos exactos" e intentamos hacer esta contabilidad dentro de la limitación de espacio es lo que dificulta este problema.O (n)O (1)
Aquí es donde el artículo usa la teoría de números.
Se puede demostrar que, en el caso de que , los elementos en las posiciones , están en ciclos diferentes y cada ciclo contiene un elemento en la posición .2 n + 1 = 3k13 , 32, ... , 3k - 13metro, m ≥ 0
Esto utiliza el hecho de que es un generador de .2( Z / 3k)∗
Por lo tanto, cuando , el enfoque de seguir el ciclo nos da un algoritmo de tiempo , ya que para cada ciclo, sabemos exactamente dónde comenzar: potencias de (incluido ) (esos se puede calcular en espacio).2 n + 1 = 3kO (n)31O (1)
3) Algoritmo final
Ahora combinamos los dos anteriores: Divide y vencerás + ciclos de permutación.
Hacemos un divide y vencerás, pero escogen de manera que es una potencia de y .metro2 m + 13m = Θ ( n )
Entonces, en lugar de recurrir en ambas "mitades", recurrimos en una sola y hacemos trabajo extra.Θ ( n )
Esto nos da la recurrencia (para algunos ) y nos da un tiempo , algoritmo espacial!T( n ) = T( c n ) + Θ ( n )0 < c < 1O (n)O (1)