• Aucun résultat trouvé

Info commune TP 2 Judicaël Courant 2 novembre 2015

N/A
N/A
Protected

Academic year: 2022

Partager "Info commune TP 2 Judicaël Courant 2 novembre 2015"

Copied!
2
0
0

Texte intégral

(1)

1

Info commune TP 2

Judicaël Courant 2 novembre 2015

1 Tri fusion

Le but de cet exercice est d’écrire un programme triant un tableau. On s’interdit donc d’utiliser les fonctions de Python permettant de trier un tableau (et notammentsorted).

Nous allons programmer un tri par fusion. Il s’agit d’un algorithme de tri récursif simple et effi- cace. C’est d’ailleurs celui qui est utilisé par la fonctionsortedde Python (avec quelques petites améliorations).

Le principe en est le suivant : pour trier un tableau de longueur𝑛, il suffit de le couper en deux tableaux, de longueurs respectives⌊𝑛/2⌋et ⌈𝑛/2⌉, de trier récursivement ces deux tableaux puis de fusionner les deux tableaux triés pour obtenir une copie triée du tableau initial.

1.1 Fusion de deux tableaux triés

Écrire une fonction fusion(t1, t2) prenant en argument deux tableaux t1 et t2 de nombres supposés triés1de longueurs respectives 𝑛1 et𝑛2 et retournant un tableau ttrié de longueur𝑛 contenant les mêmes éléments quet1et t2. Plus précisément, pour tout nombre𝑥, si 𝑥apparaît exactement𝑘1 fois danst1et exactement𝑘2 fois dans t2(avec𝑘1 et 𝑘2 des entiers possiblement nuls), alors𝑥doit apparaître exactement𝑘1+ 𝑘2fois danst.

Vous ferez en sorte que le nombre de comparaisons effectuées parfusion(t1,t2)soit un𝑂(𝑛1+𝑛2).

On pourra pour cela utiliser la méthode suivante : on prendra un indicei1dans le tableaut1et un indicei2dans le tableaut2(initialement tous les deux nuls), on ajoute le plus petit des éléments t1[i1]ett2[i2]à tet on incrémente i1oui2en conséquence.

Assurez-vous que votre fonction est correcte (cherchez des invariants). Testez-la sur des cas très simples (un élément dans chaque tableau par exemple) avant de vous attaquer à des cas plus difficiles.

1.2 Programmation du tri

Programmer une fonction récursivetri_fusion(t)suivant l’algorithme du tri fusion. On pensera évidemment à s’interroger sur le(s) cas de base, en le(s) prenant aussi simple(s) que possible.

Démontrez que votre fonction termine et est correcte.

1.3 Test

Testeztri_fusion(t)sur des tableaux à0, 1,2,3éléments.

Écrire une fonctionest_trie(t) retournant le booléenTrue si le tableaut est trié etFalse s’il ne l’est pas.

Vérifiez queest_trie([1, 2, 1])etest_trie([2,1,2]) retournentFalse, puis exécutez 1 from math import sin

2 K = 1000 3 M = K**2

4 t = [sin(i) for i in range(M)]

1 Ce sera une précondition de la fonction. Puisqu’on les suppose triés, il est inutile que la fonction vérifie qu’ils le sont.

(2)

2

et vérifiez queest_trie(t) retourne False alors queest_trie(tri_fusion(t)) retourne True et termine en un temps raisonnable (quelques secondes).

1.4 Complexité

Soit𝑘un entier et𝑡un tableau de longueur2u�contenant des nombres. Quel est le nombre de compa- raisons effectuées partri_fusion(t)? (on se contentera de donner une estimation asymptotique en fonction de𝑘).

Quelle est au plus la profondeur des appels récursifs lors de l’exécution detri_fusion? Quel est la taille mémoire alors utilisée ? (on se contentera de donner une estimation asymptotique en fonction de𝑘).

