snoopi_19ans
Messages postés7Date d'inscriptiondimanche 16 avril 2006StatutMembreDernière intervention20 mai 2009
-
23 avril 2007 à 21:33
emmatopiak
Messages postés149Date d'inscriptionmercredi 28 mars 2007StatutMembreDernière intervention17 mai 2007
-
29 avril 2007 à 13:48
void prefixe(abr a)
{
if(a!=NULL)
{
printf("|%d",a->crd);
printf("%c",a->ch);
printf("\t");
prefixe(a->fg);
prefixe(a->fd);
}
}
void main()
{
abr a;
lis l;
FILE *f;
int n;
l=creer_lis_vid();
a=creer_abr_vid();
l=constr_lis_char(l,a,f);
printf("La liste des caracteres :\n");
aff_lis(l);
l=freq_char(l);
printf("La liste des frequences :\n");
aff_lis(l);
l=Tri_Liste(l);
printf("Liste apres le tri :\n");
aff_lis(l);
printf("\n\n");
printf("Construction de l arbre de HUFFMAN\n");
a=arbre_huffman(l);
printf("\n\n");
n=nb_n(a);
printf("Le nombre des noeuds est :%d\n\n", n);
comp(f,a);
prefixe(a);
printf("\n");
}
<<<<<<<<<<<salem alikom
voila le code source de mon programme ecrit en language c,mon but c'est d'effectuer le codage avec la methode de huffman,en utilisant une liste et un arbre ,mais j'arrive pas a trouver la solution,merci de m'aider a clarifier l'idée, je n'arrive pas trouver la methode avec laquelle je vais compresser puis décompresser le fichier ,sachant que chaque caractère avec son occurance existe dans une feuille de l'arbre.>>>>>>>>
merci ,pour tout
emmatopiak
Messages postés149Date d'inscriptionmercredi 28 mars 2007StatutMembreDernière intervention17 mai 20072 29 avril 2007 à 13:48
salut,
Pour compresser avec le codage de Huffman il faut faire deux etapes:
la premiere c'est construire l'arbre de Huffman, ce que tu as fait, on va dire que ca marche je n'ai fait que survoler, mais par contre il te manque la deuxieme etape ( oui oui )
Donc:
-dans la deuxieme etape, tu veux compresser une chaine, disons que c'est "bonjour"
-tu prends le premier caractere de la chaine
- tu le trouves dans l'arbre et le trajet pour le trouver correspond à l'encodage.
-par exemple, si pour trouver 'b' dans l'arbre tu pars de la racine et tu fais gauche - droite - droite - droite
- alors l'encodage de 'b' va etre 0 1 1 1
- puis tu fais 'o'
-idem, tu le cherches et tu vois que c'etait droite - gauche - droite - droite - gauche - gauche par exemple
-donc ca va te donner 1 0 1 1 0 0
-tu mets ca a la suite du premier et tu continues jusqu'a avoir fini la chaine
- pour decompresser ca sera plus facile meme
-tu pars de la racine, tu lis 0
-tu arrives a gauche de la racine, mais pas encore une feuille donc tu continues, tu lis 1
- toujours noeud intermediaire
- encore 1 et la tu arrives dans une feuille
-donc tu ecris la valeur de la feuille, qui est 'b' ici
-puis tu repars a la racine et tu continues sur 1 0 1 1 0 0 ...
Ah et si tu arrives pas a trouver la feuille dans l'arbre, tu peux toujours ajouter un pointeur vers le parent pour chaque noeud, ou utiliser de la recursivite (backtracking)