Probleme – Ce que la complexité ne dit pas : deux tris en
Exercice · niveau 3 (difficile) · informatique (MP2I/MPI), chapitre 11 — Arbres de recherche, tas et files de priorité
Énoncé
Le chapitre affirme que le tri par tas « ne gagne pourtant pas toujours en pratique : ses accès sautent d'un bout à l'autre du tableau ». On vérifie.
- Décrire les motifs d'accès mémoire du tri par tas et du tri rapide.
- Prévoir lequel sera le plus rapide, et de combien.
- Mesurer, et conclure sur ce que la notation retient et ce qu'elle jette.
Corrigé
1. Les deux motifs.
Le tri rapide partitionne : deux curseurs partent des extrémités et progressent de proche en proche vers le milieu. Toutes les cases lues dans un tour sont voisines. Puis il récurse sur des tranches contiguës, de plus en plus petites — et dès qu'une tranche tient dans la mémoire cache, tout le sous-tri s'y fait sans accès à la mémoire principale.
Le tri par tas descend un élément de la racine vers les feuilles : de l'indice vers . Les indices doublent à chaque niveau. Un tassage sur un tableau de entiers touche successivement les indices , , , , …, : les derniers niveaux sont à des adresses distantes de plusieurs mégaoctets. Aucun de ces accès n'aide le suivant.
2. La prévision. Une lecture servie par le cache de premier niveau coûte quelques cycles ; un défaut de cache jusqu'à la mémoire principale en coûte deux à trois cents. Le tri par tas subit environ un défaut par niveau profond, soit défauts par tassage. On attend donc un facteur à en faveur du tri rapide, croissant avec — puisque plus est grand, plus la part de l'arbre qui déborde du cache est grande.
3. Les mesures. Mesuré en OCaml compilé en code natif, mêmes données, même machine :
| tri par tas | tri rapide | `Array.sort` | rapport tas / rapide | |
|---|---|---|---|---|
| s | s | s | ||
| s | s | s | ||
| s | s | s |
Les trois tableaux ressortent identiques, donc les trois tris sont corrects. Le tri par tas est deux fois plus lent, alors qu'il fait moins de comparaisons que le tri rapide moyen. Et sur un tableau déjà trié, où le tri rapide à pivot médian de trois est à son meilleur, l'écart monte à : s contre s à .
Ce que la notation retient et ce qu'elle jette. Elle retient l'ordre de croissance : les deux courbes sont bien en , et un tri quadratique serait hors de portée à . Elle jette la constante — ici un facteur à — et surtout elle jette le modèle de coût : elle suppose qu'un accès mémoire coûte , ce qui est faux d'un facteur cent selon l'adresse. Le chapitre chap:algo-prog le dit ; ces trois lignes le montrent.
Alors pourquoi enseigner le tri par tas ? Pour trois raisons qu'aucune mesure ne contredit : il est garanti, là où le tri rapide est au pire ; il est en place, là où le tri par partition-fusion demande ; et il donne la file de priorité, qui sert bien au-delà du tri. On ne choisit pas un algorithme sur un chronomètre, mais sur la garantie dont on a besoin.
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.