Donner une estimation asymptotique, en fonction de𝑛, du temps d’exécution et de la place mémoire requis pour calculer tri_fusion(t)où test un tableau de nombres de longueur 𝑛, où𝑛 est un entier non nul qui n’est pas nécessairement une puissance de2.

2 Drapeau Hollandais

Cet exercice a pour but de réaliser une fonction réorganisant les éléments d’une portion d’un tableau en suivant un certain critère.

Dans tout l’exercice, on considère un tableautet deux valeursbaset haut.

2.1 Partitionnement deux voies

On notevla valeur située danst[bas]avant l’exécution de l’algorithme. Cette valeur est appelée pivot.

On veut réorganiser, par échange de valeurs, la portion de tableau des éléments d’indices appar- tenant à [[𝚋𝚊𝚜, 𝚑𝚊𝚞𝚝[[ de façon à avoir la valeur v à un indice j du tableau, des valeurs toutes inférieures ou égales à v dans la portion d’indices appartenant à [[𝚋𝚊𝚜, 𝚓[[, et des valeurs toutes supérieures ou égales àvdans la portion d’indices appartenant à[[𝚓 + 𝟷, 𝚑𝚊𝚞𝚝[[.

Écrire une fonctionpartition(t, bas, haut)effectuant cette réorganisation. Votre fonction re- tournera la position du pivot à la fin de la réorganisation.

On change légèrement le problème : on veut maintenant prendre pour pivot la valeurvsituée à un indice arbitrairekappartenant à[[𝚋𝚊𝚜, 𝚑𝚊𝚞𝚝[[.

Écrire une fonction partition_pivot_arbitraire(t, bas, haut, k) effectuant la réorganisa- tion en prenantt[k]pour pivot. Note : Avec un peu d’astuce, cette fonction s’écrit en trois lignes.

2.2 Partionnement trois voies

On prend de nouveau pour valeur pivot la valeurvsituée danst[bas]. On veut toujours réorganiser la portion de tableau des éléments d’indices appartenant à[[𝚋𝚊𝚜, 𝚑𝚊𝚞𝚝[[mais cette fois, on veut faire en sorte qu’à la fin de l’exécution cette portion soit constituée de trois parties :

− une première partie, d’indices bas(inclus) ài(exclu), contenant les valeurs strictement infé- rieures àv;

− une deuxième partie, d’indicesi(inclus) àj(exclu), contenant les valeurs égales àv;

− une troisième partie, d’indicesj(inclus) àbas(exclu), contenant les valeurs strictement supé- rieures àv.

Écrire une fonctionpartition_trois_voies(t, bas, haut)effectuant cette réorganisation. Elle retournera le couple des valeurs(i, j).

Écrire une fonction partition_trois_voies_pivot_arbitraire(t, bas, haut, k) effectuant la réorganisation en prenantt[k]pour pivot.

Références

Documents relatifs

[r]

Dans certaines stations du métro parisien, on trouve de longs tapis roulants permettant aux usagers de gagner un peu de temps pendant leurs déplacements. Un usager

Appelons intérieur d’un triangle équilatéral T la partie intérieure du triangle qui a pour sommets les milieux des trois côtés de T.. Partant d’un triangle équilatéral grisé

Mêmes questions en remplaçant le quantificateur exis- tentiel par un quantificateur universel dans la défini- tion de L2. Exercice 2 Soit (Q, q 0 , F, δ) un automate sur un

Écrire une fonction coaccessibles : afd -> int list retournant la liste des états coaccessibles de l’automate qui lui est passé en argument. Q14 On dit qu’un automate est

Écrire une fonction inverse(s) prenant en argument la représentation d’une

Vous trouverez dans le fichier lance_tests.py les commandes permettant de générer les douze combinaisons possibles (quatre méthodes pour générer un tableau, trois fonctions de

Vous aurez besoin pour cela d’une structure de données pour garder la liste de tous les fichiers et réper- toires qu’il reste à explorer.. Vous utiliserez une pile à