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
© Copyright 2024