From d913c2266fca7430c3671c6c50593873112732d1 Mon Sep 17 00:00:00 2001 From: Ryad MEHIRI Date: Wed, 21 Oct 2026 10:54:49 +0200 Subject: [PATCH] =?UTF-8?q?F6=20:=20index=20des=20transactions=20par=20id?= =?UTF-8?q?=20(O(n)=20par=20requ=C3=AAte=20=E2=86=92=20O(1))?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Chaque requête parcourait le tableau jusqu'à trouver l'id : 30 000 requêtes × 15 000 comparaisons en moyenne. Les id formant une permutation de 0 à n-1, un tableau position[id] construit une fois en O(n) donne chaque transaction en O(1). Le test r != NULL de main, devenu impossible, est retiré. Temps (-O2) : 1,08 s → 0,92 s. Empreinte inchangée (ff68d260a7a58441). Co-Authored-By: Claude Opus 5.5 --- banque.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/banque.c b/banque.c index d51afdc..ac3ae9a 100644 --- a/banque.c +++ b/banque.c @@ -147,13 +147,20 @@ long meilleure_periode(const long *totaux, int nb_jours, int *debut, int *fin) return meilleur; } -/* F6 : retrouve une transaction à partir de son id */ -const Transaction *rechercher_par_id(const Transaction *t, int n, int id) +/* F6 : position[id] = indice de la transaction id dans t. Les id forment une + * permutation de 0 .. n-1 (voir generer_transactions) : chaque id a sa case. */ +int *indexer_par_id(const Transaction *t, int n) { + int *position = malloc(n * sizeof(int)); for (int i = 0; i < n; i++) - if (t[i].id == id) - return &t[i]; - return NULL; + position[t[i].id] = i; + return position; +} + +/* F6 : retrouve une transaction à partir de son id, en O(1) grâce à l'index */ +const Transaction *rechercher_par_id(const Transaction *t, const int *position, int id) +{ + return &t[position[id]]; } /* F7 : nombre de paires de transactions de montants opposés (a + b = 0) */ @@ -254,12 +261,13 @@ int main(void) /* recherches par id, dans l'ordre d'origine */ long somme_requetes = 0; unsigned long etat = 12345; + int *position = indexer_par_id(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)); - if (r != NULL) - somme_requetes += r->montant; + const Transaction *r = rechercher_par_id(t, position, (int)((etat >> 8) % NB_TRANSACTIONS)); + somme_requetes += r->montant; /* tout id de 0 à n-1 existe : r n'est jamais NULL */ } + free(position); int nb_clients = nb_clients_distincts(t, NB_TRANSACTIONS);