forked from menault/2026_TD3_DEV51_Qualite_Algo
modif compte_rendu.md
This commit is contained in:
+24
-1
@@ -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 :**
|
||||
|
||||

|
||||
|
||||
| | 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 %).
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 66 KiB |
+61
-61
@@ -3,98 +3,98 @@ Flat profile:
|
||||
Each sample counts as 0.01 seconds.
|
||||
% cumulative self self total
|
||||
time seconds seconds calls ms/call ms/call name
|
||||
30.39 0.93 0.93 1 930.00 930.00 nb_facons_rendre
|
||||
23.86 1.66 0.73 1 730.00 730.00 nb_paires_opposees
|
||||
21.57 2.32 0.66 30000 0.02 0.02 rechercher_par_id
|
||||
8.50 2.58 0.26 6017 0.04 0.04 longueur
|
||||
7.52 2.81 0.23 1 230.00 230.00 meilleure_periode
|
||||
3.59 2.92 0.11 1 110.00 110.00 nb_clients_distincts
|
||||
28.50 0.88 0.88 1 875.00 875.00 nb_facons_rendre
|
||||
26.38 1.69 0.81 1 810.00 810.00 nb_paires_opposees
|
||||
24.76 2.44 0.76 30000 0.03 0.03 rechercher_par_id
|
||||
7.82 2.69 0.24 6017 0.04 0.04 longueur
|
||||
7.82 2.92 0.24 1 240.00 240.00 meilleure_periode
|
||||
2.61 3.00 0.08 1 80.00 80.00 total_par_client
|
||||
1.31 3.04 0.04 1 40.00 40.00 total_par_jour
|
||||
0.33 3.05 0.01 30000 0.00 0.00 categorie
|
||||
0.33 3.06 0.01 29999 0.00 0.00 fusionner
|
||||
0.00 3.06 0.00 149998 0.00 0.00 alea
|
||||
0.00 3.06 0.00 6017 0.00 0.04 ajouter_ligne
|
||||
0.00 3.06 0.00 1 0.00 0.00 empreinte
|
||||
0.00 3.06 0.00 1 0.00 0.00 generer_transactions
|
||||
0.00 3.06 0.00 1 0.00 10.00 trier_par_montant
|
||||
1.30 3.04 0.04 1 40.00 40.00 total_par_jour
|
||||
0.49 3.06 0.01 30000 0.00 0.00 categorie
|
||||
0.33 3.07 0.01 29999 0.00 0.00 fusionner
|
||||
0.00 3.07 0.00 149998 0.00 0.00 alea
|
||||
0.00 3.07 0.00 6017 0.00 0.04 ajouter_ligne
|
||||
0.00 3.07 0.00 1 0.00 0.00 empreinte
|
||||
0.00 3.07 0.00 1 0.00 0.00 generer_transactions
|
||||
0.00 3.07 0.00 1 0.00 0.00 nb_clients_distincts
|
||||
0.00 3.07 0.00 1 0.00 10.00 trier_par_montant
|
||||
|
||||
Call graph
|
||||
|
||||
|
||||
granularity: each sample hit covers 4 byte(s) for 0.33% of 3.06 seconds
|
||||
granularity: each sample hit covers 4 byte(s) for 0.33% of 3.07 seconds
|
||||
|
||||
index % time self children called name
|
||||
<spontaneous>
|
||||
[1] 100.0 0.00 3.06 main [1]
|
||||
0.93 0.00 1/1 nb_facons_rendre [2]
|
||||
0.73 0.00 1/1 nb_paires_opposees [3]
|
||||
0.66 0.00 30000/30000 rechercher_par_id [4]
|
||||
0.00 0.26 6017/6017 ajouter_ligne [5]
|
||||
0.23 0.00 1/1 meilleure_periode [7]
|
||||
0.11 0.00 1/1 nb_clients_distincts [8]
|
||||
0.08 0.00 1/1 total_par_client [9]
|
||||
0.04 0.00 1/1 total_par_jour [10]
|
||||
0.01 0.00 30000/30000 categorie [11]
|
||||
0.00 0.01 1/1 trier_par_montant [13]
|
||||
0.00 0.00 1/1 generer_transactions [16]
|
||||
0.00 0.00 1/1 empreinte [15]
|
||||
[1] 100.0 0.00 3.07 main [1]
|
||||
0.88 0.00 1/1 nb_facons_rendre [2]
|
||||
0.81 0.00 1/1 nb_paires_opposees [3]
|
||||
0.76 0.00 30000/30000 rechercher_par_id [4]
|
||||
0.00 0.24 6017/6017 ajouter_ligne [5]
|
||||
0.24 0.00 1/1 meilleure_periode [7]
|
||||
0.08 0.00 1/1 total_par_client [8]
|
||||
0.04 0.00 1/1 total_par_jour [9]
|
||||
0.01 0.00 30000/30000 categorie [10]
|
||||
0.00 0.01 1/1 trier_par_montant [12]
|
||||
0.00 0.00 1/1 generer_transactions [15]
|
||||
0.00 0.00 1/1 nb_clients_distincts [16]
|
||||
0.00 0.00 1/1 empreinte [14]
|
||||
-----------------------------------------------
|
||||
266723738 nb_facons_rendre [2]
|
||||
0.93 0.00 1/1 main [1]
|
||||
[2] 30.4 0.93 0.00 1+266723738 nb_facons_rendre [2]
|
||||
0.88 0.00 1/1 main [1]
|
||||
[2] 28.5 0.88 0.00 1+266723738 nb_facons_rendre [2]
|
||||
266723738 nb_facons_rendre [2]
|
||||
-----------------------------------------------
|
||||
0.73 0.00 1/1 main [1]
|
||||
[3] 23.9 0.73 0.00 1 nb_paires_opposees [3]
|
||||
0.81 0.00 1/1 main [1]
|
||||
[3] 26.4 0.81 0.00 1 nb_paires_opposees [3]
|
||||
-----------------------------------------------
|
||||
0.66 0.00 30000/30000 main [1]
|
||||
[4] 21.6 0.66 0.00 30000 rechercher_par_id [4]
|
||||
0.76 0.00 30000/30000 main [1]
|
||||
[4] 24.8 0.76 0.00 30000 rechercher_par_id [4]
|
||||
-----------------------------------------------
|
||||
0.00 0.26 6017/6017 main [1]
|
||||
[5] 8.5 0.00 0.26 6017 ajouter_ligne [5]
|
||||
0.26 0.00 6017/6017 longueur [6]
|
||||
0.00 0.24 6017/6017 main [1]
|
||||
[5] 7.8 0.00 0.24 6017 ajouter_ligne [5]
|
||||
0.24 0.00 6017/6017 longueur [6]
|
||||
-----------------------------------------------
|
||||
0.26 0.00 6017/6017 ajouter_ligne [5]
|
||||
[6] 8.5 0.26 0.00 6017 longueur [6]
|
||||
0.24 0.00 6017/6017 ajouter_ligne [5]
|
||||
[6] 7.8 0.24 0.00 6017 longueur [6]
|
||||
-----------------------------------------------
|
||||
0.23 0.00 1/1 main [1]
|
||||
[7] 7.5 0.23 0.00 1 meilleure_periode [7]
|
||||
-----------------------------------------------
|
||||
0.11 0.00 1/1 main [1]
|
||||
[8] 3.6 0.11 0.00 1 nb_clients_distincts [8]
|
||||
0.24 0.00 1/1 main [1]
|
||||
[7] 7.8 0.24 0.00 1 meilleure_periode [7]
|
||||
-----------------------------------------------
|
||||
0.08 0.00 1/1 main [1]
|
||||
[9] 2.6 0.08 0.00 1 total_par_client [9]
|
||||
[8] 2.6 0.08 0.00 1 total_par_client [8]
|
||||
-----------------------------------------------
|
||||
0.04 0.00 1/1 main [1]
|
||||
[10] 1.3 0.04 0.00 1 total_par_jour [10]
|
||||
[9] 1.3 0.04 0.00 1 total_par_jour [9]
|
||||
-----------------------------------------------
|
||||
0.01 0.00 30000/30000 main [1]
|
||||
[11] 0.3 0.01 0.00 30000 categorie [11]
|
||||
[10] 0.5 0.01 0.00 30000 categorie [10]
|
||||
-----------------------------------------------
|
||||
0.01 0.00 29999/29999 trier_par_montant [13]
|
||||
[12] 0.3 0.01 0.00 29999 fusionner [12]
|
||||
0.01 0.00 29999/29999 trier_par_montant [12]
|
||||
[11] 0.3 0.01 0.00 29999 fusionner [11]
|
||||
-----------------------------------------------
|
||||
0.00 0.01 1/1 main [1]
|
||||
[13] 0.3 0.00 0.01 1 trier_par_montant [13]
|
||||
0.01 0.00 29999/29999 fusionner [12]
|
||||
[12] 0.3 0.00 0.01 1 trier_par_montant [12]
|
||||
0.01 0.00 29999/29999 fusionner [11]
|
||||
-----------------------------------------------
|
||||
0.00 0.00 149998/149998 generer_transactions [16]
|
||||
[14] 0.0 0.00 0.00 149998 alea [14]
|
||||
0.00 0.00 149998/149998 generer_transactions [15]
|
||||
[13] 0.0 0.00 0.00 149998 alea [13]
|
||||
-----------------------------------------------
|
||||
0.00 0.00 1/1 main [1]
|
||||
[15] 0.0 0.00 0.00 1 empreinte [15]
|
||||
[14] 0.0 0.00 0.00 1 empreinte [14]
|
||||
-----------------------------------------------
|
||||
0.00 0.00 1/1 main [1]
|
||||
[16] 0.0 0.00 0.00 1 generer_transactions [16]
|
||||
0.00 0.00 149998/149998 alea [14]
|
||||
[15] 0.0 0.00 0.00 1 generer_transactions [15]
|
||||
0.00 0.00 149998/149998 alea [13]
|
||||
-----------------------------------------------
|
||||
0.00 0.00 1/1 main [1]
|
||||
[16] 0.0 0.00 0.00 1 nb_clients_distincts [16]
|
||||
-----------------------------------------------
|
||||
|
||||
Index by function name
|
||||
|
||||
[5] ajouter_ligne [16] generer_transactions [3] nb_paires_opposees
|
||||
[14] alea [6] longueur [4] rechercher_par_id
|
||||
[11] categorie [7] meilleure_periode [9] total_par_client
|
||||
[15] empreinte [8] nb_clients_distincts [10] total_par_jour
|
||||
[12] fusionner (banque.c) [2] nb_facons_rendre [13] trier_par_montant
|
||||
[5] ajouter_ligne [15] generer_transactions [3] nb_paires_opposees
|
||||
[13] alea [6] longueur [4] rechercher_par_id
|
||||
[10] categorie [7] meilleure_periode [8] total_par_client
|
||||
[14] empreinte [16] nb_clients_distincts [9] total_par_jour
|
||||
[11] fusionner (banque.c) [2] nb_facons_rendre [12] trier_par_montant
|
||||
|
||||
Reference in New Issue
Block a user