Optimiser F2 avec un tableau de clients rencontrés

This commit is contained in:
rabot
2026-10-21 11:11:56 +02:00
parent b6352e063b
commit 2b34b35f2b
3 changed files with 30 additions and 8 deletions
+10
View File
@@ -254,3 +254,13 @@ La complexité cyclomatique de F1 passe de **6 à 3** ; les auxiliaires
et **M = 6**. Les tests comparent le résultat à un tri de référence pour
les tailles 0 à 128, des doublons, des entrées déjà triées ou inversées,
et les bornes des types `int` et `long`.
### F2 — Tableau des clients rencontrés
Un tableau de `C` indicateurs, initialisé à zéro, remplace la recherche
dans les transactions précédentes. Une transaction marque son client à son
premier passage et incrémente le compteur. Le coût devient **`O(n + C)`**
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.
+4 -8
View File
@@ -116,17 +116,13 @@ 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)
{
unsigned char 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)
if (!vus[t[i].client]) {
vus[t[i].client] = 1;
nb++;
}
}
return nb;
}
+16
View File
@@ -54,9 +54,25 @@ static void tester_tri(void)
}
}
static void tester_clients_distincts(void)
{
assert(nb_clients_distincts(NULL, 0) == 0);
Transaction t[NB_CLIENTS];
for (int i = 0; i < NB_CLIENTS; i++)
t[i] = (Transaction){i, NB_CLIENTS - 1, 0, 0};
assert(nb_clients_distincts(t, NB_CLIENTS) == 1);
t[0].client = 0;
assert(nb_clients_distincts(t, NB_CLIENTS) == 2);
for (int i = 0; i < NB_CLIENTS; i++)
t[i].client = i;
assert(nb_clients_distincts(t, NB_CLIENTS) == NB_CLIENTS);
assert(nb_clients_distincts(t, 1) == 1);
}
int main(void)
{
tester_tri();
tester_clients_distincts();
puts("Tests banque : OK");
return 0;
}