Double-chaînage de l'arbre

This commit is contained in:
Mattéo Delabre 2016-10-12 12:57:57 +02:00
parent 8ce897ce33
commit 1bedf2120e
3 changed files with 24 additions and 13 deletions

View File

@ -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

View File

@ -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];

View File

@ -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;
} }