Académique Documents
Professionnel Documents
Culture Documents
Algorithmique
Trouver et Trier
Florent Hivert
Ml : Florent.Hivert@lri.fr
Page personnelle : http://www.lri.fr/hivert
2 de 46
2 de 46
Recherche dans un
tableau, dichotomie
3 de 46
4 de 46
Algorithme
Entre : un tableau tab de taille taille et un lment e.
Sortie : i tel que tab[i] = e ou NonTrouv (ex : 1).
pour i de 0 taille-1 faire
si tab[i] = e alors
retourner i
retourner NonTrouv
Complexit : O(taille) (1).
5 de 46
Retenir (Ide)
Si le tableau tab est tri, pour tout indice i,
les lments e tab[i] sont dindice i ;
les lments e > tab[i] sont dindice > i.
On essaye avec i au milieu du tableau.
6 de 46
Recherche dichotomique
Algorithme (RechDichoRec : recherche dans un tableau tri)
Entre : un tableau tri tab, un intervalle [min, max] avec
0 min max < taille et un lment e.
Sortie : i tel que tab[i] = e ou NonTrouv (ex : 1).
si min = max alors
si tab[min] = e alors retourner min
sinon
retourner NonTrouv
mid <- (min + max) / 2
si tab[mid] < e alors
retourner RechDichoRec(tab, mid+1, max, e)
sinon
retourner RechDichoRec(tab, min, mid, e)
Complexit : (log2 (taille)).
7 de 46
8 de 46
9 de 46
x).
Tableaux tris,
algorithmes de tris
10 de 46
11 de 46
12 de 46
13 de 46
14 de 46
14 de 46
15 de 46
15 de 46
15 de 46
16 de 46
17 de 46
18 de 46
18 de 46
18 de 46
18 de 46
18 de 46
18 de 46
18 de 46
18 de 46
19 de 46
et
ck = 2(ck1 + 2k ) .
19 de 46
et
ck = 2(ck1 + 2k ) .
19 de 46
et
ck = 2(ck1 + 2k ) .
20 de 46
cot niveau
=
O(n)
+
n
2
n
2
O(n)
+
n
22
n
22
n
22
n
22
O(n)
+
..
.
n
2k
..
.
..
.
n
2k
..
.
k
X
i =0
..
.
2i
n
2i
..
.
..
.
n
2k
k
X
i =0
..
.
+
n
2k
..
.
O(n)
..
.
+
O(k n)
O(n log n)
21 de 46
0
1
0
0
1 2 3
4
5
6
... k
2 4 8 16 32
64 . . . 2k
3 12 42 150 558 2142 . . . (n+1)(n+2)
3
2
4 16 48 128 320 768 . . . 2k+1 k
Retenir
Pour les petites valeurs de n, le tri par fusion fait plus de copies que
le tri par insertion.
De plus, les appels rcursifs induise des cots supplmentaires. . .
21 de 46
0
1
0
0
1 2 3
4
5
6
... k
2 4 8 16 32
64 . . . 2k
3 12 42 150 558 2142 . . . (n1)(n+4)
2
4 16 48 128 320 768 . . . 2k+1 k
Retenir
Pour les petites valeurs de n, le tri par fusion fait plus de copies que
le tri par insertion.
De plus, les appels rcursifs induise des cots supplmentaires. . .
21 de 46
0
1
0
0
1 2 3
4
5
6
... k
2 4 8 16 32
64 . . . 2k
3 12 42 150 558 2142 . . .
4 16 48 128 320 768 . . . 2k+1 k
Retenir
Pour les petites valeurs de n, le tri par fusion fait plus de copies que
le tri par insertion.
De plus, les appels rcursifs induise des cots supplmentaires. . .
22 de 46
23 de 46
Dfinition
On dit quun tri est en place, sil utilise un emplacement mmoire
constant (O(1)) en plus du tableau pour stocker ses lments.
Les tris par bulles et insertions sont en place ;
Le tri par fusion nest pas en place.
On aimerait bien avoir un tri en n log(n) en place. . .
23 de 46
Dfinition
On dit quun tri est en place, sil utilise un emplacement mmoire
constant (O(1)) en plus du tableau pour stocker ses lments.
Les tris par bulles et insertions sont en place ;
Le tri par fusion nest pas en place.
On aimerait bien avoir un tri en n log(n) en place. . .
23 de 46
Dfinition
On dit quun tri est en place, sil utilise un emplacement mmoire
constant (O(1)) en plus du tableau pour stocker ses lments.
Les tris par bulles et insertions sont en place ;
Le tri par fusion nest pas en place.
On aimerait bien avoir un tri en n log(n) en place. . .
23 de 46
Dfinition
On dit quun tri est en place, sil utilise un emplacement mmoire
constant (O(1)) en plus du tableau pour stocker ses lments.
Les tris par bulles et insertions sont en place ;
Le tri par fusion nest pas en place.
On aimerait bien avoir un tri en n log(n) en place. . .
24 de 46
24 de 46
25 de 46
Partition et tris
26 de 46
Partition et tris
26 de 46
Partition et tris
26 de 46
27 de 46
Algorithme (PartitionnerPredicat)
Entre : Tableaux tab[taille], prdicat P sur les lments
de tab.
Sortie : entier 0 c < taille
Effet : change les lments de telle sorte que :
les lements du tableau qui vrifient P sont dans
tab[0] . . . tab[c 1] ;
les lements du tableau qui ne vrifient pas P sont dans
tab[c] . . . tab[taille 1].
28 de 46
c
P(e) vrai
n1
j
P(e) faux
Algorithme (PartitionnerPredicat)
c <- 0
tant que c < taille et P(tab[c]) faire
c <- c + 1
pour j de c+1 taille-1 faire
si P(tab[j]) alors
changer tab[c] et tab[j]
c <- c+1
retourner c
Complexit : (taille).
28 de 46
c
P(e) vrai
n1
j
P(e) faux
Algorithme (PartitionnerPredicat)
c <- 0
tant que c < taille et P(tab[c]) faire
c <- c + 1
pour j de c+1 taille-1 faire
si P(tab[j]) alors
changer tab[c] et tab[j]
c <- c+1
retourner c
Complexit : (taille).
29 de 46
c
P(e) vrai
n1
j
P(e) faux
30 de 46
i
P(e) vrai
j
?
n1
P(e) faux
Algorithme (PartitionnerPredicatDeux)
i <- 0
j <- taille-1
tant que i < j faire
tant que P(tab[i]) faire i <- i+1
tant que non P(tab[j]) faire j <- j-1
si i < j alors
changer tab[j] avec tab[j]
i <- i+1; j <- j-1
retourner i
30 de 46
i
P(e) vrai
j
?
n1
P(e) faux
Algorithme (PartitionnerPredicatDeux)
i <- 0
j <- taille-1
tant que i < j faire
tant que P(tab[i]) faire i <- i+1
tant que non P(tab[j]) faire j <- j-1
si i < j alors
changer tab[j] avec tab[j]
i <- i+1; j <- j-1
retourner i
30 de 46
i
P(e) vrai
j
?
n1
P(e) faux
31 de 46
31 de 46
31 de 46
32 de 46
33 de 46
34 de 46
min
ep
Sortie : la position c du pivot
c
p
max
ep
35 de 46
36 de 46
j
?
max 1 max
e pivot pivot
Algorithme (PartitionnerPivotDeux)
pivot <- tab[max]
i <- min; j <- max-1
repeter
tant que tab[i] < pivot faire i <- i+1
tant que tab[j] > pivot faire j <- j-1
si i < j alors
changer tab[i] avec tab[j]
i <- i+1; j <- j-1
sinon
changer tab[i] avec tab[max]
retourner i
36 de 46
j
?
max 1 max
e pivot pivot
Algorithme (PartitionnerPivotDeux)
pivot <- tab[max]
i <- min; j <- max-1
repeter
tant que tab[i] < pivot faire i <- i+1
tant que tab[j] > pivot faire j <- j-1
si i < j alors
changer tab[i] avec tab[j]
i <- i+1; j <- j-1
sinon
changer tab[i] avec tab[max]
retourner i
Le tri rapide
37 de 46
Le tri rapide
Le tri rapide
38 de 46
n1
ep
Retenir (Ide)
choisir un lment p appel pivot ;
placer gauche les lments infrieur p ;
placer droite les lments suprieur p ;
trier rcursivement la partie de droite et celle de gauche.
Le tri rapide
39 de 46
Complexit du QuickSort
Retenir
La complexit du partitionnement dun tableau de taille n est (n).
Dans le cas le pire, cest--dire
si le pivot est le plus grand lment et donc est plac la fin
aprs le partitionnement,
ou si le pivot est le plus petit lment et donc est plac au
dbut aprs le partitionnement,
Retenir
Dans le cas le pire, la complexit du QuickSort est (n2 ).
Le tri rapide
39 de 46
Complexit du QuickSort
Retenir
La complexit du partitionnement dun tableau de taille n est (n).
Dans le cas le pire, cest--dire
si le pivot est le plus grand lment et donc est plac la fin
aprs le partitionnement,
ou si le pivot est le plus petit lment et donc est plac au
dbut aprs le partitionnement,
Retenir
Dans le cas le pire, la complexit du QuickSort est (n2 ).
Le tri rapide
39 de 46
Complexit du QuickSort
Retenir
La complexit du partitionnement dun tableau de taille n est (n).
Dans le cas le pire, cest--dire
si le pivot est le plus grand lment et donc est plac la fin
aprs le partitionnement,
ou si le pivot est le plus petit lment et donc est plac au
dbut aprs le partitionnement,
Retenir
Dans le cas le pire, la complexit du QuickSort est (n2 ).
Le tri rapide
Retenir
Pour avoir des bonnes performances dans QuickSort, il est
important que le pivot soit bien choisi.
En pratique, sur une permutation au hasard, le pivot coupe le
tableau peu prs en deux :
Retenir
En moyenne, le QuickSort une complexit de (n log(n)).
40 de 46
Le tri rapide
Retenir
Pour avoir des bonnes performances dans QuickSort, il est
important que le pivot soit bien choisi.
En pratique, sur une permutation au hasard, le pivot coupe le
tableau peu prs en deux :
Retenir
En moyenne, le QuickSort une complexit de (n log(n)).
40 de 46
Le tri rapide
Retenir
Pour avoir des bonnes performances dans QuickSort, il est
important que le pivot soit bien choisi.
En pratique, sur une permutation au hasard, le pivot coupe le
tableau peu prs en deux :
Retenir
En moyenne, le QuickSort une complexit de (n log(n)).
40 de 46
Le tri rapide
41 de 46
Retenir
Pour avoir des bonnes performances dans QuickSort, il est
important que le pivot soit bien choisi.
Plusieurs stratgies sont proposes :
choisir un lment au milieu du tableau ;
choisir un lment au hasard dans le tableau ;
choisir la mdiane du premier, de celui du milieu et du dernier.
Le tri rapide
42 de 46
Bilan
Avantages du QuickSort :
en place, avec une petite utilisation de pile pour les appels
rcursifs. ;
bonne complexit en moyenne n log(n) ;
boucle intrieur trs courte ;
trs bien compris thoriquement.
Dsavantages du QuickSort :
rcursif, difficile implanter dans les environnements o la
rcursion nest pas possible ;
mauvaise complexit dans le cas le pire n2 ;
fragile : beaucoup de possibilit pour faire une erreur subtile en
limplantant.
43 de 46
44 de 46
Thorme
Pour tout algorithme de tri fonctionnant en comparant les donnes
la complexit dans le cas le pire est (n log(n)) (au moins n log(n)).
Preuve : Arbres de dcision binaire + formule de Stirling.
45 de 46
a<b
a<c
b<c
a<c
abc
acb
b<c
bac
cab
bca
cba
Proposition
La profondeur de larbre est au moins dlog2 (n)e o n est le nombre
de feuille.
1
1
139
+
n! = 2n
1+
+
+
e
12n 188n2 51840n3
On en dduit
log(n!) = n log(n) n + O(n)
46 de 46
1
1
139
+
n! = 2n
1+
+
+
e
12n 188n2 51840n3
On en dduit
log(n!) = n log(n) n + O(n)
46 de 46
1
1
139
+
n! = 2n
1+
+
+
e
12n 188n2 51840n3
On en dduit
log(n!) = n log(n) n + O(n)
46 de 46