• Aucun résultat trouvé

Le but de cet exercice est de voir dans quelles situations il est avantageux d’utiliser les m´ ethodes disponibles en Python.

N/A
N/A
Protected

Academic year: 2022

Partager "Le but de cet exercice est de voir dans quelles situations il est avantageux d’utiliser les m´ ethodes disponibles en Python."

Copied!
2
0
0

Texte intégral

(1)

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

(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

1

liste[:] = 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

Cette instruction sera expliqu´ ee plus tard dans le cours de programmation.

Page 2 / 2

Références

Documents relatifs

[r]

Avec la fonction random afficher un flottant al´ eatoire entre 0 et 1.. (2) D´ efinir une liste L de 100 nombres

Reproduire et compléter le tableau ci-dessous puis utiliser le pour répondre aux questions suivantes : Quel est le nombre d'objets minimum ( à l'objet près ) que l'entreprise

Déterminer le maximum de la fonction

[r]

En utilisant la fonction randint du module random, écrire une fonction Jeu qui prend en paramètre un nombre entier n stritement positif, simule n fois le tirage d’un dé

En utilisant la fonction randint du module random , écrire une fonction Jeu qui prend en paramètre un nombre entier n stritement positif, simule n fois le tirage d’un dé

La recherche d’un professeur (resp. d’un étudiant) doit se faire dynamiquement soit par son identifiant soit par une recherche dans la liste des professeurs (resp. dans la liste