• Aucun résultat trouvé

DUT Info Structures de donn´ ees et algorithmes fondamentaux 2020–2021

N/A
N/A
Protected

Academic year: 2022

Partager "DUT Info Structures de donn´ ees et algorithmes fondamentaux 2020–2021"

Copied!
3
0
0

Texte intégral

(1)

DUT Info Structures de donn´ ees et algorithmes fondamentaux 2020–2021

TP 1 - Complexit´ e

L’objectif de ce TP est de comparer les performances de divers algorithmes en th´ eorie et en pratique dans des cas simples. Pour ce faire, outre les complexit´ es, il faut ´ egalement tester les programmes sur des donn´ ees suffisamment grandes. Prenez garde cependant ` a commencer par de petites valeurs, pour d´ etecter d’une part ` a partir d’o` u on commence ` a observer des diff´ erences, et pour ´ eviter d’autre part de planter votre machine.

Pr´ erequis: R´ ecup´ erez sur la page du cours le fichier complexite_matplotlib.py.

Ce fichier contient une fonction tracer(nom_fichier, *listes_et_titres), que vous utiliserez tout au long du TP et que vous rendrez une fois compl´ et´ e apr` es l’avoir renomm´ e.

Cette fonction prend en param` etres un nom de fichier, des listes de donn´ ees et des titres (sans caract` eres sp´ eciaux (’, “, ...)), et a pour effet de:

1. tracer

1

un graphique comportant une courbe par jeu de donn´ ees, en associant ` a chaque courbe le titre qui suit les donn´ ees;

2. sauver ce graphique sous la forme d’une image nomm´ ee nom_fichier.png dans le r´ epertoire contenant complexite.py.

Le graphique ci-dessous, par exemple, a ´ et´ e produit ` a l’aide de l’instruction:

tracer("essai", [0, 1, 4, 9, 16, 25, 36, 49, 64, 81], "x^2", [0, 1, 8, 27, 64, 125, 216, 343, 512, 729], "x^3")

1

Cette fonction utilise le module matplotlib, il faut donc veiller ` a l’installer si vous travaillez sur une autre machine que celles de l’IUT.

Page 1 / 3

(2)

DUT Info Structures de donn´ ees et algorithmes fondamentaux 2020–2021 Exercice 1. Op´ erations sur les listes

1. ´ Ecrivez deux fonctions range_append(n) et range_insert(n), qui renvoient toutes deux la liste [1, 2, ..., n] mais construite diff´ eremment: range_append(n) ajoutera les nombres dans l’ordre croissant en fin de liste, et range_insert(n) ajoutera les nombres de mani` ere d´ ecroissante en d´ ebut de liste. D’apr` es vous, quelle fonction s’ex´ ecutera le plus rapidement?

2. ´ Ecrivez un programme utilisant la fonction tracer pour produire un graphique comparant la croissance du temps d’ex´ ecution de ces deux fonctions sur base de la croissance de n. On effectuera un appel ` a chacune des deux fonctions pour chaque valeur de n jusqu’` a une certaine borne fix´ ee (par exemple 1 000).

3. Les r´ esultats obtenus correspondent-ils ` a vos attentes? Justifiez votre r´ eponse en calculant la complexit´ e des deux fonctions.

4. ´ Ecrivez deux fonctions range_plus_fin(n) et range_plus_debut(n), qui ren- voient toutes deux la liste [1, 2, ..., n] construite en utilisant la concat´ enation de listes (le +): range_plus_fin(n) ajoutera les nombres dans l’ordre croissant en fin de liste, tandis que range_plus_debut(n) ajoutera les nombres de mani` ere d´ ecroissante en d´ ebut de liste. D’apr` es vous, quelle fonction s’ex´ ecutera le plus rapidement? Attention: n’utilisez pas la notation raccourcie lst += [i]!

5. Ajoutez ` a votre programme ce qu’il faut pour produire un graphique comparant la croissance du temps d’ex´ ecution des quatres fonctions pr´ ec´ edentes.

6. Les r´ esultats obtenus correspondent-ils ` a vos attentes? Justifiez votre r´ eponse en calculant la complexit´ e des deux derni` eres fonctions.

Exercice 2. Temps d’ex´ ecution des op´ erations basiques

Les op´ erations arithm´ etiques consomment plus ou moins de temps en Python selon leur type et celui de leurs op´ erandes.

1. ´ Ecrivez trois fonctions additions(n), divisions(n) et multiplications(n), qui renvoient respectivement la somme, le quotient et le produit de n r´ eels al´ eatoires non nuls (g´ en´ er´ es ` a l’aide de la fonction random() du module random). Quelle est la complexit´ e de chacune de ces fonctions?

2. ´ Ecrivez un programme utilisant la fonction tracer pour produire un graphique comparant le temps d’ex´ ecution de n additions, divisions et multiplications. Il est recommand´ e de commencer les tests avec des valeurs de n relativement petites (100, 200, . . .), et d’augmenter progressivement ces valeurs.

3. Que peut-on dire des courbes r´ esultantes? En particulier, correspondent-elles bien

`

a vos estimations th´ eoriques?

4. ´ Ecrivez trois fonctions que vous appellerez respectivement additions_int(n, b), divisions_int(n, b) et multiplications_int(n, b), analogues aux trois fonc- tions ci-dessus mais effectuant cette fois-ci leurs op´ erations sur des entiers al´ eatoires entre 1 et b (g´ en´ er´ es ` a l’aide de la fonction randint()). Quelle est la complexit´ e de chacune de ces fonctions?

Page 2 / 3

(3)

DUT Info Structures de donn´ ees et algorithmes fondamentaux 2020–2021 5. Compl´ etez votre programme pour qu’il utilise la fonction tracer pour produire un graphique comparant le temps d’ex´ ecution de ces trois nouvelles fonctions, comme dans la question 2.

6. Compl´ etez votre programme pour qu’il compare, sur un mˆ eme graphique, le temps d’ex´ ecution des six fonctions que vous avez ´ ecrites. Remarquez-vous des diff´ erences avec les temps d’ex´ ecution des fonctions traitant des r´ eels? Comment les expliquez- vous?

Exercice 3. Nombres premiers

Pour rappel, un nombre naturel est premier s’il poss` ede exactement deux diviseurs, ` a savoir 1 et lui-mˆ eme (donc 0 et 1 ne sont pas premiers, mais 2 oui). La page suivante:

http://primes.utm.edu/nthprime/ recense quelques-uns de ces nombres premiers.

1. ´ Ecrivez une fonction premier1(n) renvoyant True si le naturel n donn´ e est premier et False sinon, en cherchant un diviseur entre 2 et n − 1.

2. On peut am´ eliorer l’algorithme pr´ ec´ edent en remarquant que le seul nombre premier pair est 2, et en ne cherchant donc que les diviseurs impairs de n. Impl´ ementez cette am´ elioration dans une autre fonction premier2(n).

3. Une autre am´ elioration, moins ´ evidente, se base sur le fait que si un naturel n peut s’exprimer comme le produit des nombres a et b, alors min(a, b) ≤ √

n (en effet, si les deux facteurs ´ etaient sup´ erieurs ` a √

n, alors leur produit serait sup´ erieur ` a n).

(a) int´ egrez cette am´ elioration ` a la fonction premier1(n) dans une nouvelle fonc- tion premier3(n);

(b) int´ egrez cette am´ elioration ` a la fonction premier2(n) dans une nouvelle fonc- tion premier4(n).

4. Compl´ etez votre programme afin qu’il utilise la fonction tracer pour produire un graphique comparant les temps totaux d’ex´ ecution de vos fonctions, pour des valeurs croissantes du nombre k de bits dans les entiers g´ en´ er´ es. Le nombre p d’ex´ ecutions sera le mˆ eme pour chaque valeur de k. Pour obtenir un entier al´ eatoire sur k (≥ 1) bits, on utilise la fonction getrandbits(k) du module random.

Afin d’obtenir des graphiques interpr´ etables, on vous recommande de ne pas d´ epas- ser 80 pour p et 16 pour k.

5. Constatez-vous des diff´ erences dans le temps d’ex´ ecution de ces fonctions? Dans quels cas, et ` a partir de quelles valeurs?

6. Donnez la complexit´ e de chacune des fonctions impl´ ement´ ees. Les r´ esultats que vous obtenez en pratique vous semblent-ils coh´ erents par rapport ` a la th´ eorie?

7. Quel est le cas qui prendra le plus de temps ` a v´ erifier?

8. Faites quelques tests en ne comparant que premier3 et premier4. Obtenez-vous des diff´ erences frappantes?

Page 3 / 3

Références

Documents relatifs

Compare pages obtained by probing with the error page (by clustering along the DOM tree structure of the pages), to distinguish error pages and result pages.. Confirm the annotation

tail pointe vers le dernier ´el´ement de la liste Le dernier ´el´ement poss`ede un pointeur x.next vide (not´e NIL) Doublement li´ee : Le premier ´el´ement poss`ede un pointeur

Les valeurs contenues dans la pile sont retenues dans une liste li´ee. L’op´eration push place la valeur en tˆete

Soyez toujours le plus pr´ ecis possible dans le choix de votre notation (Ω, O ou Θ) et justifiez votre r´ eponse...

(c) Soit un tableau d’entiers quelconques, on cherche ` a ´ ecrire un algorithme permettant d’afficher (dans un ordre quelconque) les doublons dans ce tableau...

Supposons que vous connaissiez les taux d’int´ erˆ et pour les 10 prochaines ann´ ees et que vous ne placiez votre argent que sur un seul fonds ` a la fois.. A la fin de chaque ann´

(c) Donnez la fonction d’insertion d’un nouveau nœud z dans l’arbre ( Tree-insert (T, z)), en la modifiant de mani` ere ` a ce qu’elle maintienne un attribut t.size ` a chaque

Ecrire en Java la gestion d’un tas, repr´esent´e par un tableau : cr´eer, ins´erer, minimum, supprimer (le minimum), modifier une valeur.. Vous programmerez ceci en TP, et