Ecrire un codage de Huffman

Ecrire un codage de Huffman - Java - Programmation

Marsh Posté le 23-05-2006 à 19:50:55    

Bonjour,
 
Je realise un projet pour l'ecole, je dois réécrire l'algorithme de Huffman.
Pour le moment je m'interesse a la compression, j'ai deja obtenu le codage de chaque lettre, le soucis est pour ecrire le nouveau fichier.
 
Par exemple j'ai ce codage :
a >> 11
b >> 01
c >> 00
d >> 10
 
Quand je compresse ce mot :
abcd j'obtiens 11010010
Donc au lieu d'avoir un fichier de 4 octets il en fait 8 octets !
 
Et oui je fais tout betement ceci :
 

Code :
  1. fw = new FileWriter(file+".cmp" );
  2. fw.write(tableFrequence.get(charLu));


 
charLu est la lettre lu et tableFrequence.get(charLu) me retourne le codage de ce char.  
 
J'imagine qu'il faut ecrire chaque lettre sur un octet et non faire comme je fais c'est a dire ecrire un String mais je ne sait pas comment faire ceci en Java...  
 
Quelqu'un aurai une piste ??
Merci bcp :jap:

Reply

Marsh Posté le 23-05-2006 à 19:50:55   

Reply

Marsh Posté le 24-05-2006 à 00:34:41    

Salut,
c'est interessant.
Bon premièrement quand je vois abcd = 11010010, pour moi ca fait ni plus ni moins qu'un octet. Evidemment si tu prends un octet pour coder 0 ou 1, ca multiplie par 8.
Tu devrais simplement prendre un bit pour 0 ou 1: ca s'appelle le binaire ;)  
 
Pour coder ce nouveaux mot, une technique pourrait être de représenter chaque mot de la base en hexa, puis de le décaler en fonction de sa position.
Par exemple:
a=0x11=17
b=0x01=1
c=0x00=0
d=0x10=16
 
a partir de là, abcd = a<<6 + b<<4 + c<<2 +d
N'oublie pas de coder tes valeurs a,b,c,d,... sur des byte(1 octet) et pas sur des int (4 octets)
Pour décoder, par exemple le premier mot: tu mets un mask sur les octets qui t'interessent, tu décales en sens inverse et ça y est;
1er mot = (abcd & 0xFF000000)>>6
etc...
En tatonnant un peu, tu devrais arriver au résultat que tu cherches.
 :hello:  


---------------
Voir les RAW sous Android: https://market.android.com/details? [...] .RawVision Blog Photo: http://photouch.me Applications mobiles: http://caketuzz.com Wapcam Project: http://wapcam.mobi
Reply

Marsh Posté le 24-05-2006 à 11:09:22    

Un FileOutputStream ne serait-il pas non plus + adapté ?

Reply

Marsh Posté le 24-05-2006 à 11:52:58    

oui le FileOutputStream, c'est pour écrire le fichier, mais je crois que son pb, c'était plutot comment formatter les données à écrire dans son fichier.
Du reste dans son fichier, il devra indiquer le dictionnaire utilisé pr son codage, sinon il sera pas capable de décoder.


---------------
Voir les RAW sous Android: https://market.android.com/details? [...] .RawVision Blog Photo: http://photouch.me Applications mobiles: http://caketuzz.com Wapcam Project: http://wapcam.mobi
Reply

Marsh Posté le 24-05-2006 à 12:10:17    

En fait mon probleme est d'ecrire mon code sur un octet par exemple et non faire comme je fais cad ecrire un string qui vaut "101".
 
Sachant que j'ai trouvé ca :
http://www-igm.univ-mlv.fr/~beal/E [...] tpBit.html
Avec la methode bitWriter qui marche plus ou moins...

Message cité 3 fois
Message édité par Loizo le 24-05-2006 à 12:19:20
Reply

Marsh Posté le 24-05-2006 à 12:22:09    

Loizo a écrit :

En fait mon probleme est d'ecrire mon code sur un octet par exemple et non faire comme je fais cad ecrire un string qui vaut "101".
 
Sachant que j'ai trouvé ca :
http://www-igm.univ-mlv.fr/~beal/E [...] tpBit.html
Avec la methode bitWriter qui marche plus ou moins...


Reply

Marsh Posté le 24-05-2006 à 12:22:30    

Loizo a écrit :

En fait mon probleme est d'ecrire mon code sur un octet par exemple et non faire comme je fais cad ecrire un string qui vaut "101".
 
