forked from menault/2026_TD3_DEV51_Qualite_Algo
opti tri_par_montant
This commit is contained in:
+43
-11
@@ -1,13 +1,45 @@
|
||||
complexités Algorithmique :
|
||||
# Compte rendu — TD3 Complexité algorithmique (R5.A.04)
|
||||
|
||||
F1 : O(n^2)
|
||||
F2 : O(n^2)
|
||||
F3 : O(n*c)
|
||||
F4 : O(n*J)
|
||||
F5 : O(J^3)
|
||||
F6 : O(n)
|
||||
F7: O(n^2)
|
||||
F8 : O(2^S)
|
||||
F9 : M=14
|
||||
F10 : O(L)
|
||||
## 1. Complexités algorithmiques
|
||||
|
||||
| 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²) | |
|
||||
| F3 | `total_par_client` | O(n·c) | |
|
||||
| F4 | `total_par_jour` | O(n·J) | |
|
||||
| F5 | `meilleure_periode` | O(J³) | |
|
||||
| F6 | `rechercher_par_id` | O(n) | |
|
||||
| F7 | `nb_paires_opposees` | O(n²) | |
|
||||
| F8 | `nb_facons_rendre` | O(2^S) | |
|
||||
| F9 | `categorie` | M = 14 | |
|
||||
| F10 | `ajouter_ligne` | O(L) | |
|
||||
|
||||
## 2. Profil gprof initial
|
||||
|
||||
Programme d'origine compilé avec `gcc -O0 -g -pg`, temps total mesuré : **6,83 s**.
|
||||
|
||||

|
||||
|
||||
`trier_par_montant` représente à elle seule **48 %** du temps (3,28 s) : c'est la première fonction à optimiser.
|
||||
|
||||
## 3. Optimisations
|
||||
|
||||
### 3.1 F1 — `trier_par_montant` : tri à bulles → tri fusion
|
||||
|
||||
**Avant :** tri à bulles, deux boucles imbriquées qui comparent et échangent les éléments voisins → O(n²).
|
||||
|
||||
**Après :** tri fusion itératif (ascendant). On fusionne des sous-tableaux triés de taille 1, 2, 4, 8… jusqu'à couvrir tout le tableau. La fonction `fusionner` copie les deux moitiés dans des tableaux temporaires puis les recombine dans l'ordre → O(n log n).
|
||||
|
||||
L'ordre de tri est conservé (montant croissant, puis id croissant en cas d'égalité), donc l'empreinte reste `ff68d260a7a58441`.
|
||||
|
||||
**Profil gprof après modification :**
|
||||
|
||||

|
||||
|
||||
| | Avant | Après |
|
||||
|---|---|---|
|
||||
| Temps de `trier_par_montant` | 3,28 s | 0,01 s (via `fusionner`) |
|
||||
| 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 %).
|
||||
|
||||
Reference in New Issue
Block a user