Optimiser F3 par accumulation directe des soldes clients

This commit is contained in:
rabot
2026-10-21 11:12:21 +02:00
parent 2b34b35f2b
commit 14c18a3975
3 changed files with 35 additions and 5 deletions
+9
View File
@@ -264,3 +264,12 @@ au lieu de `O(n²)`, avec `O(C)` de mémoire. Les identifiants de clients sont
densement compris entre 0 et `C - 1`, comme le garantit le générateur.
La complexité cyclomatique passe de **5 à 3**. Les tests couvrent l'absence
de transactions, les doublons, les identifiants extrêmes et tous les clients.
### F3 — Accumulation directe par client
Après la remise à zéro des `C` soldes, un seul parcours des transactions
ajoute chaque montant dans `totaux[t[i].client]`. Les deux boucles sont
successives : **`O(n + C)`** au lieu de `O(n × C)`, avec `O(1)` de mémoire
auxiliaire en dehors du tableau de sortie. La complexité cyclomatique passe
de **4 à 3**. Les tests vérifient les clients sans transaction, les débits,
les crédits, les annulations et la réinitialisation entre deux appels.
+3 -5
View File
@@ -130,12 +130,10 @@ int nb_clients_distincts(const Transaction *t, int n)
/* F3 : solde total de chaque client */
void total_par_client(const Transaction *t, int n, long *totaux)
{
for (int c = 0; c < NB_CLIENTS; c++) {
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;
}
/* F4 : solde total de chaque jour */
+23
View File
@@ -69,10 +69,33 @@ static void tester_clients_distincts(void)
assert(nb_clients_distincts(t, 1) == 1);
}
static void tester_totaux_clients(void)
{
Transaction t[] = {
{0, 0, 0, 100}, {1, NB_CLIENTS - 1, 1, -50},
{2, 0, 2, -40}, {3, NB_CLIENTS - 1, 3, 50}, {4, 7, 4, 0}
};
long totaux[NB_CLIENTS];
for (int i = 0; i < NB_CLIENTS; i++)
totaux[i] = 123;
total_par_client(t, 5, totaux);
for (int c = 0; c < NB_CLIENTS; c++) {
long attendu = 0;
for (int i = 0; i < 5; i++)
if (t[i].client == c)
attendu += t[i].montant;
assert(totaux[c] == attendu);
}
total_par_client(NULL, 0, totaux);
for (int c = 0; c < NB_CLIENTS; c++)
assert(totaux[c] == 0);
}
int main(void)
{
tester_tri();
tester_clients_distincts();
tester_totaux_clients();
puts("Tests banque : OK");
return 0;
}