modif compte_rendu.md

This commit is contained in:
2026-10-21 12:41:22 +02:00
parent 7cd7f33955
commit 4b7bdc05a2
5 changed files with 85 additions and 62 deletions
+24 -1
View File
@@ -5,7 +5,7 @@
| Fonction | Rôle | Avant | Après |
|---|---|---|---|
| F1 | `trier_par_montant` — tri par montant puis par id | O(n²) | **O(n log n)** (tri fusion) |
| F2 | `nb_clients_distincts` | O(n²) | |
| F2 | `nb_clients_distincts` | O(n²) | **O(n + c)** (tableau de présence) |
| F3 | `total_par_client` | O(n·c) | |
| F4 | `total_par_jour` | O(n·J) | |
| F5 | `meilleure_periode` | O(J³) | |
@@ -43,3 +43,26 @@ L'ordre de tri est conservé (montant croissant, puis id croissant en cas d'éga
| Temps total du programme | 6,83 s | 3,06 s |
Le tri passe de 48 % du temps à un coût négligeable ; le temps total est divisé par plus de 2. Les fonctions les plus coûteuses sont maintenant `nb_facons_rendre` (30 %), `nb_paires_opposees` (24 %) et `rechercher_par_id` (22 %).
### 3.2 F2 — `nb_clients_distincts` : double boucle → tableau de présence
**Avant :** pour chaque transaction, on reparcourt toutes les transactions précédentes pour savoir si le client a déjà été vu → O(n²).
**Après :** l'id du client sert directement d'index dans un tableau de booléens `presence` :
1. un premier parcours trouve l'id client maximal pour dimensionner le tableau ;
2. le tableau est alloué avec `calloc` (initialisé à `false`) ;
3. un second parcours marque chaque client rencontré et incrémente le compteur la première fois qu'il est vu ;
4. le tableau est libéré avec `free`.
Chaque vérification « déjà vu ? » se fait en O(1), d'où une complexité O(n + c) (c = nombre de clients). Le résultat est identique, l'empreinte est inchangée.
**Profil gprof après modification :**
![Profil gprof après optimisation de F2](gprof/3_modif_nb_clients_distincts.png)
| | Avant | Après |
|---|---|---|
| Temps de `nb_clients_distincts` | 0,11 s | 0,00 s |
| Temps total du programme | 3,06 s | 3,07 s |
La fonction devient négligeable dans le profil. Le gain sur le temps total n'est pas visible car il est inférieur aux variations de mesure de gprof (échantillonnage à 0,01 s). Les fonctions les plus coûteuses restent `nb_facons_rendre` (28 %), `nb_paires_opposees` (26 %) et `rechercher_par_id` (25 %).