Double-chaînage de l'arbre
This commit is contained in:
parent
8ce897ce33
commit
1bedf2120e
|
@ -7,6 +7,7 @@
|
||||||
#define FALSE 0
|
#define FALSE 0
|
||||||
#define NUM_CHARS 256
|
#define NUM_CHARS 256
|
||||||
|
|
||||||
|
// structure représentant un sommet d'un arbre de Huffman
|
||||||
typedef struct Vertex Vertex;
|
typedef struct Vertex Vertex;
|
||||||
struct Vertex {
|
struct Vertex {
|
||||||
// le double `freq` indique la fréquence d'apparition de la lettre
|
// le double `freq` indique la fréquence d'apparition de la lettre
|
||||||
|
@ -17,18 +18,24 @@ struct Vertex {
|
||||||
// représente (caractère ASCII 0 - 255)
|
// représente (caractère ASCII 0 - 255)
|
||||||
char value;
|
char value;
|
||||||
|
|
||||||
// les sommets virtuels sont ceux qui ne correspondent pas à une lettre
|
|
||||||
// du corpus, mais chapeautent les autres sommets
|
|
||||||
int is_virtual;
|
|
||||||
|
|
||||||
// pointe vers le sommet parent à celui-ci, ou NULL s'il n'a pas de parent,
|
// pointe vers le sommet parent à celui-ci, ou NULL s'il n'a pas de parent,
|
||||||
// comme par exemple pour la racine et les sommets en cours de traitement
|
// comme par exemple pour la racine et les sommets en cours de traitement
|
||||||
Vertex* parent;
|
Vertex* parent;
|
||||||
|
|
||||||
|
// pointe vers les deux enfants de ce sommet, ou NULL s'il n'a pas
|
||||||
|
// d'enfants, comme par exemple pour les feuilles
|
||||||
|
Vertex *child_l, *child_r;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// structure représentant un arbre de Huffman
|
||||||
typedef struct Tree Tree;
|
typedef struct Tree Tree;
|
||||||
struct Tree {
|
struct Tree {
|
||||||
|
// quantité de sommets dans l'arbre. Le tableau des sommets contient
|
||||||
|
// exactement `size` éléments
|
||||||
size_t size;
|
size_t size;
|
||||||
|
|
||||||
|
// tableau contenant les sommets de l'arbre, liés à leur parent,
|
||||||
|
// excepté pour la racine
|
||||||
Vertex* vertices;
|
Vertex* vertices;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -36,8 +43,7 @@ struct Tree {
|
||||||
// indexé par la valeur numérique ASCII de chaque caractère
|
// indexé par la valeur numérique ASCII de chaque caractère
|
||||||
double* computeFrequencies(const char* filepath);
|
double* computeFrequencies(const char* filepath);
|
||||||
|
|
||||||
// déduit du tableau de fréquences l'arbre de Huffman, représenté
|
// déduit d'un tableau de fréquences de caractères un arbre de Huffman
|
||||||
// par une liste de sommets chaînés
|
|
||||||
Tree buildTree(double* frequencies);
|
Tree buildTree(double* frequencies);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
11
src/huf.c
11
src/huf.c
|
@ -52,8 +52,10 @@ Tree buildTree(double* frequencies) {
|
||||||
if (frequencies[i] > 0) {
|
if (frequencies[i] > 0) {
|
||||||
vertices[next_available].frequency = frequencies[i];
|
vertices[next_available].frequency = frequencies[i];
|
||||||
vertices[next_available].value = (char) i;
|
vertices[next_available].value = (char) i;
|
||||||
vertices[next_available].is_virtual = FALSE;
|
|
||||||
vertices[next_available].parent = NULL;
|
vertices[next_available].parent = NULL;
|
||||||
|
vertices[next_available].child_l = NULL;
|
||||||
|
vertices[next_available].child_r = NULL;
|
||||||
|
|
||||||
next_available++;
|
next_available++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -95,12 +97,13 @@ Tree buildTree(double* frequencies) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// création d'un sommet parent à ces deux sommets. Ce sommet est
|
// création d'un sommet virtuel parent de ces deux sommets
|
||||||
// créé à la prochaine position disponible dans le tableau
|
// ce sommet est créé à la première position libre dans le tableau
|
||||||
vertices[next_available].frequency =
|
vertices[next_available].frequency =
|
||||||
vertices[min_vert].frequency + vertices[min_vert_sec].frequency;
|
vertices[min_vert].frequency + vertices[min_vert_sec].frequency;
|
||||||
vertices[next_available].is_virtual = TRUE;
|
|
||||||
vertices[next_available].parent = NULL;
|
vertices[next_available].parent = NULL;
|
||||||
|
vertices[next_available].child_l = &vertices[min_vert];
|
||||||
|
vertices[next_available].child_r = &vertices[min_vert_sec];
|
||||||
|
|
||||||
// assignation du nouveau parent et des enfants
|
// assignation du nouveau parent et des enfants
|
||||||
vertices[min_vert].parent = &vertices[next_available];
|
vertices[min_vert].parent = &vertices[next_available];
|
||||||
|
|
|
@ -30,12 +30,14 @@ int main(int argc, const char** argv) {
|
||||||
Vertex* vertex = &tree.vertices[i];
|
Vertex* vertex = &tree.vertices[i];
|
||||||
|
|
||||||
printf(
|
printf(
|
||||||
"[%p] Sommet %c (%4f, %s) : parent %p\n",
|
"[%8p] Sommet %c (%4f) : parent %8p, enfants %8p %8p\n",
|
||||||
(void*) vertex, vertex->value, vertex->frequency,
|
(void*) vertex, vertex->value, vertex->frequency,
|
||||||
vertex->is_virtual ? "est virtuel" : "non virtuel",
|
(void*) vertex->parent, (void*) vertex->child_l,
|
||||||
(void*) vertex->parent
|
(void*) vertex->child_r
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
printf("\n\n--- 3 : ATTRIBUTION DES CODES ---\n\n");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue