Compte Rendu - Mathieu Loslier

LOSLIER Mathieu
Ingénieur2000 – IR1
Rapport de Tests – TP3 Algorithmique
Algorithmes de Tri, complexité
Objectifs : Comportements et analyse des différents algorithmes de tri.
1. Introduction
Nous allons étudier dans ce rapport les algorithmes suivants :
 le tri bulle
 le tri par insertion
 le tri par sélection
 le tri rapide
L'étude et l'analyse de ces algorithmes ne sont pas l'objet de ce rapport, nous allons nous
concentrer ici sur leur complexité en fonction de la taille du tableau à trier. Notons que pour
le tri rapide, la complexité peut varier selon le choix du pivot. En effet ce dernier peut être
choisit de plusieurs manières différentes. Pour ce TP nous retiendrons :




le pivot est le premier élément
le pivot est le dernier élément
le pivot est un élément du tableau sélectionné au hasard
le pivot est le Médian à 3 du tableau.
Rappelons que le médian à trois est la valeur intermédiaire des trois premières valeurs
distinctes d'un tableau.
Une fois les différents algorithmes implémentés et fonctionnels, nous pouvons désormais
nous intéresser à la structure même du test des complexités.
2
2. Statistiques
Afin de déterminer l’algorithme le plus performant, nous devons trouver un moyen
de quantifier et de comparer le nombre d'affectations et de comparaisons effectuées lors des
différents tris. Dès lors que les méthodes de tris renvoient chacune le nombre d'opérations,
il convient de déterminer la structure du test. Précisons néanmoins que seules les opérations
intimement liées aux tris ont été comptabilisées, toutes celles liées aux boucles, ou à des
variables de contrôle n'entrent pas dans le calcul.
La complexité des algorithmes de tri étant fonction de la taille du tableau à trier, il nous faut
trouver un éventail de tailles représentatif permettant de comparer efficacement le nombre
d'opérations pour chaque tri.
Les valeurs suivantes ont été retenues : 5, 10, 20, 40, 50, 75, 100, 200, 300, 500;
Afin d'avoir les statistiques les plus fiables possibles, il faut pouvoir effectuer plusieurs fois un
tri utilisant le même algorithme sur la même taille de tableau. En divisant le nombre total
d'opérations ainsi obtenu par le nombre de test réalisés on obtient un nombre moyen
d’opérations effectuées. On comprend bien ici que plus le nombre de tris réalisés pour une
taille de tableau donnée, et plus la valeur moyenne sera précise. Seulement pour des
dimensions de tableau trop importantes, le coût en temps des tests risque d'être trop élevé.
Nous opterons ici pour une valeur raisonnable de 15 tris exécutés pour chaque taille de
tableau.
La structure même du test étant établie, il faut stocker les résultats. Chaque tri sauvegardera
donc son nombre moyen d'affectations et de comparaisons en fonction de la taille du
tableau dans deux fichiers distincts (Remarque : chaque choix de pivot pour le tri rapide
compte comme étant un tri à part entière, ceci afin de comparer les éventuels écarts de
complexité entre ces derniers).
Pour finir, ces fichiers sont utilisés par gnuplot (Programme permettant de tracer des
courbes au format PostScript) nous permettant de visualiser concrètement les résultats
obtenus. L'échelle des graphiques est la suivante :
 de 0 à 600 en abscisse (Taille des données : nombre d’entiers)
 de 0 à 10 000 en ordonnée (Nombre de comparaisons)
