Académique Documents
Professionnel Documents
Culture Documents
04 Tris
04 Tris
Algorithmique
Trouver et Trier
Florent Hivert
Ml : Florent.Hivert@lri.fr Page personnelle : http://www.lri.fr/hivert
2 de 46
La plupart des bons algorithmes fonctionnent grce une mthode astucieuse pour organiser les donnes. Par exemple, on sait trs bien, intuitivement, que pour retrouver une carte dans un jeu, il est trs utile que le jeu soit tri. Trouver et Trier : Donald E. Knuth, The Art of Computer Programming (TAOCP), Volume 3 : Sorting and Searching, Addison-Wesley, 1998.
2 de 46
La plupart des bons algorithmes fonctionnent grce une mthode astucieuse pour organiser les donnes. Par exemple, on sait trs bien, intuitivement, que pour retrouver une carte dans un jeu, il est trs utile que le jeu soit tri. Trouver et Trier : Donald E. Knuth, The Art of Computer Programming (TAOCP), Volume 3 : Sorting and Searching, Addison-Wesley, 1998.
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
10 de 46
11 de 46
Prcondition : tab est tri (tab[i ] tab[i + 1]). Eet : e ajout tab tri. i <- taille tant que i > 0 et tab[i-1] > e faire tab[i] <- tab[i-1] i <- i-1 tab[i] <- e taille <- taille + 1 Complexit : O (taille)
12 de 46
13 de 46
14 de 46
Du latin Divide ut imperes (Machiavel) On divise un problme de grande taille en plusieurs (deux) sous-problmes analogues. Direntes stratgies :
1
rcursivit sur les donnes : on spare les donnes en deux parties arbitraires, puis on rsout les sous-problmes, pour enn combiner les rsultats. rcursivit sur le rsultat : on eectue un pr-traitement pour bien dcouper les donnes, an que, aprs avoir rsolu les sous-problmes, les sous-rsultats se combinent deux-mmes.
14 de 46
Du latin Divide ut imperes (Machiavel) On divise un problme de grande taille en plusieurs (deux) sous-problmes analogues. Direntes stratgies :
1
rcursivit sur les donnes : on spare les donnes en deux parties arbitraires, puis on rsout les sous-problmes, pour enn combiner les rsultats. rcursivit sur le rsultat : on eectue un pr-traitement pour bien dcouper les donnes, an que, aprs avoir rsolu les sous-problmes, les sous-rsultats se combinent deux-mmes.
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
ck = 2k +1 k = 2n log2 (n) . Preuve par rcurrence : vrai pour k = 0 si ck = 2k +1 k alors ck +1 = 2(ck + 2k +1 ) = 2(2k +1 k + 2k +1 ) = 2k +2 (k + 1)
19 de 46
ck = 2k +1 k = 2n log2 (n) . Preuve par rcurrence : vrai pour k = 0 si ck = 2k +1 k alors ck +1 = 2(ck + 2k +1 ) = 2(2k +1 k + 2k +1 ) = 2k +2 (k + 1)
19 de 46
ck = 2k +1 k = 2n log2 (n) . Preuve par rcurrence : vrai pour k = 0 si ck = 2k +1 k alors ck +1 = 2(ck + 2k +1 ) = 2(2k +1 k + 2k +1 ) = 2k +2 (k + 1)
20 de 46
cot niveau
O (n) + 0
n 2
+
n 22 n 22
n 2
O (n) +
n 22
+ . . . . . . + O
i =0 k
+ . . . = . . .
+ . . . +
k i =0
n 22
O (n) + . . . + O (n) =
2 . . . k
. . .
n 2k
. . .
n 2k
. . . +
n 2k
n 2k
2i
n 2i
n = O (k n)
O (n log n)
21 de 46
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
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
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
On utilise un tableau de taille t supplmentaire (en fait en tant t sut). astucieux, un tableau de taille 2
Dnition
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
On utilise un tableau de taille t supplmentaire (en fait en tant t sut). astucieux, un tableau de taille 2
Dnition
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
On utilise un tableau de taille t supplmentaire (en fait en tant t sut). astucieux, un tableau de taille 2
Dnition
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
On utilise un tableau de taille t supplmentaire (en fait en tant t sut). astucieux, un tableau de taille 2
Dnition
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
Comment sparer les lements dun tableau en deux pour que si lon trie chaque partie le rsultat soit trie ?
24 de 46
Comment sparer les lements dun tableau en deux pour que si lon trie chaque partie le rsultat soit trie ?
25 de 46
26 de 46
Partition et tris
eectuer une partition du tableau en plaant les petits lments au dbut et les grands la n. trier chacune des parties indpendemment.
26 de 46
Partition et tris
eectuer une partition du tableau en plaant les petits lments au dbut et les grands la n. trier chacune des parties indpendemment.
26 de 46
Partition et tris
eectuer une partition du tableau en plaant les petits lments au dbut et les grands la n. trier chacune des parties indpendemment.
27 de 46
Algorithme (PartitionnerPredicat)
Entre : Tableaux tab[taille], prdicat P sur les lments de tab. Sortie : entier 0 c < taille Eet : change les lments de telle sorte que :
les lements du tableau qui vrient P sont dans tab[0] . . . tab[c 1] ; les lements du tableau qui ne vrient pas P sont dans tab[c ] . . . tab[taille 1].
28 de 46
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
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
En particulier dans certains cas dgnrs, il eectue taille change l o un seul est ncessaire. Par exemple, si P(tab[0]) est faux, mais P(tab[i ]) est vrai pour tous les i > 0 alors PartitionnerPredicat dcale tout le tableau alors quil surait dchanger le premier avec le dernier lment.
30 de 46
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
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
31 de 46
31 de 46
31 de 46
32 de 46
33 de 46
34 de 46
c p
max ep
35 de 46
36 de 46
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
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
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 n 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 n 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 n 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
40 de 46
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)).
Le tri rapide
40 de 46
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)).
Le tri rapide
40 de 46
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)).
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, dicile 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 b<c abc acb a<c cab bac bca a<c b<c cba
Proposition
La profondeur de larbre est au moins log2 (n) o n est le nombre de feuille.
46 de 46
1+
46 de 46
1+
46 de 46
1+