aboutsummaryrefslogtreecommitdiff
path: root/semestre 2/informatique
diff options
context:
space:
mode:
Diffstat (limited to 'semestre 2/informatique')
-rw-r--r--semestre 2/informatique/10- Compression LZW.md30
-rw-r--r--semestre 2/informatique/9- Utilisation des listes.md10
-rw-r--r--semestre 2/informatique/tme/semaine9/Makefile4
-rw-r--r--semestre 2/informatique/tme/semaine9/multi_ensembles.c132
-rw-r--r--semestre 2/informatique/tme/semaine9/multi_ensembles.h16
-rw-r--r--semestre 2/informatique/tme/semaine9/test_multi_ensembles.c24
6 files changed, 211 insertions, 5 deletions
diff --git a/semestre 2/informatique/10- Compression LZW.md b/semestre 2/informatique/10- Compression LZW.md
new file mode 100644
index 0000000..d6956ae
--- /dev/null
+++ b/semestre 2/informatique/10- Compression LZW.md
@@ -0,0 +1,30 @@
+---
+tags:
+ - sorbonne
+ - informatique
+semestre: 2
+---
+LZW raisonne sur les syllables
+|> les strings sont remplacés par des codes plus court stocker dans une map
+|> n'a pas besoin d'analyser les strings pour compresser et n'a pas besoin de connaître la map pour décompresser
+
+Algo :
+- lit la chaîne la plus longue dans la map
+- remplace la chaîne lue par son code dans le fichier de sortie
+- insère une nouvelle chaîne composée du préfixe lu et du caractère suivant dans le fichier dans la map
+
+ En gros, ça fait ça pour `"ABCDABCD"` :
+ - `"A"` -> 65 (d'après la valeur initiale dans la map)
+ - `"AB"` -> 256 (d'après l'algo de la map)
+ - on enlève le préfixe `"A"` et on avance : `"BC"` -> 257 (toujours d'après l'algo)
+ - on enlève le préfixe `"B"` et on avance : `"CD"` -> 258 (...)
+ - on enlève le préfixe `"C"` et on avance : `"DA"` -> 259 (...)
+ - on enlève le préfixe `"D"` et on avance :`"AB"` -> déjà dans le dictionnaire, donc 256 ; on insère `"ABC"`
+ - on avance : `"ABCD"` -> déjà dans le dictionnaire, donc 258 ; on insère `"ABCD"`
+ -> si la valeur est déjà dans la map, alors on l'utilise comme préfixe pour le prochain, sinon on garde le plus grand
+
+Le fichier de sortie vaut donc : `65 66 67 68 256 258`
+|> on ne rajoute pas de suite `257` pour remplacer `65 66` car ça pourrait augmenter la taille
+
+Quand on décompresse, on a besoin d'utiliser le dictionnaire de base
+|> quand on arrive sur une séquence compresser, on a besoin de faire le raisonnement inverse de la compression : on détermine la chaîne qui aurait donné la valeur \ No newline at end of file
diff --git a/semestre 2/informatique/9- Utilisation des listes.md b/semestre 2/informatique/9- Utilisation des listes.md
index 8e8e093..db4e182 100644
--- a/semestre 2/informatique/9- Utilisation des listes.md
+++ b/semestre 2/informatique/9- Utilisation des listes.md
@@ -48,7 +48,7 @@ fifo *new_fifo(){
int is_empty(fifo f){
assert((f.last && f.first) || (!f.last && !f.first)); // permet de faire une vérification et de faire en sorte que le programme s'arrête proprement
- return !f.first && !f.last
+ return !f.first && !f.last;
}
void add(fifo *f, int val){
@@ -56,14 +56,14 @@ void add(fifo *f, int val){
cell *c = malloc(sizeof(cell));
c->suivant = NULL;
c->donnee = val;
- if (is_empty(f)) f->first = c;
+ if (is_empty(*f)) f->first = c;
else f->last->suivant = c;
f->last = c;
}
int pop(fifo *f){
if (!f || is_empty(f)) return 0;
- cell c = f->first;
+ cell *c = f->first;
int d = c->donnee;
f->first = c->suivant;
free(c);
@@ -76,10 +76,10 @@ void print_fifo(fifo *f){
printf("\n");
return;
}
- cell *first = fifo->first;
+ cell *first = f->first;
printf("{");
while (first){
- printf("%d, ", f->donnee);
+ printf("%d, ", first->donnee);
first = first->suivant;
}
printf("}\n");
diff --git a/semestre 2/informatique/tme/semaine9/Makefile b/semestre 2/informatique/tme/semaine9/Makefile
new file mode 100644
index 0000000..e961ede
--- /dev/null
+++ b/semestre 2/informatique/tme/semaine9/Makefile
@@ -0,0 +1,4 @@
+build-run:
+ gcc -o app multi_ensembles.c multi_ensembles.h test_multi_ensembles.c
+ ./app
+ rm app
diff --git a/semestre 2/informatique/tme/semaine9/multi_ensembles.c b/semestre 2/informatique/tme/semaine9/multi_ensembles.c
new file mode 100644
index 0000000..64a8a34
--- /dev/null
+++ b/semestre 2/informatique/tme/semaine9/multi_ensembles.c
@@ -0,0 +1,132 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include "multi_ensembles.h"
+
+
+/* Retourne un pointeur sur le premier element de valeur val, retourne NULL si aucun élément n'a la valeur val */
+element_t * Recherche_val(element_t *ensemble, int val) {
+ while (ensemble){
+ if (ensemble->valeur == val) return ensemble;
+ ensemble = ensemble->suivant;
+ }
+ return NULL;
+}
+
+/* Ajoute l'element val en tete de l'ensemble s'il n'apparait pas dans l'ensemble, augmente sa frequence de 1 sinon */
+element_t * Ajout_tete_ensemble(element_t *ensemble, int val, int freq) {
+ element_t *f = Recherche_val(ensemble, val);
+ if (f) {
+ f->frequence += freq;
+ return ensemble;
+ }
+ element_t *el = malloc(sizeof(element_t));
+ el->suivant = ensemble;
+ el->frequence = freq;
+ el->valeur = val;
+ return el;
+}
+
+
+/* Affche tous les elements d'un ensemble avec leur frequence */
+void Affiche_ensemble(element_t *ensemble) {
+ element_t *ptr = ensemble;
+
+ while (ptr != NULL) {
+ printf("val : %d, frequence : %d\n",ptr->valeur,ptr->frequence);
+ ptr=ptr->suivant;
+ }
+}
+
+/* Saisie des n elements d'un ensemble */
+element_t * Creation_ensemble(int n) {
+ element_t *ensemble=NULL;
+
+ int i = 0;
+ int val;
+
+ for (i=0; i < n; i++) {
+ printf("Saisie d'un entier: ");
+ scanf("%d",&val);
+ ensemble=Ajout_tete_ensemble(ensemble,val,1);
+ }
+ return ensemble;
+}
+
+element_t *Supprime_total_element_ensemble(element_t *ensemble, int val){
+ element_t *head = ensemble;
+ element_t *before = NULL;
+ while (ensemble){
+ element_t *toDelete = NULL;
+ if (ensemble->valeur == val){
+ if (before) before->suivant = ensemble->suivant;
+ else head = ensemble->suivant;
+ toDelete = ensemble;
+ } else before = ensemble;
+ ensemble = ensemble->suivant;
+ if (toDelete) free(toDelete);
+ }
+ return head;
+}
+
+element_t *Supprime_element_ensemble(element_t *ensemble, int val){
+ element_t *head = ensemble;
+ element_t *before = NULL;
+ while (ensemble){
+ element_t *toDelete = NULL;
+ if (ensemble->valeur == val){
+ ensemble->frequence--;
+ if (ensemble->frequence < 1){
+ if (before) before->suivant = ensemble->suivant;
+ else head = ensemble->suivant;
+ toDelete = ensemble;
+ }
+ } else before = ensemble;
+ ensemble = ensemble->suivant;
+ if (toDelete) free(toDelete);
+ }
+ return head;
+}
+
+element_t *Ajout_ensemble_trie(element_t *ensemble, int val, int freq){
+ if (!ensemble || ensemble->valeur > val) {
+ element_t *el = malloc(sizeof(element_t));
+ el->suivant = ensemble;
+ el->frequence = freq;
+ el->valeur = val;
+ return el;
+ }
+ element_t *head = ensemble;
+ while (ensemble && ensemble->valeur <= val){
+ if (ensemble->valeur == val) ensemble->frequence += freq;
+ else if (!ensemble->suivant || ensemble->suivant->valeur > val){
+ element_t *new = malloc(sizeof(element_t));
+ new->valeur = val;
+ new->frequence = freq;
+ new->suivant = ensemble->suivant;
+ ensemble->suivant = new;
+ ensemble = new; // empêche de passer deux fois sur la même valeur
+ }
+ ensemble = ensemble->suivant;
+ }
+ return head;
+}
+
+int Inclus(element_t *sub, element_t *ens){
+ while (ens && sub && ens->valeur <= sub->valeur){
+ if (sub->valeur == ens->valeur){
+ if (sub->frequence > ens->frequence) return 0;
+ else sub = sub->suivant;
+ }
+ ens = ens->suivant;
+ }
+ return sub == NULL;
+}
+
+int Intersection_vide(element_t *e1, element_t *e2){
+ while (e1 && e2){
+ if (e1->valeur == e2->valeur) return 0;
+ if (e1->valeur < e2->valeur) e1 = e1->suivant;
+ else e2 = e2->suivant;
+ }
+ return 1;
+}
diff --git a/semestre 2/informatique/tme/semaine9/multi_ensembles.h b/semestre 2/informatique/tme/semaine9/multi_ensembles.h
new file mode 100644
index 0000000..63c13aa
--- /dev/null
+++ b/semestre 2/informatique/tme/semaine9/multi_ensembles.h
@@ -0,0 +1,16 @@
+typedef struct _element_t element_t;
+struct _element_t{
+ int valeur;
+ int frequence;
+ element_t *suivant;
+};
+
+element_t *Recherche_val(element_t *ensemble, int val);
+element_t *Ajout_tete_ensemble(element_t *ensemble, int val, int freq);
+element_t *Ajout_ensemble_trie(element_t *ensemble, int val, int freq);
+element_t *Supprime_total_element_ensemble(element_t *ensemble, int val);
+element_t *Supprime_element_ensemble(element_t *ensemble, int val);
+void Affiche_ensemble(element_t *ensemble);
+element_t * Creation_ensemble(int n);
+int Inclus(element_t* sub, element_t *ens);
+int Intersection_vide(element_t *e1, element_t *e2);
diff --git a/semestre 2/informatique/tme/semaine9/test_multi_ensembles.c b/semestre 2/informatique/tme/semaine9/test_multi_ensembles.c
new file mode 100644
index 0000000..d141210
--- /dev/null
+++ b/semestre 2/informatique/tme/semaine9/test_multi_ensembles.c
@@ -0,0 +1,24 @@
+#include <stdio.h>
+#include "multi_ensembles.h"
+
+element_t *CreationMultiEnsemble(int deb, int n, int freq){
+ element_t *liste=NULL;
+ int i;
+
+ for (i=deb+n-1; i >=deb; i--) {
+ liste=Ajout_tete_ensemble(liste,i,freq);
+ }
+ return liste;
+}
+
+int main() {
+ element_t *ensemble1= CreationMultiEnsemble(1,20,1);
+ element_t *ensemble2= CreationMultiEnsemble(5,10,2);
+ Affiche_ensemble(ensemble1);
+ printf("====\n");
+ Affiche_ensemble(ensemble2);
+ printf("====\n");
+ printf("%d\n",Intersection_vide(ensemble1, ensemble2));
+ printf("%d\n",Intersection_vide(ensemble2, ensemble1));
+ return 0;
+}