From d0557710dda0cdec58b9895fe1f91f4486edf21e Mon Sep 17 00:00:00 2001 From: "iliya.saroukha" <iliya.saroukhanian@etu.hesge.ch> Date: Fri, 18 Apr 2025 18:59:30 +0200 Subject: [PATCH] feat: added part about vitter params --- report/report.qmd | 60 +++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 56 insertions(+), 4 deletions(-) diff --git a/report/report.qmd b/report/report.qmd index 3b704f9..82a8050 100644 --- a/report/report.qmd +++ b/report/report.qmd @@ -232,10 +232,56 @@ l'inverse quantifiée. # Huffman Adaptatif Dans ce travail pratique nous allons implémenter l'algorithme de compression -Huffman Adaptatif. Celui-ci aura pour but de construire un arbre binaire où -chaque noeud **externe** représentera un caractère dans la chaîne fournie pour -l'encodage et la valeur des noeuds **internes** correspondra à la somme des -poids de ses enfants (i.e. nombre d'occurrence du caractère). +Huffman Adaptatif. L'intérêt de cet algorithme est de pouvoir maximiser la +compression d'une chaîne de caractères en combinant le codage fixe (e.g. ASCII) +et variable (e.g. Huffman). L'arbre résultant aura deux types de noeuds +différents. Les noeuds dit **externes** représenteront les caractères rencontrés +de la chaîne original et les des noeuds **internes** correspondront à la somme +des poids de ses enfants (i.e. nombre d'occurrence des caractères). Par +conséquent le poids de la racine de l'arbre doit être égal à la longueur de la +chaîne de caractère initiale. + +## Calcul des codes fixes + +Initialement, afin de calculer les codes fixes de chaque caractère nous devons +calculer les paramètres de Vitter $e$ et $r$. La valeur de ceux-ci dépendent +de la longueur de l'alphabet utilisé pour l'encodage. + +```python +def compute_vitter_params(m: int) -> tuple[int, int]: + e = math.floor(np.log2(m)) + r = m - (2 ** e) + return (e, r) +``` + +Étant donné que la longueur de notre alphabet est de 36, la valeur de $e$ est +égale à 5 et celle de $r$ est de 4. Sur la base de ses valeurs nous pouvons +donc calculer les codes fixes des divers caractères sur la base des règle +suivantes : + +- Si $0 \leq k \leq 2r$, alors le symbole $S_{k}$ est encodé par la +représentation binaire de $(k - 1)$ sur $(e + 1)$ + - où $k$ est la position du symbole dans l'alphabet trié +- Sinon, le symbole $S_{k}$ est encodé par la représentation binaire de +$(k - r - 1)$ sur $e$ bits. + +```python +def compute_k(char: str) -> int: + return DICT_ALPHABET[char] + + +def compute_code(char: str): + e, r = compute_vitter_params(len(LIST_ALPHABET)) + k_char = compute_k(char) + + if k_char <= 2*r: + bin_val = k_char - 1 + n_bits = e + 1 + return bin(bin_val)[2:].zfill(n_bits) + else: + bin_val = k_char - r - 1 + return bin(bin_val)[2:].zfill(e) +``` ## Structure de l'arbre @@ -369,3 +415,9 @@ Node(weight=9, value='v', left=None, ``` + +## Décodage + +Pour le décodage, nous allons appliquer l'algorithme présenté dans le cours +n°5. Celui-ci stripule qu'il est nécessaire de parcourir l'arbre au fur et à +mésure jusqu'à retrouver la feuille NYT. À ce moment il est -- GitLab