Voici la réponse qui développe l'algorithme à partir du document lié par Joe: http://arxiv.org/abs/0805.1598
Considérons d’abord un algorithme qui utilise diviser pour régner.Θ(nlogn)
1) Diviser et conquérir
On nous donne
a1,a2,…,b1,b2,…bn
Maintenant, pour utiliser diviser pour régner, pour certains , nous essayons d'obtenir le tableaum=Θ(n)
[a1,a2,…,am,b1,b2,…,bm],[am+1,…,an,bm+1,…bn]
et recurse.
Notez que la partie est un décalage cyclique deb1,b2,…bm,am+1,…an
am+1,…an,b1,…bm
par lieux.m
Ceci est un classique et peut être fait sur place par trois retournements et en time.O(n)
Ainsi, la division et la conquête vous donne un algorithme , avec une récursion similaire à .Θ(nlogn)T(n)=2T(n/2)+Θ(n)
2) Cycles de permutation
Maintenant, une autre approche du problème consiste à considérer la permutation comme un ensemble de cycles disjoints.
La permutation est donnée par (en partant de )1
j↦2jmod2n+1
Si nous savions exactement quels étaient les cycles, en utilisant un espace supplémentaire constant, nous pourrions réaliser la permutation en choisissant un élément , déterminer où cet élément est placé (à l'aide de la formule ci-dessus), mettre l'élément dans l'emplacement cible dans un espace temporaire, l'élément dans cet emplacement cible et continue le long du cycle. Une fois que nous avons terminé avec un cycle, nous passons à un élément du cycle suivant et suivons ce cycle, etc.AA
Cela nous donnerait un algorithme temporel, mais cela suppose que nous "sachions en quelque sorte quels étaient les cycles exacts" et que nous essayions de faire cette comptabilité dans la limite d'espace est ce qui rend ce problème difficile.O(n)O(1)
C'est ici que le papier utilise la théorie des nombres.
On peut montrer que, dans le cas où , les éléments aux positions , sont dans des cycles différents et chaque cycle contient un élément à la position .2n+1=3k13,32,…,3k−13m,m≥0
Ceci utilise le fait que est un générateur de .2(Z/3k)∗
Ainsi, lorsque , l'approche par cycle nous donne un algorithme temporel , car pour chaque cycle, nous savons exactement par où commencer: puissances de (y compris ) peut être calculé dans l' espace ).2n+1=3kO(n)31O(1)
3) algorithme final
Maintenant, nous combinons les deux précédents: Diviser et conquérir + Cycles de permutation.
Nous faisons une division et conquérons, mais choisissons pour que soit une puissance de et .m2m+13m=Θ(n)
Donc, au lieu de revenir sur les deux "moitiés", nous ne récrivons qu'une seule et faisons un travail supplémentaire.Θ(n)
Ceci nous donne la récurrence (pour quelque ) et nous donne donc un temps , algorithme spatial!T(n)=T(cn)+Θ(n)0<c<1O(n)O(1)