Renommages pour consignes & début implémentation buildTree
This commit is contained in:
parent
6a109dd796
commit
9a48ee6a5e
4
Makefile
4
Makefile
|
@ -3,11 +3,11 @@ FLAGS=-Wall -std=c99
|
||||||
SRC=src
|
SRC=src
|
||||||
PROG=compress
|
PROG=compress
|
||||||
|
|
||||||
all: $(SRC)/main.o $(SRC)/freq.o
|
all: $(SRC)/main.o $(SRC)/huf.o
|
||||||
$(CC) $^ $(FLAGS) -o $(PROG)
|
$(CC) $^ $(FLAGS) -o $(PROG)
|
||||||
|
|
||||||
%.o: %.cpp
|
%.o: %.cpp
|
||||||
$(CC) $(FLAGS) -c $^
|
$(CC) $(FLAGS) -c $^
|
||||||
|
|
||||||
camille:
|
camille:
|
||||||
rm -f $(PROG) *.o *.gch
|
rm -f $(PROG) **/*.o **/*.gch
|
||||||
|
|
|
@ -0,0 +1,28 @@
|
||||||
|
#ifndef __FREQ_H__
|
||||||
|
#define __FREQ_H__
|
||||||
|
|
||||||
|
typedef struct Vertex Vertex;
|
||||||
|
struct Vertex {
|
||||||
|
// le double `freq` indique la fréquence d'apparition de la lettre
|
||||||
|
// du sommet dans le corpus, ou bien la somme des fréquences de ses fils
|
||||||
|
double frequency;
|
||||||
|
|
||||||
|
// le caractère `value` est le caractère du corpus que ce sommet
|
||||||
|
// représente (caractère ASCII 0 - 255)
|
||||||
|
char value;
|
||||||
|
|
||||||
|
// pointe vers le sommet parent à celui-ci (ou bien vers NULL s'il n'a
|
||||||
|
// pas de parent affecté, comme c'est le cas pour les sommets non-traités
|
||||||
|
// et pour la racine)
|
||||||
|
Vertex* parent;
|
||||||
|
};
|
||||||
|
|
||||||
|
// calcule un tableau des fréquences des caractères dans le corpus,
|
||||||
|
// indexé par la valeur numérique ASCII de chaque caractère
|
||||||
|
double* computeFrequencies(const char* filepath);
|
||||||
|
|
||||||
|
// déduit du tableau de fréquences l'arbre de Huffman, représenté
|
||||||
|
// par une liste de sommets chaînés
|
||||||
|
Vertex* buildTree(double* frequencies);
|
||||||
|
|
||||||
|
#endif
|
9
main.c
9
main.c
|
@ -1,9 +0,0 @@
|
||||||
#include "freq.h"
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
int main(int argc, char** argv) {
|
|
||||||
if (argc != 2) {
|
|
||||||
printf("Usage : compress <fichier>\n")
|
|
||||||
printf("Paramètre fichier manquant.\n");
|
|
||||||
}
|
|
||||||
}
|
|
29
src/freq.c
29
src/freq.c
|
@ -1,29 +0,0 @@
|
||||||
#include "freq.h"
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
double* computeFreq(const char* filepath) {
|
|
||||||
double* freq = (double*) malloc(256 * sizeof(double));
|
|
||||||
int totalChars = 0;
|
|
||||||
|
|
||||||
// initialisation du tableau à 0
|
|
||||||
for (int i = 0; i < 256; i++) {
|
|
||||||
freq[i] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// parcours du fichier et comptage des caractères
|
|
||||||
FILE* file = fopen(filepath, "r");
|
|
||||||
char current;
|
|
||||||
|
|
||||||
while ((current = fgetc(file)) != EOF) {
|
|
||||||
freq[(size_t) current]++;
|
|
||||||
totalChars++;
|
|
||||||
}
|
|
||||||
|
|
||||||
// conversion des effectifs en fréquences
|
|
||||||
for (int i = 0; i < 256; i++) {
|
|
||||||
freq[i] /= totalChars;
|
|
||||||
}
|
|
||||||
|
|
||||||
return freq;
|
|
||||||
}
|
|
|
@ -1 +0,0 @@
|
||||||
double* computeFreq(const char* filepath);
|
|
BIN
src/freq.o
BIN
src/freq.o
Binary file not shown.
|
@ -0,0 +1,50 @@
|
||||||
|
#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;
|
||||||
|
}
|
24
src/main.c
24
src/main.c
|
@ -0,0 +1,24 @@
|
||||||
|
#include "../include/huf.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
int main(int argc, const char** argv) {
|
||||||
|
if (argc != 2) {
|
||||||
|
printf("Usage : compress <fichier>\n");
|
||||||
|
printf("Paramètre fichier manquant.\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
double* frequencies = computeFrequencies(argv[1]);
|
||||||
|
double sum = 0;
|
||||||
|
|
||||||
|
for (int i = 0; i < 256; i++) {
|
||||||
|
if (frequencies[i] != 0) {
|
||||||
|
sum += frequencies[i];
|
||||||
|
printf("%c (%d) : %f\n", i, i, frequencies[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("Total : %f\n", sum);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
BIN
src/main.o
BIN
src/main.o
Binary file not shown.
Loading…
Reference in New Issue