Académique Documents
Professionnel Documents
Culture Documents
Par Ker
www.openclassrooms.com
Sommaire
Sommaire ........................................................................................................................................... 2
Le tri par tas ....................................................................................................................................... 3
Les tas (binaires) ............................................................................................................................................................... 3
Dfinition ..................................................................................................................................................................................................................... 3
Entassement .............................................................................................................................................................................................................. 4
Convertir un tableau en tas ......................................................................................................................................................................................... 5
Tri par tas .......................................................................................................................................................................... 5
Implmentation ............................................................................................................................................................................................................ 5
Efficacit ...................................................................................................................................................................................................................... 6
Introduction aux files de priorit .................................................................................................................................................................................. 7
Rfrences .................................................................................................................................................................................................................. 7
Partager ....................................................................................................................................................................................................................... 7
www.openclassrooms.com
Sommaire 3/8
Par Ker
Nous allons dcouvrir ici un algorithme de tri original : le tri par tas. Cet algorithme de tri par comparaison est de complexit
asympotiquement optimal car de complexit O(n log n). En termes moins barbare a signifie que la diffrence du tri par insertion
o lorsque l'on double la taille de l'entre, on multiplie par 4 le nombre d'oprations effectues par l'algorithme; le tri par tas ne
multipliera, dans les mmes circonstances, qu'environ par 2 (un peu plus en ralit, mais lorsque n est grand c'est ngligeable) le
nombre d'oprations. D'o le terme d'algorithme de tri optimal pour de grandes entres.
Les diffrents algorithmes seront implments en OCaml, cependant ils seront expliqus en dtail et donc facilement
transposables dans votre langage prfr.
Sommaire du tutoriel :
Le tas (heap en anglais) peut tre reprsent comme un arbre binaire presque complet. Pour rappel un arbre binaire est dit
complet si toutes ses feuilles sont de mme profondeur.
On peut dfinir deux sortes de tas binaires : les tas min et les tas max.
Le tas peut tre stock de faon trs simple dans un tableau. Soit i l'indice d'un noeud. Les indices de son parent, enfant de
gauche, et enfant de droite sont calculables de manires trs simple.
Code : OCaml
www.openclassrooms.com
Le tri par tas 4/8
Entassement
La plus importante des oprations que l'on effectue sur les tas est l'entassement. On va maintenant supposer que l'on utilise un
tas-max reprsent par un tableau a. Le rle de la fonction entasser-tas est de faire respecter la proprit suivante du tas-max :
Code : OCaml
Concrtement, soit un noeud i, entasser-tas va faire "descendre" le noeud i dans le tas max jusqu' ce qu'il respecte cette rgle.
Pour coder cette fonction, on attend de l'utilisateur qu'il nous fournisse la taille actuelle du tas.
On dfinit aussi permuter qui nous sera souvent utile par la suite.
Code : OCaml
let permuter a i j =
let tmp = a.(i) in
a.(i) <- a.(j);
a.(j) <- tmp;;
www.openclassrooms.com
Le tri par tas 5/8
end;;
entasser-tas vrifie donc que le noeud en question est suprieur ses deux enfants. Si ce n'est pas le cas, elle permute ce noeud
avec le plus grand de ses enfants. Pourquoi ? Si on avait permut le noeud avec le plus petit de ses deux enfants, ce dernier se
retrouverait parent d'un enfant plus grand que lui. Et donc contradiction avec la proprit du tas max. Une fois les deux noeuds
permuts on rappelle entasser_tas sur le noeud qui est alors "descendu". Dans le pire des cas, entasser-tas effectue lg n
oprations, puisque la hauteur d'un tas n lments est lg n.
Le problme est le suivant : soit un tableau A de n lments, on souhaite le converir en tas max. L'ide est d'entasser chacun des
noeuds du tableau, ainsi touts les noeuds seront une place qui ne contredira pas la proprit du tas-max. On remarque qu'il est
inutile de lancer entasser-tas sur les lments du sous-tableau a [(n/2)+1, .., n] puisque ces lments sont des feuilles du tas.
creer-tas appelle n fois entasser-tas dont le cout est de O(lg n). On peut donc majorer le nombre d'opration effectu par creer-tas
par O(n lg n). Cependant, on peut en fait affiner notre majoration et dmontrer que creer-tas s'excute en temps linaire : O(n).
Pour les curieux (cette dmonstration est tire du Cormen), c'est ici.
Pour ceux qui ont remarqu, ce n'est par hasard que l'on fait itrer la boucle de taille/2 0 au lieu de faire l'inverse, dans ce sens
entasser-tas effectuera moins d'oprations.
Nous avons maintenant tout les fonctions ncessaires pour coder notre algorithme de tri par tas. Le principe est le suivant :
On convertit notre tableau en tas-max.
Le tas max nous garantit que la racine du tas est le plus grand lment du tas. On permute donc la racine avec le dernier lment
du tas. On entasse alors la nouvelle racine qui n'est plus sa place.
On ritre alors cette opration avec la nouvelle racine du tas.
Cela donne :
Code : OCaml
Un petit test :
Code : Console
# let t = [| 1; 3; 9; 1; 4; 0|];;
www.openclassrooms.com
Le tri par tas 6/8
Efficacit
Au final le tri-par-tas prends bien un temps O(n log n) comme annonc en introduction.
J'ai cod une fonction comparer-tri pour pouvoir comparer le temps que mettent 2 fonctions de tri pour trier des tableaux de
grandes tailles que l'on a rempli au hasard. En fait comparer-tri fait effectuer n tri de tableau de taille taille_entree.
Code : OCaml
Voici les rsultats quand on compare le tri par tas avec le tri bulle (de complexit O(n)) :
Code : Console
Ca peut paratre faible mais il suffit d'augmenter la taille de l'entre pour constater une norme diffrence :
Code : Console
www.openclassrooms.com
Le tri par tas 7/8
tri1 : 1.112069
tri2 : 0.592037- : unit = ()
Avantage donc au tri rapide. A noter que la diffrence est tout mme largement infrieur qu'avec le tri bulle.
Introduction aux files de priorit
Pour conclure, je voudrais rapidement introduire les files de priorit. Le tas n'est videmment pas utilis seulement dans le cadre
du tri par tas. Une de ses utilisation importante est l'implantation de file de priorit. Ces files de priorits sont notemment utilis
dans le cadre des algorithmes de plus court chemin (comme l'algorithme de Dijkstra) pour connatre le prochain noeud visiter.
Souvenez vous de la proprit du tas-min. La racine d'un tas contient la valeur la moins importante du tas. Donc dans un tas-min
on peut accder en temps constant la plus petite valeur du tas. Dans le cadre d'un algorithme de plus court chemin, cette valeur
peut par exemple tre la distance de la racine au noeud tudi. Bref, si un jour vous avez besoin d'une structure de donne qui
doit vous permettre de connaitre la plus grande ou plus petite valeur d'un ensemble, implanter un tas peut tre une bonne ide.
Vous avez maintenant tout les outils en main pour le faire.
Rfrences
Introduction l'algorithmique, Cormen, 2me dition
Tas : http://fr.wikipedia.org/wiki/Tas_(informatique)
Tri par tas : http://fr.wikipedia.org/wiki/Tri_par_tas
Partager
www.openclassrooms.com