Chaque fichier PostScript présente les courbes de x * log( x ) , de x² et des résultats obtenus
avec le tri en question (pour le nombre d'affectations ou de comparaisons).
Une fois l'ensemble des courbes tracées via ce petit utilitaire, il nous faut désormais les
étudier et les comparer.
(NOTE : le programme fournit en annexe ne crée pas de façon autonome les fichiers .ps, mais
uniquement les fichiers de sauvegarde des valeurs. Pour créer, ou mettre à jour les courbes, il
suffit de se placer dans le répertoire « graphes et plot », puis de lancer la commande
suivante : gnuplot *.plot
En effet, l'ensemble des fichiers .plot a été préalablement créé).
3
3. Résultats
Tout d'abord le choix des deux fonctions tracées en plus des résultats n'est pas
anodin. En effet, les fonctions x² et x * log(x) sont connues pour être les complexités
théoriques respectives des tris naïfs (bulle, insertion, sélection), et des tris rapides. L'objectif
de ce TP était bien de comparer les valeurs théoriques aux valeurs pratiques récupérées
grâce aux tests ci-dessus.
Les résultats étant très proches pour chaque tri entre le nombre d'affectations et de
comparaisons, dans un souci de clarté nous n'allons étudier ici que les comparaisons car ce
sont les opérations les plus « gourmandes ».
Ci-après se trouvent les graphiques respectifs du tri à bulle, tri sélection, tri rapide avec pivot
aléatoire et enfin le tri rapide avec un pivot médian. On remarque tout de suite que le tri
bulle et sélection sont très proches l'un de l'autre et de la courbe x * x, exactement comme
pour les deux tris rapides avec x * log(x). On peut rajouter que le tri bulle se situe juste en
dessous de la courbe de x², tandis que la représentation du tri par sélection est strictement
confondue avec la courbe de x².
Ces tris ont été sélectionnés car ils sont tous représentatifs pour notre rapport. En effet, le
tri bulle et insertion sont presque confondus sur les courbes, idem pour les tris rapides
avec pivot aléatoire, en début et en fin. En observant de plus près les deux tris rapides, on
se rend compte que celui avec pivot aléatoire est bien plus proche de la courbe de x * log(x)
que le tri avec un pivot médian (linéaire).
Figure 1 : Tri Bulle
4
Figure 2 : Tri Sélection
Figure 3 : Tri rapide avec pivot aléatoire
5
Figure 4 : Tri rapide avec pivot médian
6
4. Conclusion
Les graphiques ont bel et bien confirmés les valeurs théoriques, c'est à dire que les
tris dits naïfs sont d'une complexité proche de n², tandis que le tri rapide est proche de n *
log(n). Pour ce dernier, en théorie la complexité maximale est également en O(n²) mais
statistiquement ce cas ne se présente que très rarement ce qui nous permet de dire que
dans la plupart des cas le tri rapide s'effectuera avec une complexité en n * log(n).
On notera tout de même la légère différence résidant entre les différents tris rapides,
représentés on l'a dit par le choix initial du pivot. En effet, lorsque l'on choisit comme pivot la
valeur médiane, cela a pour conséquence d'augmenter la complexité, ce qui est logique car
le traitement nécessaire au calcul du dit pivot coute un certain temps machine. Cependant
on pourrait s'attendre à ce que le choix d'un bon pivot, divisant le tableau initial en deux
parties égales, soit plus avantageux que de prendre le risque de tomber sur un très mauvais
cas en prenant par exemple un pivot aléatoire. Or on se rend compte que ce n'est pas
vraiment le cas, car même s'il est probable que l'on tombe sur un mauvais cas,
statistiquement le gain de temps obtenu en ne calculant pas le médian est utilisé pour
rallonger très légèrement le tri.
En conclusion pour le tri rapide, il est plus avantageux de choisir un pivot aléatoire
(Remarque : choisir le premier, le dernier ou tout autre élément au hasard revient
strictement au même) en prenant le risque de tomber sur un mauvais cas, que de pedre du
temps à trouver le médian idéal.
Note: Pour accentuer encore plus l'écart entre les choix des pivots, il serait intéressant
d'augmenter significativement la taille des tableaux et d'ajuster l'échelle des graphiques. En
effet, on pourrait clairement voir une séparation s'effectuer entre les deux courbes.
7