Optimiser F1 avec un tri fusion en O(n log n)

This commit is contained in:
rabot
2026-10-21 11:11:28 +02:00
parent 3cdb37276c
commit b6352e063b
4 changed files with 132 additions and 14 deletions
+26 -4
View File
@@ -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`.