Exercice 1 : Arbres binaires de recherche (ABR)
🌐 Énoncé du problème / Étude de cas
Section titled “🌐 Énoncé du problème / Étude de cas”Les Arbres Binaires de Recherche (ABR) constituent une structure de données fondamentale en informatique pour implémenter des dictionnaires dynamiques. Dans le cadre de ce problème, nous nous intéressons à l’utilisation d’ABR pour indexer de grands volumes de métadonnées au sein d’un système de stockage distribué.
Soit le nombre de clés insérées dans l’ABR. Dans un contexte industriel (par exemple, l’indexation de blocs de données de taille sur des disques SSD NVMe), la profondeur de l’arbre a un impact direct sur la latence des requêtes de lecture. En effet, chaque nœud traversé lors d’une recherche correspond à une saut en mémoire ou à un accès disque si l’arbre ne tient pas entièrement en mémoire vive (RAM).
Cependant, le modèle classique de l’ABR souffre d’un écueil bien connu : si les données sont insérées de manière triée ou quasi-triée (cas fréquent pour des horodatages ou des identifiants séquentiels), l’arbre dégénère en une liste chaînée, menant à une complexité temporelle en pour la recherche, au lieu de en moyenne.
Le problème se propose d’étudier les propriétés statistiques des ABR construits à partir de permutations aléatoires uniformes, puis d’analyser les limites de ce modèle probabiliste face à des flux de données réels, souvent corrélés.
❓ Questions progressives
Section titled “❓ Questions progressives”Partie I : Définitions et invariants
Section titled “Partie I : Définitions et invariants”- (1) Rapponcer la définition inductive d’un arbre binaire de recherche étiqueté par des valeurs appartenant à un ensemble totalement ordonné.
- (2) Écrire en langage OCaml un type algébrique
'a abrreprésentant un ABR pouvant contenir des valeurs de type'a. - (3) Écrire une fonction
inserer : 'a -> 'a abr -> 'a abrqui insère une nouvelle clé dans un ABR en préservant l’invariant de recherche. On supposera les clés deux à deux distincts pour simplifier.
Partie II : Analyse probabiliste de la hauteur
Section titled “Partie II : Analyse probabiliste de la hauteur”On considère que les clés sont insérées dans un ABR initialement vide, selon une permutation aléatoire uniforme de l’ensemble .
- (4) Soit la hauteur de l’arbre (définie comme le nombre maximal de nœuds d’un chemin de la racine à une feuille). Établir heuristiquement, en comparant avec le tri rapide (quicksort), l’espérance de la hauteur lorsque .
- (5) Dans notre système de stockage, on fixe un seuil critique de tolérance de latence : la profondeur maximale ne doit pas excéder pour garantir un temps de réponse inférieur à (chaque niveau représentant un accès mémoire de ). En utilisant l’approximation avec , estimez la taille maximale de la base de données indexée avant que le modèle probabiliste ne devienne risqué.
Partie III : Analyse critique et ingénierie
Section titled “Partie III : Analyse critique et ingénierie”- (6) Esprit critique : Dans un scénario réel de journalisation (logs applicatifs), les clés insérées sont des horodatages (timestamps) à la milliseconde près, générés de manière croissante. Expliquez pourquoi l’hypothèse d’une permutation aléatoire uniforme tombe en défaut dans ce cas précis. Quel est l’impact concret sur la complexité spatiale et temporelle de l’ABR ?
- (7) Proposez une modification structurelle ou une alternative algorithmique standard étudiée en prépa (que l’on ne demande pas de coder) permettant de pallier cette limite industrielle, en justifiant brièvement son compromis espace/temps.
💡 Pistes & Indications
Section titled “💡 Pistes & Indications”- Q2 & Q3 : Pensez aux constructeurs du type
VideetNoeud(gauche, valeur, droit). L’insertion se fait par récursion structurelle en comparant la valeur à insérer avec la racine du nœud courant. - Q4 : Faites le parallèle entre le choix du pivot dans le quicksort et la racine de l’arbre ainsi que ses sous-arbres. Le nombre de comparaisons pour trier éléments par quicksort est lié à la profondeur moyenne des nœuds dans l’arbre de récursion.
- Q6 : Analysez la forme géométrique de l’arbre lorsque les données arrivent déjà triées. Quid de la pile d’exécution en cas de récursion sur un arbre dégénéré ?
📋 Corrigé détaillé et analyse des résultats
Section titled “📋 Corrigé détaillé et analyse des résultats”Partie I : Définitions et invariants
Section titled “Partie I : Définitions et invariants”-
(1) Un ABR est soit un arbre vide, soit un nœud contenant une valeur , un sous-arbre gauche et un sous-arbre droit tels que :
- Toutes les clés présentes dans sont strictement inférieures à .
- Toutes les clés présentes dans sont strictement supérieures à .
- Les sous-arbres et sont eux-mêmes des ABR.
-
(2) En OCaml :
type 'a abr = | Vide | Noeud of 'a abr * 'a * 'a abr- (3) Fonction d’insertion :
let rec inserer x = function | Vide -> Noeud (Vide, x, Vide) | Noeud (g, v, d) -> if x < v then Noeud (inserer x g, v, d) else if x > v then Noeud (g, v, inserer x d) else Noeud (g, v, d) (* Si x = v, on peut choisir de ne rien faire ou de l'ajouter à gauche/droite *)Partie II : Analyse probabiliste de la hauteur
Section titled “Partie II : Analyse probabiliste de la hauteur”-
(4) L’insertion successive de éléments selon une permutation aléatoire induit une structure isomorphe à l’arbre des choix de pivots successifs lors d’un quicksort. La hauteur de l’ABR correspond au nombre de partitions emboîtées. On démontre mathématiquement que l’espérance de la hauteur est de l’ordre de , plus précisément avec .
-
(5) On résout l’inéquation : Analyse critique : Ce résultat montre que pour de faibles volumes ( éléments), un ABR aléatoire reste très performant. Cependant, à l’échelle industrielle où , atteindrait niveaux, violant drastiquement le contrat de latence de .
Partie III : Analyse critique et ingénierie
Section titled “Partie III : Analyse critique et ingénierie”-
(6) Analyse critique du modèle :
- Limite du modèle : Les horodatages sont monotones croissants. L’hypothèse de “permutation aléatoire uniforme” est totalement fausse.
- Conséquence géométrique : Chaque nouvel élément est supérieur à tous les précédents. Il est systématiquement inséré dans le sous-arbre droit. L’ABR dégénère en une liste chaînée linéaire de hauteur .
- Impact système : La complexité temporelle de recherche passe de à . Pire, pour de grands , la récursion profonde (ou même l’utilisation de la pile système) conduit à une erreur de type Stack Overflow (dépilement mémoire), entraînant une rupture de service de l’application.
-
(7) Pour garantir des performances déterministes quelles que soient les données d’entrée, on a recours à des arbres auto-équilibrés (comme les arbres AVL ou les arbres Rouge-Noir). Ces structures appliquent des rotations locales (complexité ) lors des insertions/suppressions pour maintenir la hauteur de l’arbre strictement bornée à . Compromis: * On accepte une surcharge mémoire minime par nœud (stockage d’un bit de couleur ou d’un facteur d’équilibre) et un surcoût cpu infime lors des rééquilibrages, en échange d’une garantie absolue sur la borne supérieure de la latence.