Adloun

Un tableau associatif par arbre binaire de recherche

Exercice · niveau 2 · informatique (MP2I/MPI), chapitre 11 — Arbres de recherche, tas et files de priorité

Énoncé

Le programme demande explicitement « l'implémentation d'un tableau associatif par un arbre binaire de recherche ». Écrire ce type et ses trois opérations en OCaml, avec leurs spécifications et leurs complexités. Que doit-on exiger des clés ?

Corrigé

Ce qu'on exige des clés : un ordre total. C'est la phrase que le chapitre a citée du programme, et elle est nécessaire : à chaque nœud la descente doit trancher entre « à gauche » et « à droite », donc comparer deux clés quelconques. L'égalité seule ne suffirait pas — c'est tout ce que demande une table de hachage, et c'est la différence de contrat entre les deux structures (chapitre chap:hachage).


(* Un dictionnaire de clés 'c vers des valeurs 'v.
   INVARIANT : pour tout Nd (g, c, v, d), toutes les clés de g sont < c
   et toutes celles de d sont > c. Une clé apparaît au plus une fois. *)
type ('c, 'v) dico = Vide | Nd of ('c,'v) dico * 'c * 'v * ('c,'v) dico

(* Renvoie Some v si c est liée à v, None sinon. Complexité : O(h). *)
let rec trouve c = function
  | Vide -> None
  | Nd (g, k, v, d) ->
      if c = k then Some v
      else if c < k then trouve c g
      else trouve c d

(* Renvoie le dico où c est liée à v, en ÉCRASANT une liaison antérieure.
   Complexité : O(h) en temps et en mémoire neuve. *)
let rec pose c v = function
  | Vide -> Nd (Vide, c, v, Vide)
  | Nd (g, k, w, d) ->
      if c = k then Nd (g, c, v, d)              (* on écrase, on n'empile pas *)
      else if c < k then Nd (pose c v g, k, w, d)
      else Nd (g, k, w, pose c v d)

(* Liste des couples, TRIÉE par clé croissante. Complexité : Theta(n). *)
let rec couples a acc = match a with
  | Vide -> acc
  | Nd (g, k, v, d) -> couples g ((k, v) :: couples d acc)

Correction de trouve : par induction structurelle, exactement comme celle de appartient dans le cours ; si , l'invariant garantit qu'aucune clé du sous-arbre droit ne vaut , donc chercher à gauche est exhaustif.

Complexités : pour trouve et pose, donc si l'arbre est équilibré et s'il dégénère ; pour couples, qui rend les clés triées sans le moindre travail supplémentaire.

Le point de contrat à ne pas manquer : pose écrase. C'est la sémantique d'un tableau associatif — une valeur par clé. On verra au chapitre chap:hachage que Hashtbl.add fait l'inverse et empile les liaisons : le même mot recouvre deux contrats différents, et c'est une source d'erreurs bien réelle.

Les autres exercices de ce chapitre Le cours du chapitre

Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.