IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Algorithmes et structures de données Discussion :

Huffman encore lui


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 41
    Par défaut Huffman encore lui
    Bonjour a vous,
    Je ne savais pas trop ou poster...

    J'essaye de coder Huffman en C, mais des le début je ne sais plus quoi faire
    ma structure étant la suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct code
    {
     unsigned int frequence;
     unsigned int indice;
     short Fils0, Fils1;
    }Code;
    J'ai donc crée ma table d'occurrence avec les fréquences que j'ai trié par ordre croissant, j'obtiens donc une table de la forme

    1: a _ 2
    2: e _ 3
    3: t _ 5

    Mais maintenant la question qui se pose c'est comment créer l'arbre de Huffman?

    Dois-je poursuivre ma première table qui contient 256 caractères avec des symboles possédant une fréquence a zéro ( qui va nuire a mon codage)
    Je devrais donc avoir ma table a 512 éléments, je prends les deux min j'en fais un nouveau noeud et je le remet dans ma table, mais a quelle position? Dois je l'insérer en respectant l'ordre de ma table (pour préserver le fait qu'elle est triée).
    Que dois je mettre dans mes fils0 et fils1?
    La position dans ma table?
    c'est a dire ici je construit un nouveau noeud en position 4 avec Fils0 = 1 et Fils1 = 2 et je le réinsère en position 1, je dois donc supprimer les deux noeuds que je viens de prendre?

    Voila je m'excuse de la confusion de mon post mais ca reflète assez bien ma compréhension pour la création de l'arbre

    Merci pour votre aide

  2. #2
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Tout est expliqué sur le site de developpez.com (site que je vous recommande chaudement):

    http://tcharles.developpez.com/Huffman

    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 41
    Par défaut
    Merci pour votre reponse,
    j'avais deja preté attention a ce tuto, mais le probleme c'est qu'il code avec des listes chainées et arbre... d'apres ce que j'ai compris...

    Et moi mon probleme reside dans le fait que je ne sais pas comment passer de ma table trié a mon arbre avec ma structure de tableau...

  4. #4
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Citation Envoyé par BatuBou Voir le message
    Merci pour votre reponse,
    j'avais deja preté attention a ce tuto, mais le probleme c'est qu'il code avec des listes chainées et arbre... d'apres ce que j'ai compris...
    ?

    "IV-A. Etape 1" -> tu as le tableau des occurrences
    "IV-B. Etape 2" -> tu as la construction de l'arbre

    Je n'ai pas vu la mention "liste chaînée" dans tout l'article...
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 41
    Par défaut
    Bonjour, voila j'ai reussi a faire mon arbre de Huffman mais maintenant j'aimerais coder l'arbre et le message...

    Mais comment faire pour savoir a la decompression qu'on est arrivé a la fin de notre arbre, et qu'on commence a lire notre message? et on doit aussi lire octet par octet pour le message, comment fait-on pour completer notre message a coder(pour la fin du message)?

    Merci pour votre aide

  6. #6
    Membre expérimenté
    Profil pro
    Dev
    Inscrit en
    Décembre 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Décembre 2007
    Messages : 191
    Par défaut
    Résumons : tu as un message codé de la forme d'une chaine de caractere :

    "Message code pour huffman"

    Tu comptes le nombre de caractères et construit donc une table caractere-frequence

    Tu crées l'arbre de Huffman à partir de cette table.

    Tu recrées ensuite une table pour faire correspondre un caractere avec son code huffman correspondant, en parcourant l'arbre dans tous les sens possibles. Ou alors tu "recherches" (avec une fonction récursive) chaque caractere (tu as la liste complète depuis la première étape) dans l'arbre et tu recrées le code selon si tu es passé "à droite" ou "à gauche" dans les 2 cas.

    De meme pour l'algorithme de décodage, tu partiras directement de cette table "code-caractere".

    Une fois que tu as une table de correspondance "caractere - code", tu lis simplement caractere par caractere ton texte et le "traduit" en codé. Ou inversément.

    Le message est donc devenu une "suite de bits" .

    Si tu as la suite de bits, aucun souci, tu lis le code jusqu'au bout et une fois à la fin de ton code le message sera décodé.

    Après le problème des octets se passe si tu as par exemple sauvé ton code dans un fichier.

    Tu peux toujours connaitre le nombre d'octet pris par un fichier, par contre en effet il te faudra savoir juste le nombre de bits pris par "le petit bout de fin". Et bien il suffit de diviser le nombre de bits par 8, et de voir le reste : ce sera le nombre de bits à lire dans le dernier caractere (les restants ne sont la que pour remplir). Et il te faut sauver cette valeur dans le fichier, en premier par exemple.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 41
    Par défaut
    Merci pour votre reponse
    J'ai maintenant du mal a comprendre quel algo appliqué pour reconstruire mon arbre de Huffman et ensuite lire mon message code

    j'ai donc par exemple 0125518 ou 255 et 8 sont mes lettres mais comment faire pour reconstruire mon arbre? 0 indique le noeud (ici la racine) et 1 une feuille
    Voici mon algo, mais il ne fonctionne pas du tout
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Arbre LitArbre(char c, char *Donnees)
     Arbre new=malloc(sizeof(Noeud_A));
     si new est NULL
      return new;
     si c =0
       | new->Lettre = '\0';
       | return new->FilsGauche = LitArbre(car suivant, Donnees)
       | return new->FilsDroit = LitArbre(car suivant, Donnees)
     
     si c = 1
       | new->Lettre = on lit notre lettre
       | return new;
    Et quand j'aurais mon arbre, pour lire le message comment dois je proceder?

    Merci pour votre aide

Discussions similaires

  1. Macro VBA - Vlookup (Encore lui)
    Par Anto_NEX dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 01/08/2012, 10h18
  2. Erreur de script sous ie (encore lui!)
    Par steve3000 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 25/05/2009, 20h28
  3. segmentation fault (eh oui encore lui !)
    Par snipes dans le forum C
    Réponses: 8
    Dernier message: 11/12/2007, 17h22
  4. Dijkstra, encore lui ;-)
    Par phpmad dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 23/11/2006, 19h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo