Nicolas Gourmelon TP : épreuve terminale
11 mai 2012 Calculs Scientifique et Symbolique avancés
On vérifiera sur des exemples simples le bon fonctionnement de chaque algorithme.
Exercice 1 : Arbres binaires
On définit sous maple récursivement un arbre binaire réel de la façon suivante :
- l’arbre binaire vide est la liste vide [],
- un arbre binaire non vide est une liste [α, g, d],
αRest la valeur à la racine de l’arbre, gest le fils gauche et dest le fils droit. Les feuilles
d’un l’arbre Asont les sous-arbre de la forme
[α, [],[]] .
La profondeur d’un noeud est la distance d’un noeud à la racine (la racine étant de profondeur
0). La profondeur d’un arbre est la profondeur maximale de ses feuilles (donc de ses noeuds).
1. Ecrire une procédure qui à un arbre renvoie sa profondeur.
2. Un binaire est dit complet si toutes les feuilles sont de profondeur pou p1. Ecrire un
algorithme qui détermine si un arbre binaire est complet ou pas.
Lorsqu’un arbre binaire est complet, il est pratique de représenter l’arbre sous la forme de la liste
des valeurs de ses noeuds [x1, ..., xn], où x1est la racine et où x2ket x2k+1 sont respectivement
le fils gauche et le fils droit de xk, pour tout k>1tel que 2k+ 1 6n.
3. Ecrire une pocédure qui à un arbre binaire complet présenté de la première manière renvoie
un arbre binaire présenté de la seconde. Ecrire une procédure qui fait la traduction inverse.
Exercice 2 : Tri par tas
Dans la suite, les arbres binaires complets seront présentés sous la forme d’une liste [x1, ..., xn]de
réels (cf. exercice 2). Un tas est un arbre binaire complet tel que pour tout noeud anon-racine,
on a a6p(a), où p(a)est le père de a.
1. Ecrire un algorithme qui vérifie qu’un arbre binaire est un tas.
2. Pour ajouter un élément xn+1 à un tas [x1, ..., xn], on considère l’arbre binaire complet
[x1, ..., xn, xn+1]. A priori ce n’est pas un tas, car xn+1 peut être plus grand que son père. Ecrire
une procédure ajout qui, en faisant remonter le nouvel élément xn+1 dans l’arbre binaire ainsi
obtenu, renvoie à un élément xn+1 et à un tas [x1, ..., xn]un nouveau tas dont les noeuds sont
x1, ..., xn, xn+1.
3. On veut recréer un tas à partir de la liste [x1, ..., xn]dont on a enlevé le plus grand élément
x1. On considère l’arbre binaire complet [xn, x2, x3, ..., xn1]. On fait alors redescendre xnà
l’intérieur de l’arbre binaire de la façon suivante : si xnest plus grand que son fils gauche et son
fils droit, alors l’arbre est un tas et c’est terminé, sinon on échange xnavec l’aîné de ses fils. Puis
on répète le procédé.
Ecrire une procédure retrait qui à un tas [x1, ..., xn]renvoie un tas dont les noeuds sont x2, ..., xn.
Le tri par tas d’une liste [x1, ..., xn]s’effectue en deux temps de la façon suivante :
1
on crée un tas Tà partir de tous les éléments de cette liste, par ajouts successifs.
puis on retire le plus grand élément du tas T, on recrée un tas T1de ce qu’il reste, et on
recommence jusqu’à épuisement du tas.
Cette deuxième étape permet d’extraire un à un, par ordre décroissant, les éléments du tas T.
4. Ecrire un algorithme de tri par tas. Estimer la complexité maximale de cet algorithme.
Exercice 3 : Comparaison d’algorithmes
1. Coder l’algorithme de tri rapide (on choisit pour pivot le premier élément de la liste). Rappeler
sans preuve sa complexité moyenne. Quelle complexité obtient-on dans le pire des cas ?
Nous appelons liste fortement triée de longueur n, toute liste obtenue par [n]transpositions
(aléatoires) sur la liste des npremiers entiers, où [a]est la partie entière de a.
2. Comparer l’efficacité du tri rapide et du tri par tas :
Sur une liste de 10000 nombres entiers à valeurs dans [0,10000] aléatoirement engendrée.
Sur une liste fortement triée de longueur 10000.
2
1 / 2 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !