Benjamin Dupont et Jean-Jacques BOURDIN
Benjamin.Dupont NOSPAM @ univ-paris8.fr
(enlever le NO Spam)
jj NOSPAM @ up8.edu
(enlever le NO Spam)
Compression d'Images
L'essentiel de ce cours est présenté par Benjamin Dupont et est donc présent sur sa page de cours
/* Arbres binaires tout simplement */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
struct noeud {
int num;
float val;
struct noeud * sg;
struct noeud * sd;
} ;
typedef struct noeud noeud;
typedef struct noeud * arbre;
void afficharbre (arbre) ;
arbre ajout (arbre a, int v, float x) {
arbre new;
int rande;
if (! a) {
new = (arbre) malloc (sizeof (noeud));
new->num = v;
new->val = x;
new->sg = (arbre) 0;
new->sd = (arbre) 0;
return new;
}
rande = rand ();
printf(" insere %d en %d avec %2d\n", v, a->num, rande %10);
if (rande & 0x01) {
/* on le met à gauche*/
if (! (a->sg)) {
/* s’il ny a pas de fils gauche */
a->sg = (arbre) malloc (sizeof (noeud));
a->sg->num = v;
a->sg->val = x;
a->sg->sg = (arbre) 0;
a->sg->sd = (arbre) 0;
return a;
}
a->sg = ajout(a->sg, v, x);
return a;
}
/* on le met donc a droite*/
if (! (a->sd)) {
/* s’il ny a pas de fils droit */
a->sd = (arbre) malloc (sizeof (noeud));
a->sd->num = v;
a->sd->val = x;
a->sd->sg = (arbre) 0;
a->sd->sd = (arbre) 0;
return a;
}
a->sd = ajout(a->sd, v, x);
return a;
}
arbre creation (int n) {
arbre a;
float x, y;
x = 1.5;
y = 0.21;
a = (arbre) 0;
/*
srand(time(NULL));
*/
while (n--) {
a = ajout (a, n, x);
printf("\n");
x += y;
y += 0.06;
if (x > 3.0 || x < -2.0) {
y = - y;
}
}
return a;
}
void afficharbre (arbre a) {
if (a) {
afficharbre (a->sg);
printf("%d %3.2f ", a->num, a->val);
afficharbre (a->sd);
}
}
void blancs (int n) {
while (n--)
printf(" ");
}
void voisarbre (arbre a, int nbb) {
if (a) {
voisarbre (a->sg, nbb + 1);
blancs (nbb);
printf(" %2d %d %3.2f\n", nbb, a->num, a->val);
voisarbre (a->sd, nbb + 1);
}
}
int main () {
int n;
arbre a, b;
n = 20;
a = creation (n);
afficharbre (a);
printf("\n\n");
voisarbre (a,0);
}
|
#include <stdio.h>
#include <stdlib.h>
#define NBN 4
struct noeud {
int nb;
float val;
struct noeud * fils [NBN];
} ;
typedef struct noeud noeud;
typedef struct noeud * arbre;
typedef unsigned int uint;
arbre consarb (int);
arbre addarb (int, arbre);
void afficharbre (arbre);
void afficharb (arbre, uint);
uint occur (int, arbre), occurv (float, arbre);
|
#include "arb.h"
float calcul (int n) {
static float v = 1.0;
switch (n%3) {
case 0:
v += 0.5;
break;
case 1:
v += 0.5;
break;
case 2:
v = 1.0;
}
return v;
}
arbre consarb (int n) {
arbre racine, a;
int i, nn;
if (!n) {
return NULL;
}
nn = n;
racine = (arbre) malloc (sizeof(noeud));
racine->nb = nn;
racine->val = calcul(n);
for (i=0; i < NBN; i++)
racine->fils[i] = NULL;
while (--nn) {
racine = addarb (nn, racine);
}
nn = n;
while (--nn) {
racine = addarb (nn, racine);
}
return racine;
}
arbre addarb (int n, arbre a) {
arbre crt;
int i, j;
for (i = 0; i < NBN; i++) {
if (! a->fils[i]) {
crt = (arbre) malloc (sizeof(noeud));
// crt = (noeud) malloc (sizeof(noeud));
a->fils[i] = crt;
crt = a->fils[i];
crt->nb = n;
crt->val = calcul (n);
for (j = 0; j < NBN; j++)
crt->fils[j] = NULL;
return a;
}
}
a->fils[0] = addarb(n, a->fils[0]);
return a;
}
uint yest (int n, arbre a) {
uint nbf, i, k;
if (! a)
return (uint) 0;
if (n == a->nb)
return (uint) 1;
for (i = 0; i < NBN ; i++)
if (yest (n, a->fils[i]))
return (uint) 1;
return (uint) 0;
}
|
struct graph {
int nbn;
int * v;
} ;
typedef struct graph graph_t;
|
int voir (graph_t g, int i, int j) {
if (i < 0 || i >= g.nbn)
return -1;
if (j < 0 || j >= g.nbn)
return -1;
return *(g.v + j * g.nbn + i);
}
void placer (graph_t g, int i, int j, int val) {
if (i < 0 || i >= g.nbn)
return ;
if (j < 0 || j >= g.nbn)
return ;
*(g.v + j * g.nbn + i) = val;
}
|
graph_t construire (int nb) {
graph_t g;
int nbcarre, i, num;
float taux, v;
nbcarre = nb * nb;
g.nbn = nb;
g.v = (int *) malloc (nbcarre * sizeof(int));
assert (g.v);
memset (g.v, 0, (size_t) nbcarre * sizeof(int));
srand(time(NULL));
taux = 0.25;
num = nb / 10;
while (num > 1) {
num /= 5;
taux /= 3.0;
}
for (i = 0; i < nbcarre; i++) {
v = (float) rand () / RAND_MAX;
num = v > taux ? 0 : 1;
*(g.v + i) = num;
}
return g;
}
|
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#define MAX 5
struct noeud {
int n;
int h;
float l;
float surf;
struct noeud * suc [3];
} ;
typedef struct noeud noeud;
typedef struct noeud * tas;
tas creenoeud (int nb) {
tas t;
t = (tas) malloc (sizeof(noeud));
assert(t);
t->n = nb;
t->h = nb + 4;
t->l = 11.0 - (float) ((t->h) << 1);
if (t->l < 0)
t->l *= -1.0;
t->suc[0] = (tas) 0;
t->suc[1] = (tas) 0;
t->suc[2] = (tas) 0;
t->surf = 0.0;
return t;
}
tas creetas () {
tas t[5];
int i;
for (i = 0; i < 5; i++) {
t[i] = creenoeud (i);
}
t[0]->suc[0] = t[4];
t[0]->suc[1] = (tas) 0;
t[0]->suc[2] = t[2];
t[1]->suc[0] = t[0];
t[1]->suc[2] = (tas) 0;
t[1]->suc[1] = t[3];
t[2]->suc[0] = (tas) 0;
t[2]->suc[1] = (tas) 0;
t[2]->suc[2] = t[4];
t[3]->suc[0] = (tas) 0;
t[3]->suc[1] = t[0];
t[3]->suc[2] = t[2];
t[4]->suc[0] = t[2];
t[4]->suc[1] = t[3];
t[4]->suc[2] = t[1];
return t[0];
}
void goaffichetas (tas t, char boo [MAX]) {
if (!t)
return;
if (boo [t->n])
return;
printf(" %d \t %d \t %f \t%f \n", t->n, t->h, t->l, t->surf);
printf(" %d \t %d", (int) ((long long int) t % 10000), (int) ((long long int) t->suc[0] % 10000));
printf(" %d \t %d \n", (int) ((long long int) t->suc[1] % 10000), (int) ((long long int) t->suc[2] % 10000));
boo[t->n] = 1;
goaffichetas(t->suc[0], boo);
goaffichetas(t->suc[1], boo);
goaffichetas(t->suc[2], boo);
}
void affichetas (tas t) {
char boo [MAX];
int i;
for (i = 0; i < MAX; i++)
boo[i] = 0;
goaffichetas (t, boo);
}
float absf (float x) {
if (x < 0.0)
return - x;
return x;
}
void remplirsurf (tas t) {
if (! t)
return;
if (t->surf != 0.0)
return;
t->surf = t->h * t->l;
remplirsurf (t->suc[0]);
remplirsurf (t->suc[1]);
remplirsurf (t->suc[2]);
}
int main () {
tas t;
t = creetas ();
affichetas(t);
printf("\n\n");
remplirsurf(t);
affichetas(t);
}
|
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <assert.h>
typedef short unsigned Shu;
struct graphe {
int nbs;
Shu * tab;
} ;
typedef struct graphe graphe;
graphe creegraphe (int nbs) {
Shu i, j, max, num;
float v, taux;
graphe g;
g.nbs = nbs;
max = nbs * nbs;
taux = 25.0;
num = nbs / 10;
while (num > 1) {
num /= 5;
taux /= 3.0;
}
taux /= 100.0;
printf("taux %g\n", taux);
g.tab = (Shu *) malloc (max * sizeof(Shu));
assert(g.tab);
memset(g.tab, 0, max);
srand(time(NULL));
for (num = 0, i = 0; i < nbs; i++)
for (j = 0; j < nbs; j++) {
v = (float) rand () / RAND_MAX;
g.tab[num++] = v < taux ? 1 : 0;
}
return g;
}
void voirgraf (graphe g) {
Shu i, j, nb, num;
nb = g.nbs;
printf("Graphe\n");
for (i = 0, num = 0; i < nb; i++) {
for (j = 0; j < nb; j++)
printf("%c ", g.tab[num++]? '1' : ' ');
printf("\n");
}
}
Shu nbnonnuls (graphe g) {
Shu i, j, nb, num, total;
nb = g.nbs;
total = 0;
printf("Graphe\n");
for (i = 0, num = 0; i < nb; i++) {
for (j = 0; j < nb; j++)
total += g.tab[num++];
}
return total;
}
int main () {
graphe g;
int nb;
Shu to;
nb = 10;
g = creegraphe (nb);
voirgraf(g);
to = nbnonnuls(g);
printf("Pour %d il y a %d cases non vides\n soit %f %% \n", nb, to, (to * 100.0)/(nb * nb));
nb = 50;
g = creegraphe (nb);
to = nbnonnuls(g);
printf("Pour %d il y a %d cases non vides\n soit %f %% \n", nb, to, (to * 100.0)/(nb * nb));
nb = 500;
g = creegraphe (nb);
to = nbnonnuls(g);
printf("Pour %d il y a %d cases non vides\n soit %f %% \n", nb, to, (to * 100.0)/(nb * nb));
}
/*taux 0.25
Graphe
1
1 1
1 1
1
1 1 1
1 1 1 1
1 1 1
1
1 1 1 1
1 1 1 1
Graphe
Pour 10 il y a 25 cases non vides
soit 25.000000 %
taux 0.0833333
Graphe
Pour 50 il y a 212 cases non vides
soit 8.480000 %
taux 0.00925926
Graphe
Pour 500 il y a 2333 cases non vides
soit 0.933200 %
*/
|
graphe creegraphe (int nbs) {
Shu i, j, max, num;
float v, taux;
graphe g;
g.nbs = nbs;
max = nbs * nbs;
taux = 25.0;
num = nbs / 10;
while (num > 1) {
num /= 5;
taux /= 3.0;
}
taux /= 100.0;
printf("taux %g\n", taux);
g.tab = (Shu *) malloc (max * sizeof(Shu));
memset(g.tab, 0, max);
srand(time(NULL));
for (num = 0, i = 0; i < nbs; i++)
for (j = 0; j < nbs; j++) {
v = (float) rand () / RAND_MAX;
g.tab[num++] = v < taux ? (Shu) (v * 1000.) : 0;
}
return g;
}
|
La principale méthode consiste à ne pas conserver les 0, donc à conserver par exemple des triplets (départ, arrivée, poids) (ou encore (i,j,arête)).
Nous avons donc une structure triplet et un vecteur de triplets.
struct triplet {
int i;
int j;
float poids;
} ;
typedef struct triplet triple_t;
struct gramaco {
int nbs; /* nombre de sommets*/
int nba; /* nombre d aretes*/
triple * ares; /* vecteur d aretes*/
}
typedef struct gramaco gramaco_t;
|
/* nombre maximal de noeuds */
/* il faut un tableau de tous les noeuds */
struct lesnoeuds {
int vu;
ptnoeud ne;
};
typedef struct lesnoeuds legraphe [MAX];
/* structure d’un noeud */
struct noeud {
int num;
int nbs;
struct noeud * * succ;
float * poids;
};
/* succ est un vecteur de pointeurs, un pointeur par successeur*/
/* poids est un vecteur de poids, un poids par successeur*/
/* si le graphe est non pondéré, on peut enlever cela*/
typedef struct noeud noeud;
typedef struct noeud * ptnoeud;
|
#define MAX 1000
/* nombre maximal de noeuds */
/* il faut un tableau de tous les noeuds */
struct lesnoeuds {
int vu;
ptnoeud ne;
};
typedef struct lesnoeuds legraphe [MAX];
/* structure d’un noeud */
struct noeud {
int num;
struct aretes * next;
};
typedef struct noeud noeud;
typedef struct noeud * ptnoeud;
/* structure de liste de successeurs */
struct aretes {
ptnoeud pt;
float poids;
struct aretes * suiv;
} ;
typedef struct aretes aretes;
typedef struct aretes * ptarete;
|
-5 -4 -3 -2 -1 0 +1 +2 +3 +4 +5 0 4 4 1 0 0 3 2 1 0 1 +4 -3 -4 +5 -5 0 +1 +2 -2 -1 +3Il ne reste plus qu’à donner une représentation informatique et à faire tourner les programmes.
struct strand {
Shu node;
short next;
};
typedef struct strand strand;
struct strandgraph {
Shu nbs;
Shu nbstr;
short * node; /* first strand*/
strand * nxt;/* node and next strand*/
} ;
typedef struct strandgraph strgr;
|
Dernière mise à jour : 25/10/2022 (15h)