Adloun

Probleme – Huffman de bout en bout : coder, décoder, mesurer

Exercice · niveau 3 (difficile) · informatique (MP2I/MPI), chapitre 16 — Algorithmes gloutons

Énoncé

Corrigé

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 .

2. Le décodage est non ambigu. Supposons deux textes de même codage . Soit le premier rang où ils diffèrent : leurs préfixes communs ont même codage, donc le codage de et celui de commencent au même bit. L'un est alors préfixe de l'autre — ils sont tous deux préfixes de la même suite de bits restante. Or le code est préfixe : deux mots de code distincts ne peuvent pas être l'un préfixe de l'autre. Donc , contradiction.

Complexités : codage en où est le nombre de bits produits ; décodage en également, chaque bit provoquant exactement une descente d'un niveau.

3. La mesure, sur un extrait du présent chapitre — caractères, symboles distincts. Le décodage a été comparé caractère à caractère à l'original : identique. La propriété du préfixe a été vérifiée sur les codes.

Codagebits totauxbits par caractère
ascii sur bits
longueur fixe sur bits
Huffman
entropie (borne inférieure)

Soit de gain sur la longueur fixe et sur l'ascii. Le code le plus court fait bits (l'espace, occurrences ; puis le e, occurrences), le plus long en fait .

Huffman est à de l'entropie. On démontre plus généralement que sa longueur moyenne vérifie : il ne peut jamais perdre plus d'un bit par caractère, et il perd d'autant moins que les fréquences sont proches de puissances de .

4. Le prix de la table. Le décodeur a besoin de l'arbre : il faut donc le transmettre. Un stockage naïf — le caractère sur bits, la longueur du code sur bits, puis le code — coûte environ bits ici. Le fichier complet fait donc bits, contre : le gain réel tombe de à .

Et le seuil de rentabilité. Le coût de la table ne dépend que de , celui du texte est proportionnel à sa longueur . Le gain net vaut donc : il est négatif tant que , soit ici environ caractères. Compresser un texte court coûte plus cher que de ne rien faire, et c'est pourquoi les formats réels emploient des tables convenues d'avance, ou adaptatives — le chapitre chap:textes y revient.

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.