diff --git a/COMPTE_RENDU.md b/COMPTE_RENDU.md index 0fb38cd..98cd519 100644 --- a/COMPTE_RENDU.md +++ b/COMPTE_RENDU.md @@ -94,3 +94,16 @@ Le tri à bulles de `trier_par_montant` effectue O(n²) comparaisons. Il est rem Sur ces mesures, le temps réel médian baisse d'environ **59 %** (la version optimisée est environ **2,4 fois plus rapide**). Les valeurs affichées par le programme restent identiques et l'empreinte confirme que le rapport n'a pas changé. +## 4. Optimiser F6 : rechercher une transaction par identifiant + +La recherche initiale parcourait le tableau jusqu'à trouver l'identifiant demandé, soit O(n) par requête et O(Qn) pour Q requêtes. Or les identifiants générés forment une permutation de 0 à n−1. Le programme construit donc une fois un tableau d'index où `index[id]` pointe vers la transaction correspondante. Chaque recherche vérifie que l'identifiant est dans les limites, puis renvoie directement `index[id]` en O(1). La construction coûte O(n), les Q recherches coûtent O(Q), soit O(n + Q) au total. L'index est libéré après les requêtes, avant le tri qui déplace les transactions. + +| Mesure | Avant : recherche linéaire | Après : index | +| --- | ---: | ---: | +| Temps réel médian | 0,97 s | 0,80 s | +| Temps utilisateur médian | 0,97 s | 0,80 s | +| Temps système médian | 0,00 s | 0,00 s | +| Empreinte | `ff68d260a7a58441` | `ff68d260a7a58441` | + +Le temps réel médian baisse d'environ **18 %** (environ **1,2 fois plus rapide**). L'empreinte identique confirme que les recherches renvoient les mêmes transactions et que le rapport conserve son contenu. + diff --git a/banque.c b/banque.c index 378e9a6..945c034 100644 --- a/banque.c +++ b/banque.c @@ -148,12 +148,21 @@ long meilleure_periode(const long *totaux, int nb_jours, int *debut, int *fin) } /* F6 : retrouve une transaction à partir de son id */ -const Transaction *rechercher_par_id(const Transaction *t, int n, int id) +const Transaction *rechercher_par_id(const Transaction *const *index, int n, int id) { + if (id < 0 || id >= n) + return NULL; + return index[id]; +} + +static const Transaction **construire_index(const Transaction *t, int n) +{ + const Transaction **index = malloc((size_t)n * sizeof(*index)); + if (index == NULL) + exit(EXIT_FAILURE); for (int i = 0; i < n; i++) - if (t[i].id == id) - return &t[i]; - return NULL; + index[t[i].id] = &t[i]; + return index; } /* F7 : nombre de paires de transactions de montants opposés (a + b = 0) */ @@ -259,12 +268,14 @@ int main(void) /* recherches par id, dans l'ordre d'origine */ long somme_requetes = 0; unsigned long etat = 12345; + const Transaction **index = construire_index(t, NB_TRANSACTIONS); 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)); + const Transaction *r = rechercher_par_id(index, NB_TRANSACTIONS, (int)((etat >> 8) % NB_TRANSACTIONS)); if (r != NULL) somme_requetes += r->montant; } + free(index); int nb_clients = nb_clients_distincts(t, NB_TRANSACTIONS);