DUT Info Structures de donn´ ees et algorithmes fondamentaux 2020–2021 TP 2 - Complexit´ e et it´ erables
L’objectif de ce TP est de d´ eterminer quand il est pr´ ef´ erable de trouver un algorithme efficace plutˆ ot que de recourir syst´ ematiquement ` a ce que Python a ` a offrir, et quand il est pr´ ef´ erable d’utiliser ce que Python propose plutˆ ot que de programmer nos propres fonctions.
Pour ce faire, on construit comme dans le TP 1 des graphiques donnant la croissance du temps d’ex´ ecution des m´ ethodes concern´ ees en fonction de la croissance de la taille des donn´ ees, en prenant bien soin cette fois-ci d’effectuer des moyennes. Le programme r´ ealis´ e doit produire les graphiques demand´ es sans la moindre interaction avec l’utilisateur.
Exercice 1. ´ Enum´ eration
Le but de cet exercice est de voir dans quelles situations il est avantageux d’utiliser les m´ ethodes disponibles en Python.
1. ´ Ecrivez une fonction liste_aleatoire_naturels(n, maximum) qui renvoie une liste al´ ea- toire de n naturels compris entre 0 et maximum.
2. ´ Ecrivez une fonction enumerer_1(liste), qui prend en param` etre une liste de naturels et renvoie une autre liste contenant en case i le nombre de fois que i apparaˆıt dans la liste.
Par exemple:
1
>>> enumerer_1([3, 1, 4, 5, 16, 2, 1, 5, 3])
2
[0, 2, 1, 2, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
Utilisez la m´ ethode count(k) des listes pour obtenir le nombre d’occurrences de k (c’est-
`
a-dire le nombre de fois que k apparaˆıt) dans la liste.
3. Une autre m´ ethode pour compter les ´ el´ ements d’une liste consiste ` a parcourir les ´ el´ ements de la liste un ` a un et ` a incr´ ementer le compteur correspondant dans la liste d’occurrences.
Ecrivez une fonction ´ enumerer_2(liste) impl´ ementant cette approche. A votre avis, ` quelle fonction sera la plus rapide? Justifiez votre r´ eponse en donnant les complexit´ es des deux fonctions.
4. V´ erifiez vos r´ eponses en produisant un graphique ` a l’aide de la fonction tracer du TP 1, dans lequel vous comparerez les temps d’ex´ ecutions moyens de vos fonctions. Pour ne pas devoir attendre trop longtemps les r´ esultats, ´ evitez de d´ epasser 100 ` a la fois pour la taille maximum d’une liste, pour le nombre d’ex´ ecutions, et pour la taille maximum d’un entier.
Exercice 2. Insertions tri´ ees
Comme on le verra plus loin dans le cours, le fait qu’une liste est tri´ ee peut nous aider ` a ´ elaborer des algorithmes plus rapides. Dans cet exercice, on suppose qu’on re¸coit une liste tri´ ee et qu’il va falloir lui rajouter des ´ el´ ements tout en la maintenant tri´ ee.
1. ´ Ecrivez une fonction liste_aleatoire_triee qui renvoie une liste tri´ ee de n naturels choisis au hasard. Votre fonction doit ˆ etre en O(n), si l’on n´ eglige la complexit´ e de la fonction utilis´ ee pour g´ en´ erer un nombre al´ eatoire.
2. ´ Ecrivez une fonction insertion_triee_1(liste, element) qui impl´ emente la mani` ere na¨ıve de proc´ eder: un ajout du nouvel ´ el´ ement en fin de liste, suivi d’un appel ` a la m´ ethode sort().
3. On ne sait malheureusement pas comment fonctionne sort(), mais il y a fort ` a parier qu’on pourrait aller plus vite en ne d´ epla¸ cant que le nouvel ´ el´ ement jusqu’` a ce qu’il arrive en bonne place dans la liste plutˆ ot que de tout trier. Autrement dit:
Page 1 / 2
DUT Info Structures de donn´ ees et algorithmes fondamentaux 2020–2021 (a) apr` es avoir ajout´ e l’´ el´ ement en fin de liste, s’il est pr´ ec´ ed´ e d’un ´ el´ ement plus grand
que lui, on ´ echange ces deux ´ el´ ements; sinon, on sort de la fonction;
(b) on examine ensuite l’´ el´ ement en avant-derni` ere position, et on fait la mˆ eme chose;
(c) et ainsi de suite jusqu’` a ce qu’on arrive au d´ ebut de la liste.
Ecrivez une fonction ´ insertion_triee_2(liste, element) qui impl´ emente cette ap- proche.
4. Une troisi` eme fa¸ con de faire est de chercher l’endroit o` u l’insertion doit s’effectuer, puis d’ins´ erer l’´ el´ ement directement ` a cette position plutˆ ot que d’effectuer des ´ echanges. Impl´ e- mentez cette approche dans une troisi` eme fonction insertion_triee_3(liste, element).
Pour l’insertion proprement dite, utilisez la m´ ethode insert(position, element) des listes.
5. Comparez l’efficacit´ e des trois approches en produisant un graphique ` a l’aide de la fonction tracer du TP 1, dans lequel vous comparerez les temps d’ex´ ecutions moyens de vos fonctions. Pour ne pas devoir attendre trop longtemps les r´ esultats, ´ evitez de d´ epasser 1000 pour la taille maximum d’une liste, 50 pour le nombre d’ex´ ecutions et 100 pour la taille maximum d’un entier. Que constatez-vous, et comment l’expliquez-vous?
Exercice 3. Suppression des pairs
1. ´ Ecrivez une fonction supprimer_pairs_1(liste), qui supprime les ´ el´ ements pairs de la liste de naturels donn´ ee. La suppression doit se faire en place, c’est-` a-dire sans utiliser de liste auxiliaire: on examine chaque ´ el´ ement en partant du premier, et l’on effectue une suppression quand on tombe sur un ´ el´ ement pair. Quelle est la complexit´ e de votre fonction? Attention, vous aurez besoin d’une boucle while.
2. ´ Ecrivez une fonction supprimer_pairs_2(liste), qui supprime les ´ el´ ements pairs de la liste de naturels donn´ ee mais cette fois-ci en ayant recours ` a une liste auxiliaire qui ´ ecrasera la premi` ere. Pour remplacer la liste de d´ epart dans la fonction, on utilisera la syntaxe
1liste[:] = liste_auxiliaire . Quelle est la complexit´ e de votre fonction?
3. V´ erifiez vos r´ eponses en produisant un graphique ` a l’aide de la fonction tracer du TP 1, dans lequel vous comparerez les temps d’ex´ ecutions moyens de vos fonctions pour des listes al´ eatoires d’entiers. Pour ne pas devoir attendre trop longtemps les r´ esultats, ´ evitez de d´ epasser 1000 pour la taille maximum d’une liste, 50 pour le nombre d’ex´ ecutions, et 100 pour la taille maximum d’un entier.
4. ´ Ecrivez une fonction supprimer_pairs_3(liste), qui supprime les ´ el´ ements pairs de la liste de naturels donn´ ee exactement comme supprimer_pairs_1(liste) mais en partant cette fois-ci de la fin de la liste plutˆ ot que du d´ ebut. Quelle est la complexit´ e de votre fonction?
5. Modifiez votre programme pour qu’il g´ en` ere un graphique comparant les temps moyens d’ex´ ecutions de supprimer_pairs_1 et supprimer_pairs_3. Comment expliquez-vous les diff´ erences de performance?
1