Probleme – Huffman de bout en bout : coder, décoder, mesurer
Exercice · niveau 3 (difficile) · informatique (MP2I/MPI), chapitre 16 — Algorithmes gloutons
É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é
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.
| Codage | bits totaux | bits 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.