Adloun

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.