Aqui está a resposta que elabora o algoritmo do artigo vinculado por Joe: http://arxiv.org/abs/0805.1598
Primeiro, vamos considerar um algoritmo Θ(nlogn) que usa dividir e conquistar.
1) Dividir e conquistar
Nos é dado
a1,a2,…,b1,b2,…bn
Agora, para usar dividir e conquistar, por alguns m = Θ ( n ) , tentamos obter a matriz
[ a1 1, um2, … , Umm, b1 1, b2, … , Bm] , [ am + 1, … , Umn, bm + 1, … Bn]
e recursar.
Observe que a porção b1 1, b2, … Bm, umm + 1, ... umn
é um deslocamento cíclico de
umam + 1, ... umn, b1 1, … Bm
por m lugares.
Este é um clássico e pode ser feito no local por três reversões e em O(n) tempo.
Assim, a divisão e conquista fornece um algoritmo Θ(nlogn) , com uma recursão semelhante a T(n)=2T(n/2)+Θ(n) .
2) Ciclos de Permutação
Agora, outra abordagem para o problema é considerar a permutação como um conjunto de ciclos disjuntos.
A permutação é dada por (assumindo que começa em 1 )
j↦2jmod2n+1
Se de alguma forma soubéssemos exatamente quais eram os ciclos, usando espaço extra constante, poderíamos realizar a permutação escolhendo um elemento , determinar para onde esse elemento vai (usando a fórmula acima), colocar o elemento no local de destino no espaço temporário, colocar o elemento para esse local de destino e continue ao longo do ciclo. Quando terminamos o ciclo, passamos para um elemento do próximo ciclo e seguimos esse ciclo e assim por diante.AA
Isso nos daria um algoritmo de tempo , mas assume que "de alguma forma sabíamos quais eram os ciclos exatos" e tentamos fazer essa contabilidade dentro da limitação de espaço é o que dificulta esse problema.O(n)O(1)
É aqui que o artigo usa a teoria dos números.
Pode-se mostrar que, no caso em que , os elementos nas posições , estão em ciclos diferentes e cada ciclo contém um elemento na posição .2n+1=3k13,32,…,3k−13m,m≥0
Isso usa o fato de que é um gerador de .2(Z/3k)∗
Assim, quando , a abordagem de seguir o ciclo nos fornece um algoritmo de tempo , pois para cada ciclo, sabemos exatamente por onde começar: potências de (incluindo ) (aquelas pode ser calculado no espaço ).2n+1=3kO(n)31O(1)
3) Algoritmo final
Agora, combinamos os dois acima: Dividir e Conquistar + Ciclos de Permutação.
Dividimos e conquistamos, mas escolhemos para que seja uma potência de e .m2m+13m=Θ(n)
Portanto, ao repetir as duas "metades", repetimos apenas uma e fazemos trabalho extra.Θ(n)
Isso nos dá a recorrência (por alguns ) e, portanto, fornece um tempo , algoritmo espacial!T(n)=T(cn)+Θ(n)0<c<1O(n)O(1)