Files
2026_TD3_DEV51_Qualite_Algo/compte_rendu.md
T
2026-10-21 12:04:00 +02:00

1.9 KiB

Compte rendu — TD3 Complexité algorithmique (R5.A.04)

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.

Profil gprof initial

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 :

Profil gprof après tri fusion

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 %).