Académique Documents
Professionnel Documents
Culture Documents
1 - Graphe
. Réécrire l'algorithme de parcours d'un graphe en profondeur (vu en cours) en utilisant une version
non récursive faisant appel à une pile.
. Ecrire une fonction récursive qui permet de calculer le nombre de feuilles d'un arbre binaire
// on écrit d'abord une fonction pour vérifier si un nœud est une feuille ou pas
boolean feuille(arbre a)
{
return (a->gauche==null) and (a->droit==null)
}
. Ecrire une fonction récursive qui permet de calculer la hauteur d'un arbre binaire.
// on aura besoin de la fonction maximum
int maximum(int a, int b)
{
if (a>=b) return a else return b ;
}
Int hauteur (arbre a)
{
if (a==null) return 0
else if feuille(a) return 0
else return 1+ maximum(hauteur(a->gauche), hauteur(a->droit))
}
. Montrer par une démonstration par récurrence que la hauteur h d'un arbre binaire complet est de :
h=log2(n) (1) où n est le nombre de feuilles de l'arbre.
. Utiliser la procédure d'insertion dans un arbre binaire de recherche afin de trier un vecteur par
ordre croissant.
L'idée de cette méthode consiste à insérer au fur et mesure les éléments du vecteur à trier dans un
arbre binaire de recherche (voir algorithme d'insertion vu en cours). Comme l'arbre binaire de
recherche est lui même trié, il suffit de choisir le bon parcours et copier les éléments ensuite dans
le vecteur. Le bon parcours pour avoir les éléments de l'arbre triés dans le vecteur serait de le
parcourir en Infixé suivant l'algorithme suivant :
parcours infixe (arbre a)
{
if (a!=null)
{
infixe(a->gauche)
traiter(a>element) // traitement quelconque sur l'élément du nœud courant.
infixe(a->droit)
}
}
Application pour écrire une méthode de tri d'un vecteur
. Ecrire une fonction récursive qui recherche la plus petit valeur d’un arbre binaire de recherche
Le plus petit élément dans un arbre binaire de recherche se trouve soit sur la feuille la plus à
gauche soit sur un nœud en fin de filiation à gauche sans sous arbre gauche (raisonnement
analogue : le maximum se trouve soit sur une feuille la plus à droite ou bien un nœud en fin de
filiation à droite sans sous arbre droit).
. Combien de nœuds différents (racine et feuilles comprises) doit-on parcourir dans l’index de
l’arbre_B d’ordre1 pour répondre à une requête qui cherche des articles dont la clé appartient à
l’intervalle [2,12] ?
Si l'on applique l'algorithme de recherche dans l'arbre_B ci dessus d'une clé c dans l'intervalle
[2,12] on devrait trouver : nb_consultés=8 noeuds
4 - Les arbres AVL
. L'arbre ci dessous est-il un arbre AVL ? Si oui, expliquez pourquoi, si non, transformez le
en arbre AVL en effectuant des rotations que vous expliquerez.
15
10 25
5 12 30
Voici l'arbre ci dessus auquel on a rajouté les étiquettes aux nœuds correspondant à la différence
des hauteurs entre les sous arbres gauche et droit.
On remarque que toutes étiquettes possèdent une valeur absolue < 2 donc l'arbre est équilibré au
sens AVL.
. L'arbre ci dessous est-il un arbre AVL ? Si oui, expliquez pourquoi, si non, transformez le
en arbre AVL en effectuant des rotations que vous expliquerez.
9
7 10
4 8
Voici l'arbre ci dessus auquel on a rajouté les étiquettes aux nœuds correspondant à la différence
des hauteurs entre les sous arbres gauche et droit.
Comme on peut le constater le nœud 9 viole la contrainte d'équilibrage au sens AVL (car son
étiquette vaut 2). Donc l'arbre n'est pas équilibré (déséquilibré à gauche).
Pour l'équilibrer, on va appliquer l'algorithme AVL (vu en cours). Dans ce cas de figure
l'algorithme AVL nous dit d'effectuer au niveau du noeud 9 une rotation Droite (RD). Ce qui donne
l'arbre équilibré suivant :
. Insérez dans l'arbre proposé ci dessus les valeurs ci-dessous. Chaque insertion fera l'objet
d'un schéma commenté avant et après ré-équilibrage de l'arbre par rotations.
40 13 14 11 1
Je vous laisse le soin de terminer l'exercice en insérant les valeurs ci dessus sur le
même principe....
5.1 - Considérer la fonction de hachage h(c) = c mod 13 et une table de hachage avec m = 13
adresses.
1. Donner l'état de la table après insertion des clés 26,37,24,30, 11 dans la table de hachage en
utilisant la résolution des collisions par adressage ouvert avec la fonction
hi(c) = (h(c)+i) mod m.
2. Rajouter maintenant les clés 1,2,3,4,5,6,7,8,9,10. Quel problème rencontrez-vous ? Quelles
solutions proposez-vous ? Donner l'état de la table de Hachage.
La table de hachage se remplit très vide et donc la taille n’est pas suffisante.
Dans ce cas, il y a deux solutions :
. On agrandit la taille de la table de hachage. Dans ce cas là, tous les éléments doivent être insérés
de nouveau. Il est courant de doubler la taille de la table de hachage
. On utilise la résolution des collision par chainage externe (les éléments ayant la même valeur de
fonction de hachage sont liés par une liste chainée).
Filtre de Bloom
1 1 1 1 1 1 1 0 1 1
0 1 2 3 4 5 6 7 8 9
. Donner le taux de faux positifs dans le cas de la recherche des clés suivantes
21, 17, 27, 23, 36, 18, 3, 22, 15, 25, 8
On constate que les éléments 18 et 22 figurant sur cette liste ne font pas partie des éléments insérés
dans la base de données (ils ne font pas partie de la liste initiale).
Pourtant :
Si on calcule : h0(18)=1 et h1(18)=1 et h3(18)=1 donc il y a collision avec un élément déjà inséré :
donc 18 est un faut positif
Si on calcule : h0(22)=1 et h1(22)=1 et h3(22)=1 donc il y a collision avec un élément déjà inséré :
donc 22 et un faux positif.