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 :

Algorithme de Huffman : parcours de l'arbre


Sujet :

Algorithmes et structures de données

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 442
    Points : 178
    Points
    178
    Par défaut Algorithme de Huffman : parcours de l'arbre
    Bonjour,

    Je cherche à implémenter l'algorithme de Huffman mais je me retrouve devant un problème : comment parcours t-on l'arbre ; parce qu'un moment ça coince

    Voici un exemple :

    j'ai cette phrase : "bac a sable"

    Après comptage des occurrence on obtient : c:1 ; s:1 ; l:1 ; e:1 ; space:2 ; b:2 ; a:3

    Ensuite je crée l'arbre et j'obtiens :

    Nom : arbre tri huffman.png
Affichages : 4130
Taille : 7,3 Ko

    Maintenant c'est pour le parcours (pour créer le code binaire), j'ai le tableau suivant avec les index :

    Nom : tab huffman.png
Affichages : 1452
Taille : 3,8 Ko

    Donc si je le parcours pour le fils droit et gauche à partir de l'index 1 donc le nombre 7 :

    2x1 +1 = 3 et 2x1+2 = 4 donc là ok je tombe bien sur les bonnes valeurs (4 et 3) comme indiqué sur l'arbre.

    Si je prends l'index 4 (valeurs 3) là je trouve : 2x4+1 = 9 et 2x4+2=10 et là c'est pas bon puisque le nombre 3 est une feuille. En fait impossible de remonter l'arbre pour faire mon codage car les autres calcules sont faux.

    Pourriez-vous m'indiquer comment faire pour parcourir mon arbre sans avoir ce type de problème je vois pas du tout ! Comment faut-il l'arranger car en fait mon arbre comme on le voit dans l'image ci-dessus n'est pas ordonné et ne peut pas l'être sinon je déstructure tout le codage binaire.

    Merci.

  2. #2
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 271
    Points : 13 536
    Points
    13 536
    Par défaut
    Bonjour

    2x1 +1 = 3
    Mais que peut bien exprimer ce calcul ?



    Tu pars de l'indice augmenté de 1.
    Pour déterminer le chiffre : x%2
    Pour passer au suivant : x/2 (division entière évidemment)
    Et tu t'arrêtes en arrivant à 1.

    Exemple : "a" d'indice 4
    4+1=5
    5%2 = 1 et 5/2 = 2
    2%2 = 0 et 2/2 = 1
    Codage du a: 0 1

    Autre exemple : "c" d'indice 11
    11+1=12
    12%2 = 0 et 12/2 = 6
    6%2 = 0 et 6/2 = 3
    3%2 = 1 et 3/2 = 1
    Codage du c: 1 0 0

    NOTE: ton tableau est faux car il manque les indices non affectés (9 et 10)
    "c" est à la place 9 alors qu'il devrait être à la place 11.
    Si tu ne veux pas de trou dans ton tableau, alors tu ne peux pas travailler avec les indices.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 442
    Points : 178
    Points
    178
    Par défaut
    Merci pour ta réponse.

    Le 2x1 + 1 = 3 vient du tri par tas quand on cherche le fils gauche à partir de l'indice 1.

  4. #4
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 119
    Points : 9 529
    Points
    9 529
    Par défaut
    Tu as une règle pour trouver les 2 fils à partir d'un père. Si le père a le n° x, les 2 fils portent les n° 2x+1 et 2x+2.
    Ok.
    Mais cette règle marche dans 2 cas :
    - cas 1 : si l'arbre est complet ( 1 élément au plus haut niveau, puis 2 au niveau suivant , et à chaque fois, on multiplie le nombre d'éléments par 2) ; Ici ce n'est pas le cas , l'un des éléments n'a pas 2 fils, alors que les autres éléments du même niveau ont 2 fils.
    - cas 2 : si l'arbre est presque complet , et que les éléments manquants sont les derniers.
    Ici sur l'avant dernière ligne, tu as 4 éléments. L'élément qui n'a pas de fils, c'est le 2ème. Pas bon. Si c'était le 4ème, ta formule marcherait.

    Ton programme marche, il ne faut pas chercher à faire un programme qui marcherait dans le cas de cet arbre précis.
    Il faut corriger la création de l'arbre, pour qu'il rentre dans un des 2 cas que j'ai décrits (le cas 2 en l'occurrence)

    En tout cas, c'est ma vision de la chose.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 442
    Points : 178
    Points
    178
    Par défaut
    Merci pour ta réponse.

    Comme j'essaie de codé l'arbre de Huffman un certain moment tu as des feuilles qui on une profondeur n-1 (comme sur l'image de mon arbre) ; mais alors comment faut-on pour représenté cette arbre de Huffman (qui n'est pas complet) dans un tableau ?

  6. #6
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 271
    Points : 13 536
    Points
    13 536
    Par défaut
    L'indice 9 a une valeur 0.
    L'indice 10 a une valeur 0.
    Et l'indice maximum (14) a la valeur 1 et représente "e".

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 442
    Points : 178
    Points
    178
    Par défaut
    Ha ok merci.

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 442
    Points : 178
    Points
    178
    Par défaut
    L'indice 9 a une valeur 0.
    L'indice 10 a une valeur 0.
    Et l'indice maximum (14) a la valeur 1 et représente "e".
    Trop compliqué à mettre en oeuvre je vais revoir mon algo.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Amélioration de l'algorithme de Huffman
    Par Nosper dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 28/08/2012, 01h10
  2. Réponses: 4
    Dernier message: 19/02/2006, 18h43
  3. parcours d'un arbre en sql
    Par dor_boucle dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 02/02/2006, 11h10
  4. Ordre de parcours de l'arbre...
    Par Sylvain James dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 01/12/2002, 18h41
  5. Algorithme de Huffman
    Par mmuller57 dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 15/05/2002, 11h47

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