L3-INFO Algorithmique
Quick 2 – 25 novembre 2014 – durée 1 h
Les documents et les téléphones (incluant smartphone, tablettes,... tout ce qui contient une in-
terface réseau) interdits.
Les calculettes sont autorisées
Seuls les dictionnaires pour les personnes de langue étrangère sont autorisés.
1 Codage
Soit un arbre de codage binaire A.
Démontrer que si An’est pas complet (si un de ses nœuds internes n’est pas binaire), alors
Ane représente pas un codage optimal (c’est-à-dire qu’il existe un codage plus court).
2 Rotation dans un ABR
On s’intéresse à l’opération de rotation autour d’un nœud, utilisée notamment pour rééquili-
brer les ABRs. La figure ci-dessous décrit l’effet des opérations de rotation à gauche et à droite
autour du nœud x:
x
y x
y
α
βγ
γ
βα
RotationGauche
RotationDroite
1. Dessiner l’arbre ci-dessous après une rotation à gauche, puis une rotation à droite autour de
sa racine.
12
5
7
612
20
15 22
Quick 2
2. On donne ci-dessous la définition en C d’un type Arbre, implémenté par une structure
chaînée :
typedef Noeud;
typedef struct {
int cle;
Noeud * fgauche;
Noeud * fdroit;
Noeud * parent;
} Noeud;
typedef Noeud * Arbre;
Dans cette structure chaque nœud comporte un pointeur sur le nœud parent (NULL pour la
racine). Une structure de type Arbre doit donc vérifier, pour tout Noeud * N qui la compose :
N->fgauche 6=NULL N->fgauche->parent = N
N->fdroit 6=NULL N->fdroit->parent = N
Donner une réalisation de la procédure RotationGauche, réalisant une rotation à gauche
autour de la racine de l’arbre fourni en paramètre :
void RotationGauche(Arbre * A);
3 Ancêtre commun
On manipule dans tout cet exercice un arbre binaire tels que ceux vus en cours, muni des
opérations usuelles du type abstrait Arbre : EstVide, Clé, FilsGauche et FilsDroit.
On suppose que chaque nœud de cet arbre est muni d’une clé entière, et que les clés des
nœuds sont toutes distinctes deux à deux.
L’obectif de cet exercice est le suivant : étant donnés deux nœuds xet y(identifiés par leurs
clés), trouver un ancêtre commun àxet y, autrement dit un nœud nqui est la racine d’un
sous-arbre contenant xet y.
En particulier, on s’intéressera au plus bas ancêtre commun (en abrégé PBAC) à xet y,
autrement dit le seul nœud de l’arbre :
qui est un ancêtre commun à xet y
mais dont aucun fils n’est un ancêtre commun à xet y.
Par exemple, dans l’arbre ci-contre :
16 est un ancêtre commun à 8 et 7 ;
2 n’est pas un de leurs ancêtres communs ;
6 est leur PBAC.
4
15 9
16
6 19
11
1 78
5
2
On note nle nombre de nœuds de l’arbre et hsa hauteur, en particulier pour les calculs de
complexité.
Algorithmique 25/11/2014 2/ 3
Quick 2
3.1 Algorithme naïf
1. Écrire un algorithme de recherche du PBAC basé sur un parcours récursif de l’arbre.
Vous préciserez notamment de quel parcours il s’agit et vous justifierez ce choix.
Votre algorithme devra renvoyer un triplet bool ×bool ×noeud :
le premier booléen détermine si xest présent ou non dans le sous-arbre parcouru
le second booléen détermine si yest présent ou non dans le sous-arbre parcouru
la clé renvoyée est le PBAC de xet de y, si celui-ci a été trouvé, sinon une valeur
spéciale .
2. Déterminer la complexité au pire de cet algorithme.
3.2 Cas particulier
On suppose pour ce paragraphe que l’arbre considéré est un ABR.
1. Écrire un algorithme de recherche du PBAC qui profite de cette particularité pour rendre
la recherche plus efficace.
2. Déterminer la complexité au pire de cet algorithme.
3.3 Bonus (uniquement si vous avez traité tout le reste) : précalcul
L’idée pour améliorer cet algorithme est d’effectuer un prétraitement : on exécute une fois
pour toutes un premier calcul (éventuellement coûteux) sur tout l’arbre, pour qu’ensuite chaque
appel à l’opération PBAC soit efficace.
Dans ce cas particulier, le prétraitement peut consister à calculer, pour chaque nœud de
l’arbre, quel est son nœud père (et à stocker cette information sous une forme accessible en
temps constant : tableau, pointeur...).
1. Écrire un algorithme permettant d’affecter à chaque nœud nl’information père(n).
2. Déterminer la complexité au pire de cet algorithme.
3. Écrire un algorithme de calcul du PBAC qui exploite cette nouvelle information, et dé-
terminer sa complexité au pire.
On suppose pour cette question que les nœuds xet ysont donnés, et qu’il n’y a donc
pas besoin de parcourir l’arbre pour les retrouver.
Algorithmique 25/11/2014 3/ 3
1 / 3 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 !