ALGO1 – Diviser pour r´egner
Fran¸cois Schwarzentruber September 28, 2020
1 Motivation
Complexit´e d’un algo na¨ıf Complexit´e d’un algo efficace obtenu via diviser pour r´egner Chercher un ´el´ement dans un
tableau tri´e `an´el´ements Tri par comparaison d’un tableau de taillen
Calcul du k-i`eme ´el´ement d’un tableau `a n´el´ements
Multiplication de nombres `a n bits chacun
Multiplication de matrices de taillen×n
Calcul de la transform´ee de Fourier d’un signal de n
´
echantillons
2 Principe
Probl`eme initial : trier [1 10 4 2 5 3 9 8]
Sous-probl`eme 1 : trier [1 10 4 2]
Sous-probl`eme 2 : trier [5 3 9 8]
[1 2 4 10]
[3 5 8 9]
[1 2 3 4 5 8 9 10]
R´egner
R´egner
Diviser Combiner
3 Exemples
Dichotomie
...
Tri fusion
...
Tri rapide
...
4 Th´ eor` eme fondamental sur la complexit´ e
Th´eor`eme 1 Soita≥1, d≥2 etb≥0. Consid´erons une suite(τ(n))n∈N qui v´erifie, pour toutn≥2,
τ(n) =aτ dn
de
+O(nb).
Alors :
si a < db, τ(n) =O(nb)
sia=db, τ(n) =O(nb×hauteur)
=O(nblogdn)
sidb < a, τ(n) =O(nb feuilles)
=O(alogdn) =O(nlogda) D´emonstration. On travaille `a constante pr`es. Donc on s’int´eresse en fait `a la suite suivante :
τ(n) =aτ dn
de +nb et τ(1) = 1.
Quandn=dh D´emontrons d’abord le r´esultat lorsque nest une puissance ded, autrement dit quen=dh pour un certain h, qui est la hauteur de l’arbre des appels. A la profondeur `, le coˆut dans un nœud est dn`bb et il y a a` nœuds.
Le tableau suivant r´esume les complexit´es `a chaque niveau d’appels :
Niveau` Complexit´e dans un nœud Complexit´e totale sur le niveau
0 (racine) nb 1×nb
1 ndbb a×ndbb
... ... ...
` dn`bb a`×dn`bb
... ... ...
h(feuilles) 1 ah
Autrement dit,
τ(n) :=
h
X
`=0
a`× nb d`b =nb
h
X
`=0
a db
` .
1. Sia < db, alors la raison de la s´erie est plus petite que 1 et donc la s´erie converge. Doncτ(n) =O(nb).
2. Sia=db, alors la raison vaut 1 et la somme vaut h=O(logn). Donc τ(n) =O(nblogn).
3. Sibd< a, alors la raison est plus grande que 1 et la s´erie diverge. Doncτ(n) =O(nb dab
logdn
) =O(nlogda).
Cela termine la preuve pour le comportement asymptotique quandntend vers l’infini en prenant pour valeur des puissances ded.
Remarque 2 Il faut bien ˆetre `a l’aise avec les logarithmes. Voici les points clefs :
• x=dlogdx pour toute based >1 et pour tout nombrex >0;
• tout se passe bien avec un exposant : xt= dlogdxt
=dtlogdx.
nquelconque Maintenant si nest quelconque, on a l’encadrementdlogdn≤n < d×dlogdn. Lemme 3 La fonctionτ :N→Rest croissante.
D´emonstration. Pour le montrer, on montre par r´ecurrence surnqueτ est croissante sur {1, . . . , n}.
• Pour n= 1, la propri´et´e est triviale.
• Supposons pour unndonn´e queτest croissante sur{1, . . . , n}et montrons queτest croissante sur{1, . . . , n+ 1}.
On a :
τ(n+ 1) =aτ dn+1d e
+ (n+ 1)b ≥aτ dnde
+nb =τ(n) par hypoth`ese de r´ecurrence (l`a on utilise qued≥2 pour ˆetre sˆur quedn+1d e ≤n).
• Par r´ecurrence, on a montr´e que τ est croissante surN.
On conclut de la mani`ere suivante. Par exemple, sib > logda, on aτ(n)≤τ(ddlogdne) car τ est croissante. Mais on aτ(ddlogdne) =O(ddlogdneb) =O((ddblogdnc)b)≤O(dnb) =O(nb).
5 Algorithme de Karatsuba
D´efinition 4 (probl`eme de la multiplication de nombres)
• Entr´ee : deux entiers x,y donn´es en base 2 avecn chiffres ;
• Sortie : le produit dexety,x×y, donn´ee en base 2 avec2nchiffres.
Th´eor`eme 5 L’algorithme de multiplication appris `a l’´ecole primaire est en Θ(n2).
1 2 3 4
× 5 6 7 8 6 3 8 7 4 0 4 6 1 7 0 6 9 9 6 7 8
Th´eor`eme 6 L’algorithme de Karatsuba est enO(nlog23) . pre : deux entiersx,y den-bits
post : le produitxy fonction karatsuba(x, y)
sin= 1alors retourner xy sinon
xG, xD := lesdn2ebits les plus `a gauche, lesbn2cbits les plus `a droite dex;
yG, yD := lesdn2ebits les plus `a gauche, lesbn2cbits les plus `a droite dey;
P1=produit(xG, yG) P2=produit(xD, yD)
P3=produit(xG+xD, yG+yD)
retourner 2nP1+ 2n2(P3−P1−P2) +P2
5.0.1 Premier tentative de diviser pour r´egner
Appliquons ‘diviser pour r´egner’ pour cr´eer un algorithme plus performant. D´ecoupons les deux nombresxetycomme suit :
x= 2bn2cxG+xD ety= 2bn2cyG+yD o`uxG, yG, xD, yDsont des nombres entre 0 et 2dn2e−1. On ´ecrit :
xy= 22bn2cxGyG+ 2bn2c(xGyD+yGxD) +xDyD.
La multiplicationxyse ram`ene `a 4 multiplications avec des nombres avec 2 fois moins de bits, puis des additions, et multiplication par des puissances de deux soit duO(n). Le cas de base correspond `a une multiplication avec des nombres avec 1 bit chacun. Cela donne
τ(n) = 4τ dn2e
+O(n)., donc du O(n2), pas mieux qu’`a l’´ecole primaire.
5.0.2 Deuxi`eme tentative
Voici l’astuce de Gauss (ou Karatsuba) :
xGyD+yGxD= (xG+xD)(yG+yD)−xGyG−xDyD.
Ainsi on se ram`ene `a uniquement 3 multiplications, certes avec des additions suppl´ementaires mais qui ne coˆutent pas si ch`eres. On a :
xy= 2nP1+ 2n2(P2−P1−P3) +P3 avecP1=xGyG et P2= (xG+xD)(yG+yD) et P3=xDyD.
Chaque addition coˆuteO(n). Chaque multiplication par une puissance de 2 coˆuteO(n) (il faut juste d´ecaler les bits). La relation de r´ecurrence donne :
τ(n) = 3τ dn2e
+O(n), doncO(nlog23), soit environO(n1.59).
Remarque 7 Remarque technique concernant le produit P2. Les repr´esentations binaires des nombres xG+xD et yG+yD peuvent avoir 1 +dn2ebits, i.e. d´epasserdn2e. Mais ce n’est pas grave. En effet, en toute rigueur on devrait
´ecrire ce produit sous la forme
(a2dn2e+1+A)×(b2dn2e+1+B) =ab2dn2e+2+ 2dn2e+1(aB+bA) +AB
o`u a etb sont des bits. Il y a un traitement en O(n) plus l’appel r´ecursif correspondant au produit AB. On a cach´e ce d´etail dans le pseudo-code ci-dessous.
pre : deux entiersx,y den-bits post : le produitxy
fonction produit(x, y) sin= 1alors
retourner xy sinon
xG, xD := lesdn2ebits les plus `a gauche, lesbn2cbits les plus `a droite dex;
yG, yD := les dn2ebits les plus `a gauche, lesbn2cbits les plus `a droite dey;
P1=produit(xG, yG);
P2=produit(xD, yD);
retourner 2nP1+ 2n2(produit(xG+xD, yG+yD)−P1−P2) +P2
6 Algorithme de Strassen
D´efinition 8 (probl`eme de la multiplication de matrices)
• Entr´ee : deux matricesX et Y de taille n;
• Sortie : le produitXY.
Th´eor`eme 9 L’algorithme na¨ıf est enΘ(n3).
Th´eor`eme 10 L’algorithme de Strassen est enΘ(n2.81).
L’objectif est de cr´eer un algorithme efficace pour calculer le produitXY de deux matricesX etY de taillen×n.
L’algorithme na¨ıf calcule chaque terme deXY enO(n) et il y an2 termes, d’o`u une complexit´e totale deO(n3).
6.0.1 Premier essai diviser pour r´egner
L’id´ee consiste `a d´ecouper les matrices en sous-blocs de la fa¸con suivante : content...
X =
A B
C D
et Y =
E F
G H
. On a alors : XY =
AE+BG AF+BH CE+DG CF +DH
. D’o`u T(n) = 8T(n2) +O(n2), i.e. T(n) =O(nlog28) =O(n3).
6.0.2 Algorithme de Strassen
L’algorithme de Strassen calculeXY `a partir de seulement 7 produits de matrices plus petites et non pas 8 ! En fait on a
Algorithme de Strassen En ´ecrivantX =
A B
C D
etY =
E F
G H
, calculer XY =
P5+P4−P2+P6 P1+P2
P3+P4 P1+P5−P3−P7
o`u ces produits sont calcul´es r´ecursivement :
• P1=A(F−H)
• P2= (A+B)H
• P3= (C+D)E
• P4=D(G−E)
• P5= (A+D)(E+H)
• P6= (B−D)(G+H)
• P7= (A−C)(E+F) On a donc un algorithme de type diviser pour r´egner v´erifiant la relation de r´ecurrence :
T(n) = 7T(n2) +O(n2) d’o`u d’apr`es le th´eor`eme fondamental,T(n) =O(nlog27) =O(n2.81).
Le meilleur algorithme connu `a ce jour, dˆu `a Coppersmith-Winograd [?], est enO(n2.376).
7 Transformation de Fourier Discr` ete Rapide (FFT)
D´efinition 11 La transform´ee de Fourier Discr`ete est le probl`eme algorithmique :
• entr´ee :
– un polynˆomeA=Pn−1
i=0 aiXi, d´ecrit avec un vecteur~a= (a0, a1, . . . , an−1);
– une racinen`eme de l’unit´eω ; par exemple ω=e2πin
• sortie : A(ω0), A(ω), . . . , A(ωn−1).
Th´eor`eme 12 L’algorithme na¨ıf est en Θ(n2).
7.1 Principe
On d´ecompose le polynˆomeAen sa partie paireP, et impaireI : A=P(X2) +X×I(X2).
Exemple 13
A = 1 +6X −3X2 +2X3 +X4 −7X5
P = 1 −3X +X2
I = 6 +2X −7X2
entr´ee : un polynˆomeA, une racine de n-`eme de l’unit´eω sortie : A(ω0), A(ω), . . . , A(ωn−1)
fonction FFT(A, ω) siAest constant
retourner A(1) sinon
soitP la partie paire etIla partie impaire deA calculerP(1), P(ω2). . . , P(ωn−2) viaF F T(P, ω2) calculerI(1), I(ω2). . . , I(ωn−2) viaF F T(I, ω2) pour k= 0 `an−1
A(ωk) := P(ω2k) +ωkI(ω2k) retourner A(ω0), A(ω), . . . , A(ωn−1) Th´eor`eme 14 La complexit´e est enO(nlogn).
D´emonstration.
τ(n) = 2τ dn
2e
+O(n).
7.2 Pseudo-code d´ etaill´ e
On consid`ere ici une racine n-`eme de l’unit´eω . Ainsiωn/2=−1.
Posons (s0, . . . , sn/2−1) = (P(1), P(ω2). . . , P(ωn−2) et (s00, . . . , s0n/2−1) = (I(1), I(ω2). . . , I(ωn−2). On a pour toutk,
A(ωk) =P(ω2k) +ωkI(ω2k).
• pour toutk≤ n2−1, on aA(ωk) =P(ω2k) +ωkI(ω2k) =sk+ωks0k;
• pour toutk≤ n2−1, on aA(ωk+n/2) =P(ω2(k+n/2)) +ωk+n/2I(ω2(k+n/2)) =P(ω2k)−ωkI(ω2k) =sk−ωks0k. entr´ee : des nombres a0, . . . , an−1, et une racinen-`eme de l’unit´e primitiveω
sortie : A(ω0), A(ω), . . . , A(ωn−1) o`u A=Pn−1 i=0 aiXi fonction FFT(a0, . . . , an−1, ω)
sin= 1
retourner a0
sinon
(s0, . . . , sn/2−1) :=F F T(a0, a2, . . . , an−2, ω2) (s00, . . . , s0n/2−1) :=F F T(a1, a3, . . . , an−1, ω2) α:= 1
pour k= 0 `an/2−1 yk =sk+αs0k
yk+n/2=sk−αs0k op´eration papillon α:=α×ω
retourner y0, . . . , yn−1
7.3 Circuit pour la FFT
Voici l’arbre des appels r´ecursifs de la FFT :
L’ordre 0, 4, 2, 6, 1, 5, 3, 7 s’obtient en prenant les miroirs des ´ecritures binaires de 0, 1, 2, 3, 4, 5, 6, 7.
Le circuit suivant repr´esente le calcul de la FFT, en lisant l’arbre ci-dessous. Les feuilles sont les entr´ees.
Le calcul en bleu dans l’algorithme s’appelle une op´eration papillon : on la repr´esente par une croix bleue, agr´ement´ee par la valeur deα.
y0
y1 y2
y3
y4 y5 y6
y7
a0 a4
a2
a6 a1 a5
a3
a7
000|000 001|100 010|010 011|011 100|001 101|101 110|011 111|111
ω0
ω0
ω0
ω0
ω0 ω2
ω0 ω2
ω0 ω1
ω2 ω3
Th´eor`eme 15 Il y a Θ(nlogn) op´eration papillons.
Th´eor`eme 16 Le circuit est de profondeur Θ(logn) . L’algorithme s’ex´ecute en Θ(logn) sur une architecture parall`ele.
7.4 Algorithme it´ eratif
entr´ee : des nombresa0, . . . , an−1, et une racinen-`eme de l’unit´e primitiveω sortie : A(ω0), A(ω), . . . , A(ωn−1) o`uA=Pn−1
i=0 aiXi fonctionFFT(a0, . . . , an−1, ω)
pour k= 0 `an−1faire sk:=amiroir(k)
pour m:= 2,4,8, . . . , nfaire ω:=e2iπ/m
pour k= 0, m,2m, . . . , n−mfaire α:= 1
pour j= 0 `a m/2−1 faire
sk+j, sk+j+m/2=sk+j+αsk+j+m/2, sk+j−αsk+j+m/2 α:=α×ω
retourner s0, . . . , sn−1
7.5 Transformation de Fourier inverse
D´efinition 17 (matrice de Vandermonde) V(ω) =
1 1 1 . . . 1
1 ω ω2 . . . ωn−1 1 ω2 ω2×2 . . . ω2×(n−1) ... . . ...
1 ωn−1 ω(n−1)×2 . . . ω(n−1)(n−1)
.
Proposition 18 La transform´ee de Fourier Discr`ete revient `a calculerV(ω)~ao`uωracinen-`eme primitive de l’unit´e.
Th´eor`eme 19 Si ω est une racinen-`eme primitive de l’unit´e, V(ω)−1= n1V(ω−1).
La transform´ee de Fourier est le vecteur~y=V(ω)~a. La transform´ee inverse est :~a:=V(ω)−1~y..
Corollaire 20 On peut calculer la FFT inverse en appelant le mˆeme algo : n1F F T(~y, ωn−1).
7.6 Multiplication de polynˆ omes
Algorithme pour multiplier deux polynˆomes repr´esent´ees par coefficients
1. On ´evalue les polynˆomesA,B de degr´en/2 en les points 1, ω, . . . , ωn−1 o`uω=e2πin ;(FFT) 2. On effectue la multiplication par valeur, on cal-
culeC(1) =A(1)B(1), C(ω) =A(ω)B(ω), etc.
3. On interpole C pour obtenir ses coefficients.
(FFT inverse)
Repr´esentation par coefficients Multiplication
Repr´esentation par valeurs auxnracines de l’unit´e Multiplication
Evaluation en´ Θ(n)racines de l’unit´e FFTO(nlogn)
Interpolation FFT inverseO(nlogn)
Corollaire 21 On peut multiplier deux polynˆomes de degr´eO(n)enO(nlogn).
8 Type abstrait ‘Polynˆ ome’
Voici le type abstrait d’un polynˆome :
• Evaluer le polynˆ´ ome en un point ;
• Addition de deux polynˆomes ;
• Multiplier deux polynˆomes ;←l`a, on se concentre sur cette op´eration
• Calculer une racine ;
• D´eriver, etc.
8.1 Impl´ ementations par coefficients
A=
n−1
X
i=0
aiXi
On stocke les coefficientsa0, . . . , an−1dans un tableau.
Evaluation´ On utilise la r`egle de Horner en Θ(n) :
A(8) =a0+8×(a1+8×(a2+...+8×(an−2+8×an−1))...)) Addition En Θ(n) : on somme coefficients par coefficients.
Multiplication On cherche le produit de deux polynˆomesAet B de degr´en−1 d´efinis par : A=
n−1
X
i=0
aiXi, B=
n−1
X
i=0
biXi.
Le r´esultat est le polynˆomeC=P2n−2
k=0 ck de degr´e 2n−2, avec : ck=
k
X
i=0
aibk−i.
Remarque 22 En th´eorie du signal, on peut avoir envie de construire un signal c `a partir d’une superposition de signauxbd´ecall´es, pond´er´es par des coefficientsa. C’est exactement le calcul ci-dessus !
L’impl´ementation directe du produit de 2 polynˆomes est donc de complexit´e Θ(n2).
8.2 Impl´ ementation par paires point-valeur
Un polynˆomeA de degr´e≤n−1 est repr´esent´e par un ensemble denpaires point-valeur : {(x0, y0), . . . ,(xn−1, yn−1)}
Exemple 23 Le polynˆomeA= 2+X2+5X3est repr´esent´ee par l’ensemble de 4 points{(−1,−2),(0,2),(1,8),(2,46)}
(carP(−1) =−2,P(0) = 2, etc.).
Addition. En Θ(n).
Multiplication. En Θ(n), mais il faut utiliser une repr´esentation´etendue.
Ade degr´e≤n−1, repr´esent´e par {(x0, y0), . . . ,(x2n−1, y2n−1)}
B de degr´e≤n−1, repr´esent´e par{(x0, y00), . . . ,(x2n−1, y2n−10 )}
alorsABde degr´e≤2n−1 repr´esent´e par{(x0, y0y00), . . . ,(x2n−1, y2n−1y2n−10 )}
8.3 Conversion d’une repr´ esentation ` a une autre
Repr´esentation par coefficients Multiplication
Repr´esentation par valeurs Multiplication
Evaluation en´ Θ(n) points distincts Avec r`egle de Horner
Interpolation
Interpolation de Lagrange
par coefficients par valeurs Evaluation en un point´ O(n) ?
Somme O(n) O(n)
Multiplication O(n2) O(n)
Evaluation en´ Θ(n) points distincts. En Θ(n2) en appliquant Θ(n) fois la r`egle de Horner.
Interpolation Trouver les coefficients du polynˆomes `a partir des points s’appellent uneinterpolation. Cela requiert Θ(n2) op´erations ´el´ementaires si on utilise l’interpolation de Lagrange qui permet de retrouver les coefficients du polynˆome `a partir de couples (xi, yi) :
P
iyi`i(X) o`u `i=ΠΠj6=i(X−xj)
j6=i(xi−xj).
8.4 Avoir le meilleur des deux mondes avec la FFT
Repr´esentation par coefficients Multiplication
Repr´esentation par valeurs auxnracines de l’unit´e Multiplication
Evaluation en´ Θ(n)racines de l’unit´e FFTO(nlogn)
Interpolation FFT inverseO(nlogn)
9 S´ election
D´efinition 24 (Probl`eme de s´election)
• Entr´ee : un tableau T d’´el´ements comparables, un entierk ;
• Sortie : le k-`eme ´el´ement le plus petit deT.
fonction selection(T, k)
Choisir un ´el´ementxdeT comme pivot
D´ecouperT en trois cat´egories : T<,T= etT> (resp. les ´el´ements inf´erieurs< x, ´egaux `a xet > x) sik≤ |T<|alors retournerselection(T<, k)
sinon si|T<|< k≤ |T<|+|T=|alors retourner x sinon retourner selection(T>, k− |T=| − |T<|)
Th´eor`eme 25 La complexit´e pire cas estΘ(n2) .
9.1 Choix al´ eatoire du pivot
Choisir al´eatoirement uniform´ement le choix du pivot jusqu’`a ce que|T<| ≤3n/4 et|T>| ≤3n/4.
Th´eor`eme 26 L’esp´erance du temps pass´e pour choisir un tel pivot estO(n).
D´emonstration. On choisit un indicei du tableauT entre 1 etn. Tester que|T<| ≤3n/4 et|T>| ≤3n/4 se fait en tempsO(n).
On a |T<| ≤3n/4 et|T>| ≤3n/4 d`es lors queiest entren/4 et 3n/4. Ainsi : P(|T<| ≤3n/4 et|T>| ≤3n/4) = 1/2 L’esp´eranceE du nombre de lancers jusqu’`a avoir un bon choix v´erifie :
E=
∞
X
j=1
j(1/2)j Or E=P∞
j=1j(1/2)j = 1 +P∞
j=1(j−1)(1/2)j= 1 +P∞
j=0(j)(1/2)j= 1 +E/2 DoncE= 2.
Donc l’esp´erance du temps pass´e est 2O(n) =O(n).
Th´eor`eme 27 L’esp´erance du temps pass´e de l’algorithme s´election avec ce choix al´eatoire est O(n).
D´emonstration. On a une esp´erance deO(n) `a chaque appel r´ecursif. En notantT(n) l’esp´erance du temps pour l’algorithme, on a :
T(n)≤T(3n/4) +O(n) D’o`u duT(n) =O(n).
9.2 Algorithme lin´ eaire d´ eterministe
fonctionselection(T, k)
D´ecouperT en blocs de taille 5 (sauf ´eventuellement le dernier de taille≤5)
Calculer les m´edians de chaque blocs et les stocker dans un tableauM
Calcul du tableauM.
x:=selection(M,b|M|/2c)
D´ecouperT en trois cat´egories : T<, T= et T>
si k≤ |T<|alors retournerselection(T<, k) sinon si|T<|< k≤ |T<|+|T=|alors retournerx sinon retourner selection(T>, k− |T=| − |T<|)
Th´eor`eme 28 L’algorithme de s´election est en O(n) dans le pire cas.
Pourquoi le pivot est-il bon ?
Trions (par la pens´ee) les blocs par m´edians croissants et dessinons les chacun tri´es.
≤ ≤ ≤ ≤ ≤ ≤ ≤ ≤ ≤ ≤ ≤ ≤≥ ≥ ≥x ≥ ≥ ≥ ≥ ≥ ≥ ≥ ≥ ≥
D´emonstration. Le calcul du tableauM est enO(n). Le calcul du m´edian deM est enT(n/5).
Il y a 3/10 des ´el´ements qui sont plus petits que ou ´egaux `ax. Il y a 3/10 des ´el´ements qui sont plus grands que ou ´egaux `a x. Ainsi, nous avons|T<| ≤7n/10 et|T>| ≤7n/10. Ainsi la relation de r´ecurrence est :
T(n) =T(n/5) +T(7n/10) +O(n).
Avec la m´ethode de l’arbre r´ecursif (s´erie convergente), on voit queT(n) =O(n).
10 Notes bibliographiques
Diviser pour r´egner est au programme de Terminale ! Ce cours a ´et´e r´ealis´e avec les deux ouvrages phares [DPV08] et [CLRS09]. La terminologiediviser pour r´egner remonte `a Karatsuba et Ofman [KO63] en 1963. Le tri fusion aurait
´et´e invent´e en 1945 par John von Neumann. Le tri rapide a ´et´e invent´e en 1962 par Hoare [Hoa62].
L’algorithme de Strassen a fait des ´emois en 1969 [Str69] alors que tout le monde pensait que tout algorithme ´etait forc´ement cubique dans le pire cas. Blum, Floyd, Pratt, Rivest, and Tarjan ont invent´e l’algorithme de s´election en pire casO(n) [BFP+73]. Pour la FFT, on cite souvent Cooley et Tukey [CT65], mais l’algorithme ´etait connu et on attribue sa premi`ere invention `a Gauss.
Le papier original pour le master theorem est [BHS80]. Il y a des m´ethodes plus puissantes comme celle de Akra-Bazzi [AB98].
References
[AB98] Mohamad A. Akra and Louay Bazzi. On the solution of linear recurrence equations.Comput. Optim. Appl., 10(2):195–210, 1998.
[BFP+73] Manuel Blum, Robert W. Floyd, Vaughan R. Pratt, Ronald L. Rivest, and Robert Endre Tarjan. Time bounds for selection. J. Comput. Syst. Sci., 7(4):448–461, 1973.
[BHS80] Jon Louis Bentley, Dorothea Haken, and James B Saxe. A general method for solving divide-and-conquer recurrences. ACM SIGACT News, 12(3):36–44, 1980.
[CLRS09] Thomas H Cormen, Charles E Leiserson, Ronald L Rivest, and Clifford Stein. Introduction to algorithms.
MIT press, 2009.
[CT65] James W Cooley and John W Tukey. An algorithm for the machine calculation of complex fourier series.
Mathematics of computation, 19(90):297–301, 1965.
[DPV08] Sanjoy Dasgupta, Christos H. Papadimitriou, and Umesh V. Vazirani. Algorithms. McGraw-Hill, 2008.
[Hoa62] C. A. R. Hoare. Quicksort. Comput. J., 5(1):10–15, 1962.
[KO63] Anatolii Karatsuba and Yu Ofman. Multiplication of multidigit numbers on automata. In Soviet physics doklady, volume 7, pages 595–596, 1963.
[Str69] Volker Strassen. Gaussian elimination is not optimal. Numerische mathematik, 13(4):354–356, 1969.