51 lines
1.1 KiB
C
51 lines
1.1 KiB
C
#include "../include/huf.h"
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
|
|
double* computeFrequencies(const char* filepath) {
|
|
double* frequencies = (double*) malloc(256 * sizeof(double));
|
|
int totalChars = 0;
|
|
|
|
// initialisation du tableau à 0
|
|
for (int i = 0; i < 256; i++) {
|
|
frequencies[i] = 0;
|
|
}
|
|
|
|
// parcours du fichier et comptage des caractères
|
|
FILE* file = fopen(filepath, "r");
|
|
char current;
|
|
|
|
while ((current = fgetc(file)) != EOF) {
|
|
frequencies[(size_t) current]++;
|
|
totalChars++;
|
|
}
|
|
|
|
// conversion des effectifs en fréquences
|
|
for (int i = 0; i < 256; i++) {
|
|
frequencies[i] /= totalChars;
|
|
}
|
|
|
|
return frequencies;
|
|
}
|
|
|
|
Vertex* buildTree(double* frequencies) {
|
|
int vertexCount = 0;
|
|
|
|
// on compte le nombre de sommets à allouer
|
|
// (uniquement les caractères qui apparaissent au moins une fois)
|
|
for (int i = 0; i < 256; i++) {
|
|
if (frequencies[i] > 0) {
|
|
vertexCount++;
|
|
}
|
|
}
|
|
|
|
// on alloue la place pour 2n + 1 sommets (nombre total
|
|
// de sommets dans l'arbre binaire)
|
|
Vertex* tree = (Vertex*) malloc((2 * vertexCount - 1) * sizeof(Vertex));
|
|
|
|
// (à faire: algo pour remplir l'arbre)
|
|
// (trier le tableau des fréquences ?)
|
|
|
|
return tree;
|
|
}
|