2012

publicité
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],
où α ∈ R est la valeur à la racine de l’arbre, g est le fils gauche et d est le fils droit. Les feuilles
d’un l’arbre A sont 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.
Un binaire est dit complet si toutes les feuilles sont de profondeur p ou p − 1. Ecrire un
algorithme qui détermine si un arbre binaire est complet ou pas.
2.
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ù x1 est la racine et où x2k et x2k+1 sont respectivement
le fils gauche et le fils droit de xk , pour tout k > 1 tel que 2k + 1 6 n.
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.
3.
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 a non-racine,
on a a 6 p(a), où p(a) est le père de a.
1.
Ecrire un algorithme qui vérifie qu’un arbre binaire est un tas.
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 .
2.
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 , ..., xn−1 ]. On fait alors redescendre xn à
l’intérieur de l’arbre binaire de la façon suivante : si xn est plus grand que son fils gauche et son
fils droit, alors l’arbre est un tas et c’est terminé, sinon on échange xn avec l’aîné de ses fils. Puis
on répète le procédé.
3.
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 T1 de 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
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 ?
1.
√
Nous appelons liste fortement triée de longueur n, toute liste obtenue par [ n] transpositions
(aléatoires) sur la liste des n premiers entiers, où [a] est la partie entière de a.
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.
2
Téléchargement