L2S3 Harmonisation UFR d’IEEA – Université Lille 1 Algorithmique 2016–2017 DM : Tris de tableaux Pour tester les algorithmes à écrire dans ce DM vous pouvez utiliser le fichier permutation.py donné sur le portail. Il fournit les fonctions suivantes : fonction identite(n : entier) retourne tableau d’entiers qui prend en paramètre un entier n et retourne un tableau de taille n dont la case i contient l’entier i fonction melange(T : tableau d’entiers) retourne tableau d’entiers qui prend en paramètre un tableau d’entiers et échange (pseudo-)aléatoirement ses cases Travail à rendre Vous devez rendre sur papier les réponses aux questions. Votre éventuel code python n’est pas demandé mais vous pouvez le joindre en annexe si vous le souhaitez. Les questions sur la complexité ne sont pas facultatives mais constituent l’intérêt principal du DM ... Pour les pires et meilleurs cas il faut simplement regarder s’il y a une/des condition(s) qui permet(tent) de terminer plus rapidement l’exécution. Ces conditions donnent en général une information sur la forme que doit avoir la donnée (triée, à moitiée triée ou autre ...) pour atteindre un pire ou un meilleur cas de l’algorithme. Pour les preuves d’algorithme, les propriétés auxquelles il faut réfléchir ne sont pas nécessairement compliquées, elles peuvent même être (très) évidentes. L’idée est de convaincre un interlocuteur que votre algorithme fait bien ce qui est attendu de lui, il y a donc quelques arguments (assez simples) à donner. Notez que ce qui a l’air le plus évident est souvent difficile à expliquer mais c’est un exercice important d’arriver à tirer de l’évidence un argument convaincant. 1. Tri à bulles Le tri à bulles est le tri le plus naturel, son principe est très simple : on parcours le tableau jusqu’à la fin et chaque fois qu’on rencontre un indice i pour lequel t(i) est supérieur à t(i + 1) on intervertit ces deux éléments. On recommence le parcours tant que le tableau n’est pas trié. Les premières questions ont pour objectif de vous aider à bien comprendre comment fonctionne l’algorithme. 1.1 L’agorithme Q1.1 . Testez à la main l’algorithme du tri à bulles sur le tableau t = [5; 4; 3; 2; 1] en représentant le tableau après chaque échange d’éléments. Q1.2 . Que se passe-t-il pour le plus grand élément ? Et pour le plus petit ? Observez également la progression des autres éléments. Q1.3 . En déduire une borne supérieure du nombre de parcours nécessaires au tri du tableau. Q1.4 . Il y a plusieurs variantes de l’algorithme dont certaines utilisent la borne précédement identifiée, mais pas toutes. Ecrivez en pseudo code le tri à bulles en essayant d’obtenir une variante qui effectue le moins possible de comparaisons entre les éléments du tableau. Vous pouvez donner plusieurs versions de l’algorithme. Justifiez si possible l’efficacité de votre tri. 1 1.2 Complexité du tri à bulle Q1.5 . Identifiez un pire et un meilleur cas pour votre tri à bulles. Pour cela vous devez regarder dans l’algorithme quelles conditions doivent être vérifiées par les données pour que l’algorithme s’arête le plus tard et le plus rapidement possible. Vous pourrez ainsi en déduire les conditions à remplir par les données pour atteindre un pire et un meilleur cas. Q1.6 . Combien de comparaisons entre éléments du tableau sont effectuées dans le pire et le meilleur cas pour trier un tableau de taille n ? Q1.7 . Donnez l’ordre de grandeur asymptotique du nombre de comparaisons effectuées (O ? Ω ? Θ ?). 1.3 Preuve informelle d’algorithme Q1.8 . Donnez un invariant pour la boucle qui concerne la répétition des parcours en vous appuyant sur votre réponse aux premières questions. Q1.9 . Donnez un invariant vrai au cours d’un parcours en vous appuyant sur votre réponse aux premières questions. Cet invariant doit vous permettre d’arriver à la conclusion que si l’invariant trouvé à la question précédente est vrai en début de parcours, il l’est encore à la fin d’un parcours. Q1.10 . A partir de vos réponses précédentes proposez une preuve que l’algorithme que vous avez écrit est bien un algorithme de tri, c’est-à-dire simplement que le tableau donné en paramètre est bien trié à la fin. Q1.11 . Expliquez pourquoi votre algorithme termine toujours. 2. Tri par sélection Le principe de l’algorithme du tri par sélection consiste à construire petit à petit une partie de tableau triée de taille croissante en sélectionnant à chaque étape le plus petit élément de la partie non triée puis en l’échangeant avec le premier élément de la partie non triée comme sur les schémas suivants. element minimum partie non triee partie triee Y ........ partie triee X ..... X ........ Y ..... partie non triee partie non triee 2.1 L’algorithme Q2.1 . Triez à la main le tableau t = [4; 5; 2; 3; 1] en suivant le principe du tri par sélection et en donnant le tableau après chaque modification. Q2.2 . Ecrivez en pseudo-code l’algorithme du tri par sélection. 2 2.2 Complexité Q2.3 . Identifiez un pire et un meilleur cas éventuels pour le tri par sélection. Q2.4 . Combien de comparaisons entre éléments du tableau sont effectuées dans le pire et le meilleur cas pour trier un tableau de taille n ? Q2.5 . Donnez l’ordre de grandeur asymptotique du nombre de comparaisons effectuées. 2.3 Preuve informelle d’algorithme Q2.6 . Quelle propriété sur le tableau reste vraie à chaque étape ? Q2.7 . L’élément qui est placé au cours d’une étape du tri a une propriété particulière par rapport aux éléments de la partie triée et aussi de la partie non triée, quelle est elle ? Q2.8 . Donnez un invariant qui permet de montrer que l’élément choisi a une étape est bien celui qui possède la propriété trouvée précédement. Q2.9 . A partir des observations précédentes, prouvez que l’algorithme du tri par sélection est bien un algorithme de tri. 3. Tri par insertion Comme pour le tri par sélection, au cours du tri par insertion une partie du tableau est triée et les éléments non encore triés sont ajoutés un par un. La différence entre les deux réside dans la manière d’ajouter un nouvel élément à la partie triée. Dans le tri par insertion c’est l’élément non trié de plus petit indice et pas celui de valeur minimum qui est ajouté. Il est inséré à sa place dans la partie triée ce qui peut nécessiter de décaler une partie des éléments triés pour lui faire une place comme indiqué sur le schéma suivant. partie triee partie triee element a inserer 1 4 5 3 2 1 3 4 5 2 decalage partie non triee partie non triee 3.1 L’algorithme Q3.1 . Testez l’algorithme du tri par insertion sur le tableau t = [4; 5; 2; 3; 1]. Q3.2 . Ecrivez en pseudo-code une première version de l’algorithme du tri par insertion. Dans cette version la place du nouvel élément est recherchée puis ensuite le décalage d’une partie du tableau est effectué. Q3.3 . Ecrivez une seconde version du tri dans laquelle les deux opérations de recherche et décalage sont effectuées en même temps (un seul parcours du tableau). 3 3.2 Complexité Q3.4 . Identifiez un pire et un meilleur cas pour vos deux versions du tri par insertion. Q3.5 . Combien de comparaisons entre éléments du tableau sont effectuées dans le pire et le meilleur cas pour trier un tableau de taille n avec chacune des versions ? Q3.6 . Donnez l’ordre de grandeur asymptotique du nombre de comparaisons effectuées. 3.3 Preuve informelle d’algorithme On ne s’interesse ici qu’à la version avec décalage et recherche de la position simultanés. Q3.7 . Proposez un invariant de boucle pour l’insertion d’un élément dans la partie triée. Q3.8 . Proposez un invariant concernant l’insertion successive de tous les éléments dans la partie triée. Q3.9 . A partir des observations précédentes expliquez pourquoi votre version du tri par insertion est bien un algorithme de tri. Q3.10 . Expliquez pourquoi votre algorithme termine toujours. 4