forked from abraham/2026_TD3_DEV51_Qualite_Algo
Compare commits
10 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 3a34aa916b | |||
| 3acfa79dcd | |||
| 22d249dd5e | |||
| 7c09526d0a | |||
| b40a1c2081 | |||
| dc5f6dbbd9 | |||
| 1b9c2aace2 | |||
| 1ada0848f4 | |||
| a5882012df | |||
| 310c57d1ff |
+7
-7
@@ -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.
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user