From 64e3432b33a79511fac66aa9cce5e3f2f9dcf008 Mon Sep 17 00:00:00 2001 From: Karl_FRAM Date: Wed, 21 Oct 2026 11:58:37 +0200 Subject: [PATCH] EXO 4 - optimisation F5 --- banque | Bin 21160 -> 21576 bytes banque.c | 392 +++++-------------------------------------------------- 2 files changed, 32 insertions(+), 360 deletions(-) diff --git a/banque b/banque index c38444be23ae4dfa5dfba4c270ce8692673394c3..b24d472e3f626018fdf3457b3ef4d731260e6d89 100755 GIT binary patch delta 8344 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 K#W>l^TMhu_SbUWL delta 7517 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 p^q= -#include - -#define NB_TRANSACTIONS 30000 -#define NB_CLIENTS 2000 -#define NB_JOURS 1000 -#define NB_REQUETES 30000 -#define MONTANT_MONNAIE 400 -#define GRAINE 20261020UL - -typedef struct { - int id; - int client; - int jour; - long montant; /* en centimes, négatif pour un débit */ -} Transaction; - -/* ------------------------------------------------------------------ */ -/* Données (ne pas modifier) */ -/* ------------------------------------------------------------------ */ - -static unsigned long etat_alea = GRAINE; - -unsigned long alea(void) -{ - etat_alea = etat_alea * 6364136223846793005UL + 1442695040888963407UL; - return etat_alea >> 33; -} - -Transaction *generer_transactions(int n) -{ - Transaction *t = malloc(n * sizeof(Transaction)); - for (int i = 0; i < n; i++) { - t[i].id = i; - t[i].client = alea() % NB_CLIENTS; - t[i].jour = alea() % NB_JOURS; - if (i > 0 && alea() % 20 == 0) - t[i].montant = -t[alea() % i].montant; /* opération inverse */ - else - t[i].montant = (long)(alea() % 100001) - 50000; - } - for (int i = n - 1; i > 0; i--) { /* mélange des id */ - int j = alea() % (i + 1); - int tmp = t[i].id; - t[i].id = t[j].id; - t[j].id = tmp; - } - return t; -} - -/* ------------------------------------------------------------------ */ -/* Fonctions à analyser et à optimiser */ -/* ------------------------------------------------------------------ */ - -/* F1 : trie les transactions par montant croissant, puis par id */ -void trier_par_montant(Transaction *t, int n) -{ - for (int i = 1; i < n; i++) { - Transaction cle = t[i]; - int j = i - 1; - while (j >= 0 && (t[j].montant > cle.montant || - (t[j].montant == cle.montant && t[j].id > cle.id))) { - t[j + 1] = t[j]; - j--; - } - t[j + 1] = cle; - } -} - -/* F2 : nombre de clients ayant au moins une transaction */ -int nb_clients_distincts(const Transaction *t, int n) -{ - 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) - nb++; - } - return nb; -} - -/* F3 : solde total de chaque client en O(n + c) */ -void total_par_client(const Transaction *t, int n, long *totaux) -{ - for (int c = 0; c < NB_CLIENTS; c++) { - totaux[c] = 0; - } - for (int i = 0; i < n; i++) { - totaux[t[i].client] += t[i].montant; - } -} - -/* F4 : solde total de chaque jour */ -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; - } -} - -/* 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; - for (int i = 0; i < nb_jours; i++) { - for (int j = i; j < nb_jours; j++) { - long somme = 0; - for (int k = i; k <= j; k++) - somme += totaux[k]; - if (somme > meilleur) { - meilleur = somme; - *debut = i; - *fin = j; - } - } - } - return meilleur; -} - -/* F6 : retrouve une transaction à partir de son id */ -const Transaction *rechercher_par_id(const Transaction *t, int n, int id) -{ - for (int i = 0; i < n; i++) - if (t[i].id == id) - return &t[i]; - return NULL; -} - -/* F7 : nombre de paires de transactions de montants opposés (a + b = 0) */ -long nb_paires_opposees(const Transaction *t, int n) -{ - long nb = 0; - for (int i = 0; i < n; i++) - for (int j = i + 1; j < n; j++) - if (t[i].montant + t[j].montant == 0) - nb++; - return nb; -} - -/* F8 : nombre de façons de rendre une somme avec les pièces disponibles */ -static const int PIECES[] = {1, 2, 5, 10, 20, 50, 100, 200}; -#define NB_PIECES 8 - -long nb_facons_rendre(int somme, int nb_pieces) -{ - if (somme == 0) - return 1; - if (somme < 0 || nb_pieces == 0) - return 0; - return nb_facons_rendre(somme - PIECES[nb_pieces - 1], nb_pieces) + - nb_facons_rendre(somme, nb_pieces - 1); -} - -/* F9 : catégorie d'une transaction (pour les statistiques) */ -int categorie(const Transaction *t) -{ - if (t->montant < 0) { - if (t->montant < -20000) { - if (t->jour % 7 == 5 || t->jour % 7 == 6) - return 1; - else - return 2; - } else if (t->montant < -5000) { - return 3; - } else { - if (t->client % 10 == 0) - return 4; - return 5; - } - } else if (t->montant == 0) { - return 0; - } else { - if (t->montant > 30000) { - if (t->client % 10 == 0 && t->jour % 7 < 5) - return 6; - return 7; - } else if (t->montant > 10000) { - return 8; - } else if (t->montant > 1000) { - if (t->jour % 30 == 0) - return 9; - return 10; - } - return 11; - } -} - -/* F10 : ajoute une ligne à la fin du rapport */ -int longueur(const char *s) -{ - int n = 0; - while (s[n] != '\0') - n++; - return n; -} - -void ajouter_ligne(char *rapport, const char *ligne) -{ - int fin = longueur(rapport); - int i = 0; - while (ligne[i] != '\0') { - rapport[fin + i] = ligne[i]; - i++; - } - rapport[fin + i] = '\0'; -} - -/* ------------------------------------------------------------------ */ -/* Programme principal (à adapter si vous changez les signatures) */ -/* ------------------------------------------------------------------ */ - -unsigned long empreinte(const char *s) -{ - unsigned long h = 1469598103934665603UL; - for (int i = 0; s[i] != '\0'; i++) { - h ^= (unsigned char)s[i]; - h *= 1099511628211UL; - } - return h; -} - -int main(void) -{ - Transaction *t = generer_transactions(NB_TRANSACTIONS); - char *rapport = malloc(1 << 20); - char ligne[128]; - rapport[0] = '\0'; - - /* recherches par id, dans l'ordre d'origine */ - long somme_requetes = 0; - unsigned long etat = 12345; - for (int q = 0; q < NB_REQUETES; q++) { - etat = etat * 1103515245UL + 12345UL; - const Transaction *r = rechercher_par_id(t, NB_TRANSACTIONS, (int)((etat >> 8) % NB_TRANSACTIONS)); - if (r != NULL) - somme_requetes += r->montant; - } - - int nb_clients = nb_clients_distincts(t, NB_TRANSACTIONS); - - static long totaux_clients[NB_CLIENTS]; - total_par_client(t, NB_TRANSACTIONS, totaux_clients); - - static long totaux_jours[NB_JOURS]; - total_par_jour(t, NB_TRANSACTIONS, totaux_jours); - int debut, fin; - long meilleure = meilleure_periode(totaux_jours, NB_JOURS, &debut, &fin); - - long nb_paires = nb_paires_opposees(t, NB_TRANSACTIONS); - - int categories[12] = {0}; - for (int i = 0; i < NB_TRANSACTIONS; i++) - categories[categorie(&t[i])]++; - - trier_par_montant(t, NB_TRANSACTIONS); - - long nb_facons = nb_facons_rendre(MONTANT_MONNAIE, NB_PIECES); - - /* rapport */ - snprintf(ligne, sizeof(ligne), "clients distincts;%d\n", nb_clients); - ajouter_ligne(rapport, ligne); - snprintf(ligne, sizeof(ligne), "somme des requetes;%ld\n", somme_requetes); - ajouter_ligne(rapport, ligne); - snprintf(ligne, sizeof(ligne), "meilleure periode;%d;%d;%ld\n", debut, fin, meilleure); - ajouter_ligne(rapport, ligne); - snprintf(ligne, sizeof(ligne), "paires opposees;%ld\n", nb_paires); - ajouter_ligne(rapport, ligne); - snprintf(ligne, sizeof(ligne), "facons de rendre %d;%ld\n", MONTANT_MONNAIE, nb_facons); - ajouter_ligne(rapport, ligne); - for (int c = 0; c < 12; c++) { - snprintf(ligne, sizeof(ligne), "categorie;%d;%d\n", c, categories[c]); - ajouter_ligne(rapport, ligne); - } - for (int c = 0; c < NB_CLIENTS; c++) { - snprintf(ligne, sizeof(ligne), "client;%d;%ld\n", c, totaux_clients[c]); - ajouter_ligne(rapport, ligne); - } - for (int j = 0; j < NB_JOURS; j++) { - snprintf(ligne, sizeof(ligne), "jour;%d;%ld\n", j, totaux_jours[j]); - ajouter_ligne(rapport, ligne); - } - for (int i = 0; i < NB_TRANSACTIONS; i += 10) { - snprintf(ligne, sizeof(ligne), "rang;%d;%d;%ld\n", i, t[i].id, t[i].montant); - ajouter_ligne(rapport, ligne); - } - - FILE *f = fopen("rapport.txt", "w"); - if (f != NULL) { - fputs(rapport, f); - fclose(f); - } - - printf("Clients distincts : %d\n", nb_clients); - printf("Somme des requêtes : %ld\n", somme_requetes); - printf("Meilleure période : jours %d à %d (%ld)\n", debut, fin, meilleure); - printf("Paires opposées : %ld\n", nb_paires); - printf("Façons de rendre %d : %ld\n", MONTANT_MONNAIE, nb_facons); - printf("Empreinte : %016lx\n", empreinte(rapport)); - - free(rapport); - free(t); - return 0; -} -======= /* * R5.A.04 - Qualité Algorithmique * TD Complexité algorithmique : analyse des transactions d'une banque @@ -422,28 +88,29 @@ 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 client = t[i].client; - if (!clients_vus[client]) { - clients_vus[client] = 1; - nb++; + 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) + nb++; } - return nb; } -/* F3 : solde total de chaque client */ +/* F3 : solde total de chaque client en O(n + c) */ void total_par_client(const Transaction *t, int n, long *totaux) { for (int c = 0; c < NB_CLIENTS; c++) { totaux[c] = 0; - for (int i = 0; i < n; i++) - if (t[i].client == c) - totaux[c] += t[i].montant; + } + for (int i = 0; i < n; i++) { + totaux[t[i].client] += t[i].montant; } } @@ -452,30 +119,36 @@ 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 */ +/* F5 : période de jours consécutifs dont la somme des soldes est maximale en O(J) */ long meilleure_periode(const long *totaux, int nb_jours, int *debut, int *fin) { long meilleur = totaux[0]; *debut = 0; *fin = 0; - for (int i = 0; i < nb_jours; i++) { - for (int j = i; j < nb_jours; j++) { - long somme = 0; - for (int k = i; k <= j; k++) - somme += totaux[k]; - if (somme > meilleur) { - meilleur = somme; - *debut = i; - *fin = j; - } + + long somme_courante = totaux[0]; + int debut_courant = 0; + + for (int j = 1; j < nb_jours; j++) { + if (somme_courante < 0) { + somme_courante = totaux[j]; + debut_courant = j; + } else { + somme_courante += totaux[j]; + } + if (somme_courante > meilleur) { + meilleur = somme_courante; + *debut = debut_courant; + *fin = j; } } + return meilleur; } @@ -663,4 +336,3 @@ int main(void) free(t); return 0; } ->>>>>>> 97155f26889184ac9ab593d6aadb23cbdbce96c2