forked from abraham/2026_TD3_DEV51_Qualite_Algo
EXO 4 - optimisation F7
This commit is contained in:
@@ -162,13 +162,45 @@ const Transaction *rechercher_par_id(const Transaction *t, int n, int id)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* F7 : nombre de paires de transactions de montants opposés (a + b = 0) */
|
/* F7 : nombre de paires de transactions de montants opposés (a + b = 0) */
|
||||||
|
|
||||||
|
|
||||||
|
static int cmp_long(const void *a, const void *b)
|
||||||
|
{
|
||||||
|
long x = *(const long *)a;
|
||||||
|
long y = *(const long *)b;
|
||||||
|
return (x > y) - (x < y);
|
||||||
|
}
|
||||||
|
|
||||||
long nb_paires_opposees(const Transaction *t, int n)
|
long nb_paires_opposees(const Transaction *t, int n)
|
||||||
{
|
{
|
||||||
|
/* 1. Copier et trier les montants : O(n log n) */
|
||||||
|
long *m = malloc(n * sizeof(long));
|
||||||
|
for (int i = 0; i < n; i++) {
|
||||||
|
m[i] = t[i].montant;
|
||||||
|
}
|
||||||
|
qsort(m, n, sizeof(long), cmp_long);
|
||||||
|
|
||||||
|
/* 2. Deux pointeurs : O(n) au lieu de O(n²) */
|
||||||
long nb = 0;
|
long nb = 0;
|
||||||
for (int i = 0; i < n; i++)
|
int g = 0, d = n - 1;
|
||||||
for (int j = i + 1; j < n; j++)
|
|
||||||
if (t[i].montant + t[j].montant == 0)
|
while (g < d) {
|
||||||
|
long somme = m[g] + m[d];
|
||||||
|
|
||||||
|
if (somme < 0) {
|
||||||
|
g++;
|
||||||
|
} else if (somme > 0) {
|
||||||
|
d--;
|
||||||
|
} else {
|
||||||
|
/* somme == 0 : on compte tous les m[d] identiques en face de m[g] */
|
||||||
|
for (int k = d; k > g && m[k] == m[d]; k--) {
|
||||||
nb++;
|
nb++;
|
||||||
|
}
|
||||||
|
g++; /* Puis on passe simplement au m[g] suivant ! */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
free(m);
|
||||||
return nb;
|
return nb;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user