• Aucun résultat trouvé

Judicaël Courant 2018-W40-4

N/A
N/A
Protected

Academic year: 2022

Partager "Judicaël Courant 2018-W40-4"

Copied!
2
0
0

Texte intégral

(1)

Lycée La Martinière Monplaisir

Informatique Commune 2eannée TP 2 : tris

TP 2 : tris

Judicaël Courant 2018-W40-4

Exercice 1

On veut étudier les performances de fonctions triant des tableaux.

Pour cela, vous téléchargerez les fichiers Python perf.py et perf_sorted.py ainsi que le fichieraffiche_perf.plot et vous les sauverez dans un répertoire dédié à ce TP.

Le fichierperf.pyest un module Python permettant de tester les performances d’une fonc- tion de tri. Comme pour n’importe quel autre module Python, vous pourrez (et devrez) l’utiliser sans le modifier. Il sera intéressant d’aller lire son contenu pour pouvoir répondre aux questions ci-dessous.

Le but de cet exercice est de tester la fonction prédéfiniesortedde Python. Cette fonction prend un tableauten argument et retourne un nouveau tableau, contenant les mêmes éléments quet(avec mêmes multiplicités), trié par ordre croissant.

C’est ce que fait très sommairement le fichierperf_sorted.py. Ouvrez ce fichier : Le premier appel à la fonctionbenchde Python note les temps de calculs de la fonctionsorted(t)sur des tableauxtde taillesnde plus en plus grandes, construits par la fonctiontableau_aleatoire(n).

Pour chaque essai elle écrit, dans le fichiersorted_aleatoire.dat, une ligne contenant le lo- garithme décimal de la taille du tableaun, puis un caractère espace, puis le logarithme décimal du temps d’exécutiont.

Le second appel àbenchfait de même, mais cette fois-ci les résultats sont écrits dans le fichier sorted_croissant.datet les tableaux sont construits par la fonctiontableau_croissant(n).

Exécutez le fichier perf_sorted.pyet vérifiez qu’il construit bien ces deux fichiers.

Une fois ces fichiers obtenus, vous pouvez les représenter graphiquement avec l’outilgnuplot (un outil utilisé par les physiciens depuis plus de trois décennies).

Dans un terminal, la commande gnuplot -p affiche_perf.plot va lire dans le fichieraffiche_perf.plot des commandes pour tracer les données : essayez !

Le contenu deaffiche_perf.plot peut être affiché et modifié avec n’importe quel éditeur de texte.

Modifier les fichiersperf_sorted.py etaffiche_perf.plot et exécutez-les de façon à tes- ter aussi les performances de la fonction sorted sur des tableaux décroissants ainsi que des tableaux «en triangle», ou des tableaux «denses» (ne contenant que des 0 et des 1 choisis de façon équiprobable). Que constatez-vous ?

Exercice 2 : Tri par insertion

Écrire une fonction tri_insertion(t) prenant un tableau t en argument et le triant (sans construire de nouveau tableau).

Pour cela, on pourra utiliser une fonction auxiliaireinsere(t, k)prenant en argument un tableautcomportant au moinskéléments et tel quet[0 :k] soit trié avant l’appel, et modifiant

Judicaël Courant - 2018-W40-4 1/2 Document sous licence Art Libre (http://artlibre.org)

(2)

Lycée La Martinière Monplaisir

Informatique Commune 2eannée TP 2 : tris

le tableautde façon à ce que ses éléments restent globalement inchangés mais quet[0 :k+ 1]

soit trié après l’appel.

Quelle est la complexité théorique de ce tri dans le cas le pire ? Le meilleur ?

En utilisant le module perf, étudier graphiquement les performances de cette fonction sur des tableaux aléatoires, des tableaux triés par ordre croissant, et des tableaux triés par ordre décroissant. Que constatez-vous ? Cela est-il conforme à ce qu’on peut attendre ?

NB : N’essayez pas de comparer les performances detri_insertionavec celles desorted.

La bataille serait trop inégale.

Exercice 3 : Tri fusion

Écrire une fonctionfusion(t1, t2)prenant en argument deux tableauxt1ett2supposés triés, de tailles respectivesn1 etn2 et retournant un tableauttrié, de taillen1+n2 et contenant les mêmes éléments quet1 ett2 (avec mêmes multiplicités). On écrira cette fonction itérativement avec une boucle définie (bouclefor).

Vous utiliserez des invariants de boucle pour vous assurer que votre fonction est correcte, ce qui ne doit pas non plus vous empêcher de tester extensivement votre fonction. En particulier, n’oubliez pas de tester notamment :

1. les cas où l’un des tableaux est vide (voire les deux) ;

2. les cas où tous les éléments det1 sont inférieurs à ceux de t2 et inversement.

Écrire une fonction tri_fusion(t) prenant en argument un tableau t et retournant un nouveau tableau, trié et contenant les mêmes éléments que t avec mêmes multiplicités. Le principe est le suivant : si trier t n’est pas trivial, on partage t en deux tableaux t1 et t2 de même taille environ, qu’on trie récursivement, ce qui donne des tableauxu1 etu2. On fusionne alors ces deux tableaux, pour obtenir un tableauu qu’il suffit de retourner.

Quelle est la complexité théorique de ce tri dans le cas le pire ? Le meilleur ?

Étudiez les performances de cette fonction en utilisant le module perf. Comparez à la complexité théorique et aux performances du tri par insertion.

Exercice 4 : Tri pivot

Le but de cet exercice est d’écrire une variant du tri pivot où le tableau initial n’est pas modifié.

Il ne s’agit donc pas d’un tri en place, contrairement au vrai tri par pivot. La variante étudiée ici est donc considérée comme naïve.

1. Écrire une fonction partitionne(t) prenant en argument un tableau t et retournant un triplet (v, t1, t2) oùv est la valeur de t[0],t1 le tableau des éléments det strictement inférieurs àv, ett2 le tableau des éléments det supérieurs ou égaux àv,t[0] excepté.

2. Écrire une fonctiontri_pivot(t) prenant en argument un tableau t et le triant par la méthode du tri pivot naïf : on partitionnetpour obtenir (v, t1, t2), on trie récursivement t1 ett2 pour obtenir respectivementu1 etu2, et on retourneu1+ [v] +u2.

3. Quelle est la complexité théorique de ce tri dans le cas le pire ? Le meilleur ? 4. Tester abondamment.

5. Testez les performances. Comparez au tri par insertion et au tri fusion.

Judicaël Courant - 2018-W40-4 2/2 Document sous licence Art Libre (http://artlibre.org)

Références

Documents relatifs

A si le tableau passé en argument est une suite d'entiers consécutifs B si le tableau passé en argument est trié en ordre croissant C si le tableau passé en argument est trié

[r]

Cela pose évidemment problème si le nœud père x est lui-même plein, auquel cas, il convient de le séparer en deux nouveaux nœuds x 1 et x 2 et, dans le grand-père, de remplacer x

On généralise cette notion aux ensembles de clauses (ou aux formes normales conjonctives si l’on préfère) : on dit qu’un atome apparaît positivement (négativement) dans un

[r]

[r]

Les trois biplans ont deux à deux une face commune, donc les trois couples de points analogues à (P', P' 7 ) ont deux à deux un point commun, c'est-à-dire que ces points P sont

Ecrire la fonction RechElt(N,Tab,Val) qui retourne le rang de la première occurence de la valeur réelle Val dans le tableau Tab (contenant N valeurs significatives), ou -1 si Val