10 Commits

Author SHA1 Message Date
abraham 3a34aa916b information pc test 2026-10-21 12:34:23 +02:00
abraham 3acfa79dcd EXO 4 - optimisation F5 2026-10-21 12:07:28 +02:00
abraham 22d249dd5e information sup 2026-10-21 11:51:47 +02:00
abraham 7c09526d0a fonction 10 : O(L) 2026-10-21 11:49:58 +02:00
abraham b40a1c2081 fonction 8 : O(S x k) 2026-10-21 11:44:36 +02:00
abraham dc5f6dbbd9 EXO 4 - optimisation F3 2026-10-21 11:39:59 +02:00
abraham 1b9c2aace2 prepare le merge 2026-10-21 11:36:11 +02:00
abraham 1ada0848f4 merge 2026-10-21 11:27:32 +02:00
abraham a5882012df fusion 2026-10-21 11:27:00 +02:00
Ozvann Abraham 310c57d1ff Merge pull request 'EXO 4 - optimisation F1' (#1) from framery/2026_TD3_DEV51_Qualite_Algo:main into main
Reviewed-on: abraham/2026_TD3_DEV51_Qualite_Algo#1
2026-10-21 11:25:48 +02:00
3 changed files with 53 additions and 63 deletions
+7 -7
View File
@@ -2,7 +2,7 @@
- Karl FRAMERY
- Ozvann ABRAHAM
CPU: Intel(R) Pentium(R) Silver N5030 (4) @ 3.10 GHz
# 1.Mesurer
@@ -84,25 +84,25 @@ La complexité de la fonction est de <span style="color:blue">[O(n)]</span> pour
# 4. Optimisation
- Optimisation de la fonction 1 nom du commit : ""
- Optimisation de la fonction 1 nom du commit : "EXO 4 - optimisation F1". Emprunte : ff68d260a7a58441
- Optimisation de la fonction 2 nom du commit : "fonction 2 : O(n + C)". Emprunte : ff68d260a7a58441
- Optimisation de la fonction 3 nom du commit : "". Emprunte : ff68d260a7a58441
- Optimisation de la fonction 3 nom du commit : "EXO 4 - optimisation F3". Emprunte : ff68d260a7a58441
- Optimisation de la fonction 4 nom du commit : "fonction 4 : O(n + J)". Emprunte : ff68d260a7a58441
- Optimisation de la fonction 5 nom du commit : "". Emprunte : ff68d260a7a58441
- Optimisation de la fonction 5 nom du commit : "EXO 4 - optimisation F5". Emprunte : ff68d260a7a58441
- Optimisation de la fonction 6 nom du commit : "". Emprunte : ff68d260a7a58441
- Optimisation de la fonction 7 nom du commit : "". Emprunte : ff68d260a7a58441
- Optimisation de la fonction 8 nom du commit : "". Emprunte : ff68d260a7a58441
- Optimisation de la fonction 8 nom du commit : "fonction 8 : O(S x k)". Emprunte : ff68d260a7a58441
- Optimisation de la fonction 9 nom du commit : "". Emprunte : ff68d260a7a58441
- Optimisation de la fonction 10 nom du commit : "". Emprunte : ff68d260a7a58441
- Optimisation de la fonction 10 nom du commit : "fonction 10 : O(L)". Emprunte : ff68d260a7a58441
Le temps minimal atteint avec les modification est de 1.651 secondes.
BIN
View File
Binary file not shown.
+46 -56
View File
@@ -88,18 +88,17 @@ void trier_par_montant(Transaction *t, int n)
/* F2 : nombre de clients ayant au moins une transaction */
int nb_clients_distincts(const Transaction *t, int n)
{
int clients_vus[NB_CLIENTS] = {0};
int nb = 0;
for (int i = 0; i < n; i++) {
int deja_vu = 0;
for (int j = 0; j < i; j++) {
if (t[j].client == t[i].client) {
deja_vu = 1;
break;
}
}
if (!deja_vu)
int client = t[i].client;
if (!clients_vus[client]) {
clients_vus[client] = 1;
nb++;
}
}
return nb;
}
@@ -119,19 +118,18 @@ void total_par_jour(const Transaction *t, int n, long *totaux)
{
for (int j = 0; j < NB_JOURS; j++) {
totaux[j] = 0;
for (int i = 0; i < n; i++)
if (t[i].jour == j)
totaux[j] += t[i].montant;
}
for (int i = 0; i < n; i++)
totaux[t[i].jour] += t[i].montant;
}
/* F5 : période de jours consécutifs dont la somme des soldes est maximale en O(J) */
/* F5 : période de jours consécutifs dont la somme des soldes est maximale */
long meilleure_periode(const long *totaux, int nb_jours, int *debut, int *fin)
{
long meilleur = totaux[0];
*debut = 0;
*fin = 0;
long somme_courante = totaux[0];
int debut_courant = 0;
@@ -148,7 +146,6 @@ long meilleure_periode(const long *totaux, int nb_jours, int *debut, int *fin)
*fin = j;
}
}
return meilleur;
}
@@ -162,45 +159,13 @@ const Transaction *rechercher_par_id(const Transaction *t, int n, int id)
}
/* F7 : nombre de paires de transactions de montants opposés (a + b = 0) */
static int cmp_long(const void *a, const void *b)
{
long x = *(const long *)a;
long y = *(const long *)b;
return (x > y) - (x < y);
}
long nb_paires_opposees(const Transaction *t, int n)
{
/* 1. Copier et trier les montants : O(n log n) */
long *m = malloc(n * sizeof(long));
for (int i = 0; i < n; i++) {
m[i] = t[i].montant;
}
qsort(m, n, sizeof(long), cmp_long);
/* 2. Deux pointeurs : O(n) au lieu de O(n²) */
long nb = 0;
int g = 0, d = n - 1;
while (g < d) {
long somme = m[g] + m[d];
if (somme < 0) {
g++;
} else if (somme > 0) {
d--;
} else {
/* somme == 0 : on compte tous les m[d] identiques en face de m[g] */
for (int k = d; k > g && m[k] == m[d]; k--) {
for (int i = 0; i < n; i++)
for (int j = i + 1; j < n; j++)
if (t[i].montant + t[j].montant == 0)
nb++;
}
g++; /* Puis on passe simplement au m[g] suivant ! */
}
}
free(m);
return nb;
}
@@ -210,12 +175,31 @@ static const int PIECES[] = {1, 2, 5, 10, 20, 50, 100, 200};
long nb_facons_rendre(int somme, int nb_pieces)
{
if (somme < 0 || nb_pieces < 0)
return 0;
if (somme == 0)
return 1;
if (somme < 0 || nb_pieces == 0)
if (nb_pieces == 0)
return 0;
return nb_facons_rendre(somme - PIECES[nb_pieces - 1], nb_pieces) +
nb_facons_rendre(somme, nb_pieces - 1);
if (nb_pieces > NB_PIECES)
nb_pieces = NB_PIECES;
long *combinaisons = malloc((somme + 1) * sizeof(long));
if (combinaisons == NULL)
return 0;
for (int montant = 0; montant <= somme; montant++)
combinaisons[montant] = 0;
combinaisons[0] = 1;
for (int i = 0; i < nb_pieces; i++) {
for (int montant = PIECES[i]; montant <= somme; montant++)
combinaisons[montant] += combinaisons[montant - PIECES[i]];
}
long resultat = combinaisons[somme];
free(combinaisons);
return resultat;
}
/* F9 : catégorie d'une transaction (pour les statistiques) */
@@ -255,10 +239,16 @@ int categorie(const Transaction *t)
/* F10 : ajoute une ligne à la fin du rapport */
int longueur(const char *s)
{
int n = 0;
while (s[n] != '\0')
n++;
return n;
static const char *chaine_connue = NULL;
static int n_connu = 0;
if (s != chaine_connue || s[0] == '\0') {
chaine_connue = s;
n_connu = 0;
}
while (s[n_connu] != '\0')
n_connu++;
return n_connu;
}
void ajouter_ligne(char *rapport, const char *ligne)