Ou bien il va souffler et souffler et faire sauter votre maison!
C'était complètement hors de propos. Ce défi concerne en fait le codage Huffman . L'essentiel est que la fréquence des caractères dans un texte donné est utilisée pour raccourcir sa représentation. En d'autres termes, disons que notre alphabet est a
traversant z
et spatial. Cela fait 27 caractères. Chacun d'eux peut être codé de manière unique en seulement 5 bits car 5 bits ont suffisamment de place pour 32 caractères. Cependant, dans de nombreuses situations (comme l'anglais ou les langues en général), certains caractères sont plus fréquents que d'autres. Nous pouvons utiliser moins de bits pour les caractères les plus fréquents et (peut-être) plus de bits pour les caractères les moins fréquents. Bien fait, il y a une économie globale sur le nombre de bits et le texte original peut toujours être reconstruit de manière unique.
Prenons "cette question concerne le codage de Huffman" comme exemple. Ce texte est de 37 caractères, ce qui serait normalement 37 * 8 = 296 bits, bien que seulement 37 * 5 = 185 bits si nous n'utilisons que 5 bits pour chaque caractère. Garde cela à l'esprit.
Voici un tableau (sorta) de chaque caractère et de leurs fréquences dans le texte, triés du plus au moins fréquent (où _ représente un espace):
_ 5
i 4
n 3
o 3
s 3
t 3
u 3
a 2
f 2
h 2
b 1
c 1
d 1
e 1
g 1
m 1
q 1
Un codage optimal associé pourrait être:
_ 101
i 011
n 1100
o 1101
s 1110
t 1111
u 001
a 10011
f 0001
h 0101
b 00000
c 00001
d 01000
e 01001
g 10000
m 10001
q 10010
Il devrait être immédiatement clair que ce sera un meilleur encodage que d'utiliser simplement 5 bits pour chaque caractère. Voyons à quel point mieux, cependant!
145 bits , contre 185! C'est une économie de 40 bits, soit un peu plus de 20%! (Cela suppose, bien entendu, que des informations sur la structure soient disponibles pour le décodage.) Ce codage est optimal car aucun bit ne peut être supprimé en modifiant la représentation d'un caractère.
La tâche
- Écrivez un programme ou une fonction avec un paramètre qui ...
- Prend l'entrée de STDIN (ou équivalent) ou comme un seul argument.
- Générez un codage Huffman optimal comme ci-dessus avec les caractères triés par fréquence (l'ordre dans une classe de fréquence n'a pas d'importance).
- Vous pouvez supposer que les caractères de l'entrée sont limités à la plage ASCII
32..126
plus une nouvelle ligne. - Vous pouvez supposer que la saisie ne dépasse pas 10 000 caractères (idéalement, en théorie, la saisie doit être illimitée).
- Votre code devrait se terminer assez rapidement. L'exemple donné ci-dessus ne devrait pas prendre plus d'une minute ou plus au pire. (Ceci est destiné à exclure la force brute.)
- La notation est en octets.
Exemples
x
---
x 0
xxxxxxxxx
---
x 0
xxxxxxxxy
---
x 0
y 1 (these may be swapped)
xxxxxyyyz
---
x 0
y 10
z 11
uuvvwwxxyyzz
--- (or)
u 000 000
v 001 001
w 100 010
x 101 011
y 01 10
z 11 11
this question is about huffman coding
---
101
i 011
n 1100
o 1101
s 1110
t 1111
u 001
a 10011
f 0001
h 0101
b 00000
c 00001
d 01000
e 01001
g 10000
m 10001
q 10010
Bon codage!
Notez que cette question similaire est étroitement liée, même au point que celle-ci est un doublon. Cependant, le consensus à ce jour sur Meta est que l'ancien devrait être considéré comme un double de celui-ci.
this question is about huffman coding
, j'ai compté le nombre de bits pour 145 , pas 136.