Je vois pas le pb...
Normalement un truc compressé en LZ77 ressemble à : 'b' 'l' 'a' '-' REPEAT(-4,3) '!'
Tu as juste à compresser ça en Huffman (l'alphabet faisant 257 caractères, et le (x,y) dans REPEAT(x,y) étant codé littéralement), et le tour est joué...
« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)
OK donc faire du vrai LZ77 parce que en fait j'utilise le LZSS et donc pour toi je devrait tout coder littéralement en Huffman. Bizarre comme idée mais je vais essayer mais je doute d'avoir de bon résultats.
Bah le LZSS est appelé couramment LZ77 car le LZ77 n'est plus utilisé c'est comme le LZ78 qu'on nomme souvent LZW...
Biarre car c'est ce que je fais pour les simples caractère et pour les répétitions c'est codé de façon presque maximal en nombre de bits de plus si le fichier ne possède pas de chiffres, son codage dans l'arbre de Huffman sera sur un nombre de bits assez important...
Bref je viens d'essayer et j'ai les même taux à quelques octets prêt.
Miles Le 29/02/2004 à 09:25 Il y a 3 modes de compression LZX, si le me souviens bien... le LZ77, le LZ78 et le LZW. Welch n'a pas travaillé sur le 78, mais a déposé un brevet pour son LZW, je crois, à vérifier.
Oui en effet il y a un brevet pour le LZW.
Pour que Huffman compresse il faut en fin de compte que je réalise le LZ77 et que les données soient écrites sur des octets, cela signifie un dico de 65536 caractères et un buffer de 256 caractères. Je vais voir ce que ça donne.
Le code "répétition" est la 257ème valeur.
(et on peut aussi affiner en prenant 256+n valeurs en prenant la convention "code 256+n" = "répétition de n+2 caractères")
« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)
J'ai trouvé des infos sur le net et je pense être capable de réaliser le huffman progressif mais reste un point que je ne comprend toujours pas. Je parle du LZSS.
Si j'ai 257 valeurs, Huffman travaillera sur le codage de 9 bits ok mais si je tombe sur le cas où j'ai:
Bit témoin+pos+size il faut que ça fasse au minimum 18 bits, bref que ça soit divisible par 9?
Rien compris, encore une fois...
« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)
caractère a => 'a'
caractère 123 => 123
REPEAT(offset,5) => 254+5 avec comme donnée auxiliaire "offset"
« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)
Ben, au lieu de coder un caractère de {0,1,...,255}, tu codes un caractère de {0,1,...,255,rep2,rep3,...,repnmax} (que tu peux représenter par sa bijection sur {0,1,...,254+nmax} si tu veux).
(post croisé)
Ah ok je pige mieux, donc Huffman aura une table de codage de 0 à 254+nmax.
Maintenant pourquoi pas 2 tables de codage? Une pour les caractères ASCII lorsque aucune répétition n'est trouvé et l'autres pour le codage des répétitions?
Mais quand tu rencontreras un code, comment tu sauras de quelle table il vient ?

« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas
. »
lol après reflexion le bit est inutile puisque suivant le code que j'aurais je serais si c'est un simple caractère ou le couple pos, size.
Donc en fait j'ai une table de 257 valeurs ou la valeur 256 ce nomme REP, je code tout sur 9 bits. A chaque fois que je compresse un caractère ou une définition dans ma table de caractères j'ajoute un à la fréquence voulu puis je reconstruit l'arbre, une fois l'arbre codifie je code le caractère sur le nombre de bits voulu avec le code de Huffman. La décompression est simple, l'arbre ce reconstruit petit à petit comme à la décompression, après reconstruction d'un caractère, si je vois 256 soit REP j'ai à faire au couple pos, size sinon à un simple caractère.
On peux optimiser la compression en compressant les couples size et pos pour cela on étant la table ce que je trouve un peu inutile car créer une autre table serait plus efficace.
Voilà ce que j'ai compris.
Comment afficher un nombre sur 64 bits non signé et un nombre à virgule flotante du type, long long et double?