Sachant que j'ai trouvé ca :
http://www-igm.univ-mlv.fr/~beal/E [...] tpBit.html
Avec la methode bitWriter qui marche plus ou moins...


 
Une autre question que je me pose c'est quoi faire avec ce genre de code : 1001010001 superieur a 8 octets ?

Reply

Marsh Posté le 24-05-2006 à 12:47:16    

Loizo a écrit :

En fait mon probleme est d'ecrire mon code sur un octet par exemple et non faire comme je fais cad ecrire un string qui vaut "101".
 
Sachant que j'ai trouvé ca :
http://www-igm.univ-mlv.fr/~beal/E [...] tpBit.html
Avec la methode bitWriter qui marche plus ou moins...


 
en fait, tu as lu ma réponse?


---------------
Voir les RAW sous Android: https://market.android.com/details? [...] .RawVision Blog Photo: http://photouch.me Applications mobiles: http://caketuzz.com Wapcam Project: http://wapcam.mobi
Reply

Marsh Posté le 24-05-2006 à 13:08:19    

wapcamer a écrit :

en fait, tu as lu ma réponse?


 
Oui mais je n'ai pas compris ta methode :(
En fait j'applique le theorme de Huffman donc je ne veut pas changer la maniere de coder les lettres. Je sais que tel lettre est associé a tel code. Quand je vois tel lettre dans mon fichier j'ecrit a sa place dans un nouveau fichier son code. A priori avec la classe writeBit ca marche mais ca foire si mon code est > 8 bits style 1000110101 :/  
Pour moi tout ca reste obscur... :sweat:


Message édité par Loizo le 24-05-2006 à 14:22:48
Reply

Marsh Posté le 24-05-2006 à 14:50:52    

Ben en effet, pq g regardé rapidemment la page que tu as indiqué, et c'est le même principe.
Et là tu mélanges plein de choses.  
Le codage entropique d'Huffman définit le dictionnaire, ie la façon de coder les mots de sorte d'approcher le plus possible de la limite théorique en terme de compression d'information.
Bon ton dictionnaire est déjà fait puisque tu as a=11, b=00 etc....
 
ton problème est donc de coder/décoder les informations à partir de ce dico.
 
Puisque tu as déjà une représentation en 0,1, tu veux utiliser des bit au lieux d'octets.
 
Or un octet est une suite de 8 bits.
Tu peux donc décider de dire que les 2 premiers bits d'un octets correspondent à un mot, les 2 seconds à un autre mot etc...
Or, deux bit suffisent pour coder un entier (au sens nombre, pas entier au sens int)de 0 à 3, soit 4 mots.
 
Donc en fonction de la place à laquelle tu vx placer ton mot dans un octet, tu vas décaler ton mot de 2 bits vers la gauche, par multiple de 2 bits. Et en informatique, ca revient à écrire par exemple a<<2, ou a<<4 etc...
De cette façon là, tu vas créer des phrases de 4 mots qui seront stockées sur un octet comme cela
phrase1      = mot1 mot2 mot3 mot4
abcd          =   a      b      c      d
1000110101=  10     00     11    10
 
Donc, tu dois coder tes mots par phrases de 4 mots, meme si tu n'as pas assez de mots à mettre dedans. Dans ce cas, tu rajoutes des mots de valeur 0.
 
Après que tu utilises ta classe WriteBit ou pas, peu importe, l'important c'est de comprendre ce que tu fais (ou ce qu'une classe trouvée sur internet fait pour toi)


---------------
Voir les RAW sous Android: https://market.android.com/details? [...] .RawVision Blog Photo: http://photouch.me Applications mobiles: http://caketuzz.com Wapcam Project: http://wapcam.mobi
Reply

Marsh Posté le 24-05-2006 à 14:50:52   

Reply

Marsh Posté le 24-05-2006 à 20:17:24    

MErci bcp pour ton explication, ca reste flou dans ma tete mais je vais m'y pencher serieuresement dessus. La je dois m'absenter jusqu'a samedi, a mon retour vais m'y mettre a fond !
Merci encore pr ton aide détaillée :jap:

Reply

Marsh Posté le 26-07-2011 à 14:32:46    

Opérations simple sur des bits par exemple.....
 
byte header = (byte)0x02;
byte mask = (byte)0x40; //10000000
header = header | mask;
header = header  & ~mask;
 
décalage << >> etc...


Message édité par jogrey le 26-07-2011 à 14:34:37
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed