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);