Codes HUFFMAN + Canoniques : OKKKKKK git add --allgit add --all

This commit is contained in:
2025-12-20 14:01:36 +01:00
parent a11590dc3f
commit 58f6c74761
4 changed files with 31 additions and 15 deletions
@@ -1,22 +1,38 @@
package fr.iutfbleau.sae.mhuffman;
import java.util.*;
public class CanonicalCode{
private Map<Integer,Integer> codeLenghts = HuffmanNode.getDictionnary();
private Map<Integer,Integer> codeLengths = HuffmanTree.getDictionnary();
private Map<Integer,Integer> canonicalCodes = new HashMap<>();
public void generateCodes(){
// 1- Premiere chose à faire : trier les codes initiaux par longueur du code :
public Map<Integer,Integer> generateCodes(){
// 1 ere chose à faire : on regarde uniquement la longueur des codes initiaux(Huffman)
// 2eme chose à faire : remettre dans l'ordre des longueurs : si meme taille ==> regarder valeur
// 3eme chose à faire : ecriture des codes canoniques :
List<Integer> codes = new ArrayList<>();
codes = codeLenghts.keySet();
int[] tab = code.toArray(new Integer[0]);
Arrays.sort(tab);
// on recupere les entrées des codes Huffman pour pouvoir les triés
List<Map.Entry<Integer, Integer>> liste = new ArrayList<>(codeLengths.entrySet());
// ici on comparer par longueur de la valeur ou sinon par la clé
// type générique pour éviter les erreurs de compilation !!!
liste.sort(Comparator.<Map.Entry<Integer,Integer>>comparingInt(Map.Entry::getValue)
.thenComparing(Map.Entry::getKey));
int code = 0; // code canonique à attribuer
int temp = 0; //garde la longueur du code précedent , pour gérer le décalage
for (Map.Entry<Integer, Integer> entree : liste ) {
int valeur = entree.getKey(); // symbole actuel
int longueur = entree.getValue(); // longueur du code actuel
code <<= (longueur - temp); // permet de décaler le code actuel si la longueur augmente
canonicalCodes.put(valeur,code); // ajout dans le dictionnaire
code++; // incrémentation pour la valeur qui suit
temp = longueur; // mise à jour de la longueur précedente
}
return canonicalCodes;
}