Insérer sans @ — fusion optimisée
Exercice · OCaml (option informatique), chapitre 9 — Algorithmique : les tris
Énoncé
Le tri rapide ci-dessus abuse de @. Sans le corriger entièrement, expliquer pourquoi tri_rapide inf @ [pivot] @ tri_rapide sup est coûteux, et proposer la piste d'un accumulateur.
Corrigé
Chaque @ recopie son membre gauche (chapitre 2) : tri_rapide inf @ ... reparcourt tout le préfixe déjà trié à chaque remontée de la récursion, ajoutant un facteur linéaire. La piste classique est de passer un accumulateur — la liste « déjà triée qui suit » — pour préfixer les éléments par :: (temps constant) au lieu de concaténer :
let rec tri_rapide_acc l suite =
match l with
| [] -> suite
| pivot :: reste ->
let (inf, sup) = partition pivot reste in
tri_rapide_acc inf (pivot :: tri_rapide_acc sup suite)
let tri_rapide l = tri_rapide_acc l []
On construit le résultat de droite à gauche par ::, sans aucun @ : la même technique d'accumulateur qu'au renverse du chapitre 2.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.