Bonjour,
Ça doit faire 15 ans que je me suis cassé les dents pour la première fois sur un bête TP d'école de programmation, et en voulant vérifier si j'étais toujours aussi bête, je me rends compte que oui : je n'y arrive toujours pas.
Je souhaite mettre en place, histoire de relever le défit, une compression de fichier à l'aide du codage de Huffman.
Aucun souci pour construire l'arbre. A mon avis, ça pique les yeux niveau performances, mais bon, ça marche, c'est déjà ça.
En revanche, une fois que j'ai construit mon dictionnaire, comment stocker dans un byte[] (ou un Stream) mes données compressées ?
Ma phrase en entrée :
"la vie, c'est comme une boîte de chocolats : on ne sait jamais sur quoi on va tomber"
On dictionnaire :
c:1111
m:1110
b:11011
l:11010
::110011
?:110010
':110001
,:110000
:10
h:011111
j:011110
q:011101
d:011100
s:0110
t:0101
a:0100
u:00111
v:001101
r:001100
n:00101
i:00100
o:0001
e:0000
Ok...
Mais maintenant, comment obtenir :
1101001001000110100100000011000010 [...]
En effet, quand je vais récupérer le "l", je vais obtenir 0x11010.
=> Déjà pour le mettre à sa place dans le premier byte, je vais devoir le décaller vers la gauche de 3 bits : comment le savoir à l'avance ?
Ensuite, quand je vais récupérer de mon arbre le "a", je vais obtenir "0100", donc 0x100... Comment savoir que j'ai perdu le 0 de poids fort ?
Dois-je passer par une structure {byte, byte} avec d'un côté "0100" et de l'autre côté "4" de façon à savoir que je dois bien avoir 4 bits, y compris le 0 de poids fort ? Une autre solution ?
Mais ensuite, quand je vais arriver dans mon byte contenant déjà le "l" : 11010..., comment je vais savoir découper mon "0100" en deux pour compléter le premier byte et en entamer un suivant ? 11010010 0....... ?
Là je sèche. Je n'ai que des usines à gaz en tête... Soit des trucs assez peu consommateurs en mémoire, mais bouffeurs de cycles CPU, soit l'inverse...
Partager