F6 : index des transactions par id (O(n) par requête → O(1))

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 <noreply@anthropic.com>
This commit is contained in:
2026-10-21 10:54:49 +02:00
parent 4babca1f2e
commit d913c2266f
+16 -8
View File
@@ -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);