diff --git a/src/fr/iutfbleau/sae/mhuffman/CanonicalCode.java b/src/fr/iutfbleau/sae/mhuffman/CanonicalCode.java index 0d30cd0..ed8524b 100644 --- a/src/fr/iutfbleau/sae/mhuffman/CanonicalCode.java +++ b/src/fr/iutfbleau/sae/mhuffman/CanonicalCode.java @@ -1,8 +1,10 @@ +package fr.iutfbleau.sae.mhuffman; + import java.util.*; public class CanonicalCode{ private Map codeLenghts; - private Map CanonicalCodes; + private Map canonicalCodes; @@ -15,4 +17,6 @@ public class CanonicalCode{ // à changer selon le contexte ! encore une fois !! return 0; } -} \ No newline at end of file +} + + diff --git a/src/fr/iutfbleau/sae/mhuffman/HuffmanNode.java b/src/fr/iutfbleau/sae/mhuffman/HuffmanNode.java index 8f30e27..8c46124 100644 --- a/src/fr/iutfbleau/sae/mhuffman/HuffmanNode.java +++ b/src/fr/iutfbleau/sae/mhuffman/HuffmanNode.java @@ -1,3 +1,5 @@ +package fr.iutfbleau.sae.mhuffman; + /** * Représente un nœud de l'arbre de Huffman. *

diff --git a/src/fr/iutfbleau/sae/mhuffman/HuffmanTree.java b/src/fr/iutfbleau/sae/mhuffman/HuffmanTree.java index 78bb997..637c63d 100644 --- a/src/fr/iutfbleau/sae/mhuffman/HuffmanTree.java +++ b/src/fr/iutfbleau/sae/mhuffman/HuffmanTree.java @@ -1,11 +1,11 @@ package fr.iutfbleau.sae.mhuffman; - import java.util.ArrayList; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; + /** * Implémente un arbre de Huffman utilisé pour la compression de données. *

@@ -38,7 +38,7 @@ import java.util.Map; * dédiés. *

* - * @author Algassimou Pellel Diallo + * @author Algassimou Pellel Diallo,Ayoub Anhdire * @version 1.0 * @since 2025-12-13 */ @@ -54,6 +54,18 @@ public class HuffmanTree { */ private HuffmanNode root; + /** + * Dictionnaire pour enregistrer les codes Huffman + */ + private Map codes; + + /** + * Chaine de caracteres qui va nous permettre de sauvegader le code Huffman + * Permet en d'autres termes de construire la chaine de 1 et de 0 + */ + + private String chaineCarac; + /** * Construit un arbre de Huffman. *

@@ -76,6 +88,8 @@ public class HuffmanTree { // je cree une collection de feuilles /////////////////////////////////// Voir si ya moyen doptimiser ////////////////////////////////////// + + // tu pourrait utiliser une PriorityQueue pour placer selon les fréquences comme dit dans l'énoncé !!!! List feuilles = new ArrayList<>(); @@ -90,7 +104,7 @@ public class HuffmanTree { } } - // On tri les feuilles par frequence croissante jutilie un comparator qui compare la vareur retournee par getFrequence de chaque feuille + // On tri les feuilles par frequence croissante j'utilise un comparator qui compare la valeur retournee par getFrequence de chaque feuille // Referencement de methode avec :: feuilles.sort(Comparator.comparingInt(HuffmanNode::getFrequence)); // flemme de faire un algo de tri alors que java le fait tres bien a voir a la fin si je vais coder une liste chainee avec un tri par insertion personnalise @@ -109,7 +123,7 @@ public class HuffmanTree { // j'insère le nœud parent dans la collection à la bonne position pour maintenir l'ordre (plus performant qu'un tri complet à chaque itération) int index = 0; // tant que l'index est dans les limites et que la frequence du noeud à l'index est inférieure à celle du parent - while (index < feuilles.size()&& feuilles.get(index).getFrequence() < parent.getFrequence()) { + while (index < feuilles.size() && feuilles.get(index).getFrequence() < parent.getFrequence()) { index++; } feuilles.add(index, parent); @@ -133,22 +147,50 @@ public class HuffmanTree { return root; } - + /** + * @return Map on stockera les codes Huffman sous forme de dictionnaire + */ + public Map generateCodes(){ - // methode recursive : appliquer à chaque branche de l'abre , chaque feuille !!! - // 1 - trouver cas de base + comment generer les codes : - - /* - il nous faut differencier plusieurs cas si c'est la racine de l'abre - et surtout si on met zero ou 1 selon si le fils droit ou gauche - + /** + * Le but de cette méthode est de pouvoir generer les codes Huffman à partir de l'arbre : + * Les branches prendront comme valeur 1 ou 0 selon differents cas : + * 1 - si on saute vers un fils droit + * 0 - si on saute vers un fils gauche. + * On construit les codes qui partent de la racine jusqu'à notre objectif */ - // le type des clés et valeurs sont susceptibles de changer : - Map dictionnaire = new HashMap<>(); + + this.codes = new HashMap<>(); + this.chaineCarac = new String(); + + if(root.isLeaf()){ + codes.put(root.getValue(),chaineCarac); + return codes; + } + + HuffmanNode temp = root; + + if (root.getLeft() != null) { + root = root.getLeft(); + chaineCarac = chaineCarac + "0"; + generateCodes(); + // on retire le dernier bit lorsqu'on remonte car sinon les codes seront faussés + chaineCarac = chaineCarac.substring(0, chaineCarac.length() - 1); + } + + if (temp.getRight() != null) { + root = temp.getRight(); + chaineCarac = chaineCarac + "1"; + generateCodes(); + chaineCarac = chaineCarac.substring(0, chaineCarac.length() - 1); + } + + + root = temp; + return codes; + +} - - return dictionnaire; - } -} \ No newline at end of file +}