Optimiser F6 avec un index direct par identifiant

This commit is contained in:
rabot
2026-10-21 11:14:00 +02:00
parent 285afd80a7
commit 1c7970b554
3 changed files with 51 additions and 5 deletions
+13 -5
View File
@@ -171,12 +171,18 @@ 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)
/* Les id forment une permutation de 0 à n - 1. Reconstruire après tout tri. */
void indexer_par_id(const Transaction *t, int n, const Transaction **index_ids)
{
for (int i = 0; i < n; i++)
if (t[i].id == id)
return &t[i];
return NULL;
index_ids[t[i].id] = &t[i];
}
const Transaction *rechercher_par_id(const Transaction *const *index_ids, int n, int id)
{
if (id < 0 || id >= n)
return NULL;
return index_ids[id];
}
/* F7 : nombre de paires de transactions de montants opposés (a + b = 0) */
@@ -280,11 +286,13 @@ int main(void)
rapport[0] = '\0';
/* recherches par id, dans l'ordre d'origine */
static const Transaction *index_ids[NB_TRANSACTIONS];
indexer_par_id(t, NB_TRANSACTIONS, index_ids);
long somme_requetes = 0;
unsigned long etat = 12345;
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_ids, NB_TRANSACTIONS, (int)((etat >> 8) % NB_TRANSACTIONS));
if (r != NULL)
somme_requetes += r->montant;
}