Ecco la risposta che elabora l'algoritmo dall'articolo collegato da Joe: http://arxiv.org/abs/0805.1598
Per prima cosa consideriamo un algoritmo che usa divide e conquistare.Θ(nlogn)
1) Dividi e conquista
Ci viene dato
a1,a2,…,b1,b2,…bn
Ora per usare divide e conquistare, per alcuni , proviamo a ottenere l'arraym=Θ(n)
[a1,a2,…,am,b1,b2,…,bm],[am+1,…,an,bm+1,…bn]
e ricorrere.
Si noti che la porzione è uno spostamento ciclico dib1,b2,…bm,am+1,…an
am+1,…an,b1,…bm
di posti.m
Questo è un classico e può essere eseguito sul posto con tre inversioni e in tempo .O(n)
Quindi la divisione e la conquista ti danno un algoritmo , con una ricorsione simile a .Θ(nlogn)T(n)=2T(n/2)+Θ(n)
2) Cicli di permutazione
Ora, un altro approccio al problema è considerare la permutazione come un insieme di cicli disgiunti.
La permutazione è data da (assumendo a partire da )1
j↦2jmod2n+1
Se in qualche modo sapessimo esattamente quali fossero i cicli, usando uno spazio aggiuntivo costante, potremmo realizzare la permutazione selezionando un elemento , determinare dove va quell'elemento (usando la formula sopra), mettere l'elemento nella posizione target in uno spazio temporaneo, mettere l'elemento in quella posizione target e continuare lungo il ciclo. Una volta che abbiamo finito con un ciclo, ci spostiamo su un elemento del ciclo successivo e seguiamo quel ciclo e così via.AA
Questo ci darebbe un algoritmo di tempo , ma presuppone che "in qualche modo sapessimo quali fossero i cicli esatti" e provando a fare questa contabilità entro la limitazione di spazio di è ciò che rende difficile questo problema.O(n)O(1)
Qui è dove l'articolo usa la teoria dei numeri.
Si può dimostrare che, nel caso in cui , gli elementi nelle posizioni , sono in cicli diversi e ogni ciclo contiene un elemento nella posizione .2n+1=3k13,32,…,3k−13m,m≥0
Questo utilizza il fatto che è un generatore di .2(Z/3k)∗
Quindi quando , l'approccio del ciclo follow ci dà un algoritmo di tempo , come per ogni ciclo, sappiamo esattamente da dove cominciare: potenze di (incluso ) (quelle può essere calcolato nello spazio ).2n+1=3kO(n)31O(1)
3) Algoritmo finale
Ora uniamo i due precedenti: Divide and Conquer + Permutazione Cycles.
Facciamo una divisione e una conquista, ma selezioniamo modo che sia una potenza di e .m2m+13m=Θ(n)
Quindi, invece, ricorrendo a entrambe le "metà", facciamo ricorso a una sola e facciamo lavoro extra.Θ(n)
Questo ci dà la ricorrenza (per alcuni ) e quindi ci dà un tempo , algoritmo spaziale!T(n)=T(cn)+Θ(n)0<c<1O(n)O(1)