forked from menault/2026_TD3_DEV51_Qualite_Algo
Optimiser F2 avec un tableau de clients rencontrés
This commit is contained in:
@@ -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
|
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,
|
les tailles 0 à 128, des doublons, des entrées déjà triées ou inversées,
|
||||||
et les bornes des types `int` et `long`.
|
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.
|
||||||
|
|||||||
@@ -116,18 +116,14 @@ void trier_par_montant(Transaction *t, int n)
|
|||||||
/* F2 : nombre de clients ayant au moins une transaction */
|
/* F2 : nombre de clients ayant au moins une transaction */
|
||||||
int nb_clients_distincts(const Transaction *t, int n)
|
int nb_clients_distincts(const Transaction *t, int n)
|
||||||
{
|
{
|
||||||
|
unsigned char vus[NB_CLIENTS] = {0};
|
||||||
int nb = 0;
|
int nb = 0;
|
||||||
for (int i = 0; i < n; i++) {
|
for (int i = 0; i < n; i++) {
|
||||||
int deja_vu = 0;
|
if (!vus[t[i].client]) {
|
||||||
for (int j = 0; j < i; j++) {
|
vus[t[i].client] = 1;
|
||||||
if (t[j].client == t[i].client) {
|
|
||||||
deja_vu = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!deja_vu)
|
|
||||||
nb++;
|
nb++;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return nb;
|
return nb;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
int main(void)
|
||||||
{
|
{
|
||||||
tester_tri();
|
tester_tri();
|
||||||
|
tester_clients_distincts();
|
||||||
puts("Tests banque : OK");
|
puts("Tests banque : OK");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user