Adloun

informatique (MP2I/MPI) · Chapitre 16 · Application directe du cours

Problème — Huffman de bout en bout : coder, décoder, mesurer

Algorithmes gloutons · niveau 3 (difficile)

Énoncé

  • Écrire la construction de la table de codes à partir de l'arbre, puis le codage et le décodage.
  • Démontrer que le décodage d'un code préfixe est non ambigu, et donner la complexité des deux opérations.
  • Mesurer sur un texte réel : taille obtenue, comparaison à la longueur fixe et à l'entropie.
  • Que coûte la table elle-même, et quand la compression devient-elle une perte ?

Corrigé de la question 1

1. Les trois fonctions.


(* Table caractère -> mot de code. Précondition : arbre non vide.
   Complexité : Theta(taille de l'arbre), soit Theta(k). *)
let table arbre =
  let t = Hashtbl.create 97 in
  let rec parcours a prefixe = match a with
    | Feuille (c, _) -> Hashtbl.replace t c (if prefixe = "" then "0" else prefixe)
    | Interne (g, d, _) -> parcours g (prefixe ^ "0"); parcours d (prefixe ^ "1")
  in parcours arbre ""; t

(* Texte -> suite de bits. Précondition : tout caractère de s est dans t.
   Complexité : Theta(longueur du résultat). *)
let coder s t =
  let b = Buffer.create (String.length s * 3) in
  String.iter (fun c -> Buffer.add_string b (Hashtbl.find t c)) s;
  Buffer.contents b

(* Suite de bits -> texte. Précondition : bits a été produit par coder avec
   le MÊME arbre. Complexité : Theta(nombre de bits). *)
let decoder bits arbre =
  let b = Buffer.create 256 in
  let n = String.length bits in
  let rec aux i a = match a with
    | Feuille (c, _) -> Buffer.add_char b c; if i < n then aux i arbre
    | Interne (g, d, _) ->
        if i < n then aux (i + 1) (if bits.[i] = '0' then g else d)
  in
  if n > 0 then aux 0 arbre;
  Buffer.contents b

Le décodeur ne consulte aucune table : il descend dans l'arbre, un bit par arête, et repart de la racine dès qu'il touche une feuille. Terminaison : variant , qui décroît à chaque descente ; le cas Feuille ne consomme pas de bit mais ne peut pas se répéter, puisqu'il relance à la racine, qui est interne dès que .

Question 2 : comment l'IA t'aide

2. Démontrer que le décodage d'un code préfixe est non ambigu, et donner la complexité des deux opérations.

Élève

Je veux montrer que deux textes différents ont des codages différents. Je compare les codages bit à bit, mais les mots de code n'ont pas tous la même longueur : les frontières ne s'alignent pas.

IA

Ne compare pas les bits un par un : compare les textes. Où se trouve le premier endroit où les deux textes diffèrent, et que sais-tu des codages de ce qui le précède ?

Élève

Avant ce rang, les deux textes coïncident, donc leurs codages aussi. Les codes des deux caractères qui diffèrent commencent donc au même bit de la suite commune.

IA

Ces deux mots de code se lisent alors à partir de la même position de la même suite de bits : que peux-tu dire de l'un par rapport à l'autre, et quelle propriété du code est contredite ? Pour la complexité, que coûte chaque bit au décodeur ?

L'IA ne donne pas la réponse : elle pose la question qui fait avancer. À toi de continuer.

Continue cet exercice avec l'IA

Reprends la question 2 là où le dialogue s'arrête, puis la suite de l'exercice.

Continuer avec l'IA — gratuit, sans inscription

Gratuit, sans inscription. L'IA te guide pas à pas, sans te donner la réponse.

Le cours du chapitre · Tous les exercices du chapitre

Continuer avec l'IA, gratuit →