Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
Mai 2011
Première partie I — Complexité théorique et expérimentale Cela pose de nombreuses questions . . . et demande pas
mal de savoir-faire
Chap. 1 Eléments de base [30%]
Chap. 2 Récurrence et complexité [15%]
Chap. * Diviser pour régner − Les tris
[6 Cours/Exercices + TP]
Deuxième partie II — Classes de problèmes & réductions
Chap. 3 Problèmes N P-complets Comment concevoir un algorithme ?
But de ce cours
De l’importance du tri
Quelques tris
Tri bulle
Invariant Après chaque itération, les i plus grands éléments sont à leur
place définitive
Complexité n(n − 1)/4 échanges en moyenne et le double dans le pire
des cas
n(n − 1)/2 comparaisons dans tous les cas
Version récursive
Récurrences de partitions
Récurrences utiles — Le théorème principal
Méthode
1 On divise le tableau en deux
2 On trie les deux sous-tableaux
3 On produit un tableau trié contenant tous les éléments des deux
sous-tableaux triés
tfusion(n) = n − 1 comparaisons
TF(T, 1 , 8)
TF(1 , 1) TF(2 , 2) F(1 , 2) TF(3 , 3) TF(4 , 4) F(3 , 4) TF(5 , 5) TF(6 , 6) F(5 , 6) TF(7 , 7) TF(8 , 8) F(7 , 8)
C’est un tri :
sans tableau auxiliaire
et de complexité moyenne O(nlog(n))
Le cas le plus défavorable est celui où le pivot choisi est le plus petit
élément de la liste. La partition coupe la liste en un morceau de longueur
1 et un autre morceau de longueur n − 1.
D’où l’équation de récurrence :
Ln = Ln−1 + n − 1 L0 = 0
Ln = n(n − 1)/2
Le cas le plus favorable est celui où le pivot choisi est l’élément médian
de la liste. La partition coupe la liste en deux morceaux de longueur n/2.
D’où l’équation de récurrence :
mais :
n
X
Fi−1 = F0 + F1 + · · · + Fn−1
i=1
n
X
Fn−i = Fn−1 + Fn−2 + · · · + F0
i=1
Pn
en multipliant par n : nFn = n(n + 1) + 2 i=1 Fi−1
n−1
X
nFn = n(n + 1) + 2 Fi−1 + 2Fn−1
i=1
n−1
X
(n − 1)Fn−1 = (n − 1)n + 2 Fi−1
i=1
en soustrayant on obtient :
nFn = (n + 1)Fn−1 + 2n F1 = 2
et on obtient :
Fn Fn−1 2
= +
n +1 n n +1
n+1
X1
Fn F1
= +2
n +1 2 i=3
i
n
X 1
Fn = 2(n + 1)(−1 + )
i=1
i
on sait que :
n
X 1
= Hn = ln n + 0.57721
i=1
i
Fn = 2n ln n − 0.846n
n
où 3 = C3n = n(n − 1)(n − 2)/6 on trouve :
12 23
Fn = (n + 1)(Hn+1 − ), n≥6
7 44
On veut calculer :
n X
X n X
X
C = Xij E [C ] = E [Xij ]
i=1 j >i i=1 j >i
[si , si+1 , . . . , sj ]
aucun autre élément de cet intervalle sauf les bornes ne sont choisis
avant si ou sj . Comme il y a j − i + 1 élément dans cet intervalle et que
les éléments sont choisis au hasard :
2
pij = E [Xij ] =
j −i +1
n X
X n X
X 2
E [C ] = E [Xij ] =
i=1 j >i i=1 j >i
j −i +1
n
X Xn
= (2Hn−i+1 − 1) = 2 Hi − n < 2nHn − n
i=1 i=1
Ce n’est pas meilleur que Quicksort normal, mais plus régulier. Pour
tomber dans le pire des cas, il faut beaucoup de malchance !!
1:2
< >
2:3 1:3
< > < >
1 2 3 2 1 3
1:3 2:3
< > < >
1 3 2 3 1 2 2 3 1 3 2 1
Sans comparaison !
Problème : Trier un fichier de N enregistrements dont les clefs sont des
entiers entre 0 et M − 1 :
for ( j = 0; j < M ; j ++)
nombre [ j ] = 0;
for ( i = 0; i < N ; i ++)
nombre [ C [ i ]] = nombre [ C [ i ]] + 1;
for ( j = 1; j < M ; j ++)
nombre [ j ] = nombre [j -1] + nombre [ j ];
for ( j = N - 1; j > 0; j - -) {
R [ nombre [ C [ i ]] = C [ i ];
nombre [ C [ i ]] = nombre [ C [ i ]] - 1;
}
Ce tri se base sur la représentation binaire (interne) des clés pour éviter
de faire des comparaisons.
Radix exchange sort : Similaire à Quicksort (même complexité). On
partitionne le fichier en utilisant récursivement les bits de la clé de la
gauche vers la droite.
Straight Radix sort : On examine maintenant les b bits de la droite
vers la gauche en rangeant chaque fois au début les clés ayant le bit
correspondant à zéro. Au bout de b passages le fichier est trié.
Complexité : Pour trier N enregistrements avec des clés de b bits il
faut b/m passages si on utilise 2m compteurs.
(5) 101
(2) 010
(4) 100
(3) 011
(7) 111
(1) 001
(5) 101
(2) 010
Pour trier une liste de tailles N dont les éléments sont répartis
aléatoirement dans l’intervalle [0..M − 1].
On découpe cet intervalle en K classes (ou paquets) de même taille
M /K .
On calcule combien il y a d’élément dans chaque classe : en moyenne
N /K . (division ou décalage).
On range les éléments dans la bonne classe.
On trie les éléments de chaque classe à l’aide d’un tri auxilaire
(Quicksort ou insertion sort).
On rassemble les données en parcourant les classes dans l’ordre.
Exemple
N est compris entre 1 000 000 et 5 000 000 d’éléments ;
M = 231 = 2147483648 ;
K = 32768 (décalage de 16) (2 tableaux de cette taille) ;
N /K entre 30 et 152.
Tµs = 0.26N log N − 1.17N − 7 × 10−6
Soit 2 fois plus rapide que Quicksort !
Sélection
Sélection (2)
T (n) = an + T (αn)
Sélection (3)
Mai 2011