forked from menault/2026_TD3_DEV51_Qualite_Algo
Optimiser F1 avec un tri fusion en O(n log n)
This commit is contained in:
+26
-4
@@ -1,11 +1,11 @@
|
||||
# Compte rendu du TD de complexité algorithmique
|
||||
|
||||
Ce compte rendu traite les trois étapes du palier 1 du TD
|
||||
(page 68 de `R5A04_Algorithmique_MM.pdf`) : mesurer la version initiale,
|
||||
la profiler, puis calculer les complexités algorithmiques et cyclomatiques.
|
||||
Ce compte rendu traite le palier 1 et l'étape 4 du TD
|
||||
(page 68 de `R5A04_Algorithmique_MM.pdf`) : analyser la version initiale,
|
||||
puis atteindre les objectifs avec un commit par optimisation.
|
||||
|
||||
Les mesures ont été réalisées le 21 octobre 2026 sur Linux x86_64, avec
|
||||
GCC 16.2.1 et GNU gprof 2.47. Le fichier `banque.c` est dans sa version initiale.
|
||||
GCC 16.2.1 et GNU gprof 2.47. Les sections 1 à 3 décrivent la version initiale.
|
||||
Les données sont reproductibles grâce à la graine fixe du générateur.
|
||||
|
||||
| Paramètre | Valeur |
|
||||
@@ -232,3 +232,25 @@ Les décisions d'une fonction appelée se comptent dans cette fonction.
|
||||
- **F10** : 1 `while` = 1 décision, donc **M = 2**.
|
||||
La fonction auxiliaire `longueur` contient elle aussi un `while` et a
|
||||
**M = 2**, compté séparément.
|
||||
|
||||
## 4. Atteindre les objectifs
|
||||
|
||||
Chaque optimisation est vérifiée avant son commit : compilation avec les
|
||||
avertissements du Makefile, tests de cas limites via `make test`, exécution
|
||||
en `-O2`, empreinte **`ff68d260a7a58441`** et comparaison du rapport complet
|
||||
avec celui de la version initiale. Les constantes, `alea`,
|
||||
`generer_transactions` et le format du rapport sont conservés.
|
||||
|
||||
### F1 — Tri fusion
|
||||
|
||||
Le tri à bulles est remplacé par un tri fusion : chaque moitié est triée,
|
||||
puis les deux moitiés sont fusionnées en un passage. La comparaison porte
|
||||
sur le montant, puis sur l'identifiant, sans soustraction susceptible de
|
||||
déborder. La récurrence `T(n) = 2T(n/2) + O(n)` donne **`O(n log n)` au pire
|
||||
cas**, avec `O(n)` de mémoire auxiliaire et `O(log n)` de pile.
|
||||
|
||||
La complexité cyclomatique de F1 passe de **6 à 3** ; les auxiliaires
|
||||
`comparer_transactions` et `trier_intervalle` ont respectivement **M = 2**
|
||||
et **M = 6**. Les tests comparent le résultat à un tri de référence pour
|
||||
les tailles 0 à 128, des doublons, des entrées déjà triées ou inversées,
|
||||
et les bornes des types `int` et `long`.
|
||||
|
||||
Reference in New Issue
Block a user