Skip to content
Snippets Groups Projects
Verified Commit d0557710 authored by iliya.saroukha's avatar iliya.saroukha :first_quarter_moon:
Browse files

feat: added part about vitter params

parent 8d8fbe98
Branches
No related tags found
No related merge requests found
...@@ -232,10 +232,56 @@ l'inverse quantifiée. ...@@ -232,10 +232,56 @@ l'inverse quantifiée.
# Huffman Adaptatif # Huffman Adaptatif
Dans ce travail pratique nous allons implémenter l'algorithme de compression 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ù Huffman Adaptatif. L'intérêt de cet algorithme est de pouvoir maximiser la
chaque noeud **externe** représentera un caractère dans la chaîne fournie pour compression d'une chaîne de caractères en combinant le codage fixe (e.g. ASCII)
l'encodage et la valeur des noeuds **internes** correspondra à la somme des et variable (e.g. Huffman). L'arbre résultant aura deux types de noeuds
poids de ses enfants (i.e. nombre d'occurrence du caractère). 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 ## Structure de l'arbre
...@@ -369,3 +415,9 @@ Node(weight=9, ...@@ -369,3 +415,9 @@ Node(weight=9,
value='v', value='v',
left=None, 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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment