Aller au contenu principal
U/
Compression
polyglotte

Compresser et décompresser un texte par codes de longueur variable

Implémenter un algorithme de codage de Huffman : construire l'arbre à partir des fréquences des caractères, encoder le texte en une suite de bits, puis décoder cette suite.

90 minPublié le 20 mai 2026Proposé par Anonyme

Défi

// Lisez attentivement, codez sur votre machine

Énoncé

Le programme lit une ligne de commande E ou D, puis traite l'entrée. Pour E (encodage), il lit un texte sur une seule ligne, calcule les fréquences de chaque caractère, construit l'arbre de Huffman (en cas d'égalité de fréquences, le caractère d'ordre ASCII inférieur est traité en premier), affiche la table de codes (un caractère et son code binaire par ligne, triés par ordre ASCII), puis affiche le texte encodé sous forme de suite de bits 0/1. Pour D (décodage), il lit d'abord le nombre de codes, puis chaque paire caractère code, puis la suite de bits, et affiche le texte original.

Contraintes

  • Le texte pour E contient entre 1 et 500 caractères ASCII imprimables, au moins 2 caractères distincts, et toutes les fréquences des caractères sont distinctes (pas d'égalité — aucune ambiguïté dans la construction de l'arbre).
  • La file de priorité est un min-heap sur les fréquences ; le nœud de plus faible fréquence est toujours extrait en premier.
  • L'arbre de Huffman est construit en plaçant le nœud extrait en premier comme enfant gauche.
  • La suite de bits ne contient que 0 et 1.
  • Solution réalisable dans tout langage généraliste avec sa seule bibliothèque standard.

Exemple

Entrée :
E
aaaabbc

Sortie :
a 1
b 01
c 00
1111010100

Fréquences : a=4, b=2, c=1. File : c(1), b(2), a(4). Étape 1 : fusion c(1)+b(2)=nœud(3) ; c→gauche=00, b→droite=01. Étape 2 : fusion nœud(3)+a(4)=racine ; nœud→gauche, a→droite=1. Encodage de aaaabbc : 1·1·1·1·01·01·00 = 1111010100.

Entrée :
D
3
a 1
b 01
c 00
1111010100

Sortie :
aaaabbc
Espace solution

Proposer une solution

Connectez-vous ou créez un compte pour envoyer votre code (aucune exécution côté serveur — on stocke juste le texte pour la communauté).

// À garder en tête
  • D'abord, faire marcher

    On ne cherche pas à optimiser : d'abord, on fait marcher le truc. Optimiser vient ensuite — et ça aussi, ça s'apprend. (Si un défi porte sur l'optimisation, son énoncé le précise.)

  • Pas de mauvaise réponse

    Il n'y a pas de mauvaise réponse à un défi. Le but, c'est de le faire. Ce qui compte, c'est de s'entraîner.

  • Trop dur ? Au suivant

    Un défi te résiste ? N'hésite pas à en prendre un autre. Ils seront encore là demain.