Generation des codes Huffman

This commit is contained in:
2025-12-18 12:34:39 +01:00
parent 3e69ce9d43
commit 49ed3623c6
3 changed files with 68 additions and 20 deletions
@@ -1,8 +1,10 @@
package fr.iutfbleau.sae.mhuffman;
import java.util.*; import java.util.*;
public class CanonicalCode{ public class CanonicalCode{
private Map<Character,Integer> codeLenghts; private Map<Character,Integer> codeLenghts;
private Map<Character,Integer> CanonicalCodes; private Map<Character,Integer> canonicalCodes;
@@ -15,4 +17,6 @@ public class CanonicalCode{
// à changer selon le contexte ! encore une fois !! // à changer selon le contexte ! encore une fois !!
return 0; return 0;
} }
} }
@@ -1,3 +1,5 @@
package fr.iutfbleau.sae.mhuffman;
/** /**
* Représente un nœud de l'arbre de Huffman. * Représente un nœud de l'arbre de Huffman.
* <p> * <p>
+60 -18
View File
@@ -1,11 +1,11 @@
package fr.iutfbleau.sae.mhuffman; package fr.iutfbleau.sae.mhuffman;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Comparator; import java.util.Comparator;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
/** /**
* Implémente un arbre de Huffman utilisé pour la compression de données. * Implémente un arbre de Huffman utilisé pour la compression de données.
* <p> * <p>
@@ -38,7 +38,7 @@ import java.util.Map;
* dédiés. * dédiés.
* </p> * </p>
* *
* @author Algassimou Pellel Diallo * @author Algassimou Pellel Diallo,Ayoub Anhdire
* @version 1.0 * @version 1.0
* @since 2025-12-13 * @since 2025-12-13
*/ */
@@ -54,6 +54,18 @@ public class HuffmanTree {
*/ */
private HuffmanNode root; private HuffmanNode root;
/**
* Dictionnaire pour enregistrer les codes Huffman
*/
private Map<Integer,String> 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. * Construit un arbre de Huffman.
* <p> * <p>
@@ -76,6 +88,8 @@ public class HuffmanTree {
// je cree une collection de feuilles // je cree une collection de feuilles
/////////////////////////////////// Voir si ya moyen doptimiser ////////////////////////////////////// /////////////////////////////////// Voir si ya moyen doptimiser //////////////////////////////////////
// tu pourrait utiliser une PriorityQueue pour placer selon les fréquences comme dit dans l'énoncé !!!!
List<HuffmanNode> feuilles = new ArrayList<>(); List<HuffmanNode> 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 :: // Referencement de methode avec ::
feuilles.sort(Comparator.comparingInt(HuffmanNode::getFrequence)); 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 // 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) // 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; 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 // 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++; index++;
} }
feuilles.add(index, parent); feuilles.add(index, parent);
@@ -133,22 +147,50 @@ public class HuffmanTree {
return root; return root;
} }
/**
* @return Map on stockera les codes Huffman sous forme de dictionnaire
*/
public Map<Integer,String> generateCodes(){ public Map<Integer,String> generateCodes(){
// methode recursive : appliquer à chaque branche de l'abre , chaque feuille !!! /**
// 1 - trouver cas de base + comment generer les codes : * 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
il nous faut differencier plusieurs cas si c'est la racine de l'abre * 0 - si on saute vers un fils gauche.
et surtout si on met zero ou 1 selon si le fils droit ou 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<Integer,String> 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;
}
}