Probleme – Codes préfixes et inégalité de Kraft
Exercice · niveau 3 (difficile) · informatique (MP2I/MPI), chapitre 18 — Algorithmique des textes
Énoncé
Huffman produit un code préfixe : aucun mot de code n'est préfixe d'un autre. On veut savoir quelles longueurs sont réalisables.
- Montrer que si un code binaire préfixe a pour longueurs , alors .
- Réciproquement, si , construire un code préfixe de ces longueurs.
- Les profils , et sont-ils réalisables ?
Corrigé
1. Le sens direct. Un code préfixe se dessine dans l'arbre binaire complet : le mot de code est le chemin de la racine à un nœud, et « aucun mot n'est préfixe d'un autre » signifie exactement qu'aucun de ces nœuds n'est ancêtre d'un autre.
Prenons et regardons les feuilles de l'arbre complet de profondeur . Le nœud du mot , à la profondeur , a exactement descendants à la profondeur . Comme aucun n'est ancêtre d'un autre, ces ensembles de descendants sont deux à deux disjoints. Ils sont tous inclus dans les feuilles, d'où
2. La réciproque, constructive. Trions les longueurs par ordre croissant, . On attribue les mots de code par ordre : est le mot de zéros ; puis, à chaque étape, est obtenu en lisant comme un entier binaire, en lui ajoutant , et en complétant à droite par des zéros jusqu'à la longueur .
Cette construction est le code canonique. Elle est préfixe : pour , on a , donc l'entier formé par les premiers bits de est au moins , strictement plus grand que — n'est donc pas préfixe de . Et comme les longueurs croissent, aucun mot plus long ne peut être préfixe d'un plus court. Elle ne déborde pas : une récurrence immédiate donne pour valeur du -ième mot , donc tient bien sur bits.
L'intérêt pratique est considérable : un code canonique se transmet en donnant seulement les longueurs, et non l'arbre. C'est ce que fait le format deflate (celui de zip et de png), et c'est ce qui répond à l'avertissement du chapitre sur le coût de la transmission de l'arbre.
3. Les trois profils.
| Profil | réalisable ? | |
|---|---|---|
| oui | ||
| non | ||
| oui |
Pour le code canonique donne , , , . Pour : , , , , .
Quand la somme vaut exactement , le code est dit complet : toutes les feuilles sont utilisées, aucune suite de bits n'est invalide. C'est toujours le cas de Huffman — il ne laisse jamais de nœud à un seul fils, sans quoi on raccourcirait un mot de code d'un bit et l'on ferait mieux. Un profil de longueurs de somme prouve donc à lui seul qu'un code n'est pas optimal, sans rien savoir des fréquences.
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.