Travail à rendre 1. Tri à bulles

publicité
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
Téléchargement