diff --git a/COMPTE_RENDU.md b/COMPTE_RENDU.md index 933cf1e..8d92e84 100644 --- a/COMPTE_RENDU.md +++ b/COMPTE_RENDU.md @@ -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. diff --git a/banque.c b/banque.c index fbb1ea6..bac48e3 100644 --- a/banque.c +++ b/banque.c @@ -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; } diff --git a/tests/test_banque.c b/tests/test_banque.c index 13c3dae..d11d0ac 100644 --- a/tests/test_banque.c +++ b/tests/test_banque.c @@ -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; }