Vous êtes sur la page 1sur 18

Leçon 4 : Tris par tas et

les tables à hachages

AYIKPA KACOUTCHY JEAN : Enseignant -


Chercheur
Table des
matières
I - 1- Généralité sur le tri par tas 3

II - Application 1 : 5

III - 2- Construire un tas et Algorithme de tri par tas 6

IV - Application 2 : 9

V - 3- La table à adressage direct 10

VI - Application 3 : 12

VII - 4- Tables de hachage 13

VIII - Application 4 : 15

Solutions des exercices 16


1- Généralité sur le tri par tas

1- Généralité sur le tri


par tas I

La structure de tas (binaire) est un tableau qui peut être vu comme un arbre binaire presque complet.

Chaque nœud de l'arbre correspond à un élément du tableau qui contient la valeur du nœud.

La valeur de chaque nœud est à l'intérieur du cercle à ce nœud.

Le nombre au dessus de chaque nœud est l'indice correspondant dans le tableau A.

Le tableau A représente un tas à deux attributs :

- longueur(A) : nombre d'éléments.


- taille(A) : nombre d'éléments du tas rangé dans le tableau

Si i est l'indice d'un nœud, les indices de son père, fils gauche et fils droit se calculent comme suit :

- Père
Fonction pere({E} i : entier) : entier
début
renvoyer (i mod 2)
fin
- Fils gauche
Fonction gauche({E} i : entier) : entier
début
renvoyer (2*i)
fin
- Fils droit
Fonction droit({E} i : entier) : entier
début
renvoyer (2*i+1)
fin

Les tas satisfont également la propriété de tas : pour chaque nœud i autre que la racine,

- A [pere(i)] >= A[i]

On peut définir deux sortes de tas binaires : les tas min et les tas max.

- Tas-min : chaque élément est supérieur à son parent, le plus petit élément d'un tas min est à la racine.

3
1- Généralité sur le tri par tas

- Tas-max : chaque élément est inférieur à son parent, ainsi, le plus grand élément d'un tas max est stocké
dans la racine.

NB : Pour l'algorithme du tri par tas, on utilise des tas max. Les tas min servent généralement dans les
files de priorités.

4
Application 1 :

Application 1 :
II
Exercice [solution n°1 p.16]
[*]

La structure de tas est :

 un sous arbres

 un tableau qui peut être vu comme un arbre binaire

 un sous-arbres d'un arbre binaire

[solution n°2 p.16]


Exercice
[*]

A partir de la fonction du fils gauche veiller donner la valeur de de son indice et la valeur du nœud
pour i =5

indice = valeur du nœud =

Veiller remplir le tableau de tas correspondant à l'arbre ci-dessus :

5
2- Construire un tas et Algorithme de tri par tas

2- Construire un tas et
Algorithme de tri par tas III

2.1- Conservation de la structure de tas

ENTASSER est un sous-programme permettant la manipulation des tas.

Il prend en entrée un tableau A et un indice i dans le tableau.

Quand ENTASSER est appelée, on suppose que les arbres binaires enracinés en dans les fonctions gauche(i) et
droit(i) ( vu précédemment) sont des tas mais A[i] peut être plus petit que ses fils, violant ainsi la propriété de
tas.

Le rôle de ENTASSER est de faire « descendre » la valeur A[i] dans le tas de manière que le sous arbre
enraciné en i deviennent un tas.

Procédure ENTASSER ({E}A, i : entier)

var

lnd ,r , max, permut : entier

Début

lnd ← gauche(i) //************ la fonction gauche ramène l'indice du fils gauche

r ← droit(i) //************ la fonction droit ramène l'indice du fils droit

si (lnd <= taille(A) et A[lnd]>A[i]) alors //*** vérifie si la valeur de l'indice du fils gauche n'est pas en
dehors du tas et aussi si la valeur du tableau se trouvant à l'indice du fils gauche est supérieure à la
valeur du parent

max ← lnd //**** Si les deux conditions du si sont vérifiées alors max reçoit la valeur de l'indice gauche

sinon

max ← i //**** Si les deux conditions du si ne sont pas vérifiées alors max reçoit la valeur de l'indice du
pere

finsi

si (r <= taille(A) et A[r] > A[max]) alors //*** vérifie si la valeur de l'indice du fils droit n'est pas en
dehors du tas et aussi si la valeur du tableau se trouvant à l'indice du droit est supérieure à la valeur se
trouvant à l'indice max

max ← r //**** Si les deux conditions du si sont vérifiées alors max reçoit la valeur de l'indice droit

finsi

6
2- Construire un tas et Algorithme de tri par tas

si max <> i alors //*******si l'indice max est différent de l'indice i alors on fait une permutation et la
procédure est appelée de manière récursive

permut ← A[i]

A[i] ← A[max]

A[max] ← permut

ENTASSER (A, max)

fin si

fin

Illustration ci-dessous

2.2- Construction d'un tas

La procédure ENTASSER peut s'utiliser à l'envers pour convertir un tableau A [1..n] avec n = longueur (A)

En effet, les éléments A [(n mod 2)..n] sont des feuilles de l'arbre, chacun est au départ un tas à un élément.

La procédure CONSTRUIRE_TAS traverse les nœuds restants et exécute ENTASSER sur chacun d'eux.

L'ordre dans lequel les nœuds sont traités garanti que les sous arbres enracinés aux fils d'un nœud i sont des tas
avant que ENTASSER soit exécutée à ce nœud.

Procédure CONSTRUIRE_TAS ({E}A : entier)

Début

Pour i ← (longueur (A) mod 2) à 1 faire

ENTASSER (A, i)

fin pour

fin

2.3- Algorithme Tri par tas

L'algorithme du tri par tas commence par utiliser CONSTRUIRE_TAS pour construire un tas sur le tableau
A [1..n] ou n = longueur (A).

Comme l'élément maximal du tableau est stocké à la racine A[1], on peut le placer dans sa position finale
correcte en l'échangeant avec A[n].

Si l'on « ôte » à présent le nœud n du tas (en décrémentant taille[A]), on observe que A[1 . . (n− 1)] peut
facilement être transformé en tas max.

Les fils de la racine restent des tas, cependant la nouvelle racine peut violer la propriété des tas. Si c'est le cas,
un seul appel, ENTASSER (A, 1), restaure la propriété de tas, qui laisse derrière un A [1... (n-1)].

L'algorithme du tri par tas répète alors ce processus pour le tas de taille n-1 jusqu'au tas de taille 2.

7
2- Construire un tas et Algorithme de tri par tas

Procédure TRIER_TAS(A)

var

var

i,permut : entier

Début

CONSTRUIRE_TAS ({E}A : entier)

Pour i ← longueur(A) à 2 faire

permut ← A[1]

A[1] ← A[i]

A[i] ← permut

taille(A) ← taille(A) – 1

ENTASSER (A, 1)

fin pour

fin

8
Application 2 :

Application 2 :
IV
Exercice [solution n°3 p.16]
[*]

Un tri par tas commence par utiliser

 Une fonction pere

 Une procédure ENTASSER

 Une procédure CONSTRUIRE_TAS

[solution n°4 p.16]


Exercice
[*]

Soit le graphique ci-dessus, et considérons un tableau Tab.

L'appel qui permet de restaurer la propriété de tas est

Compléter la procédure de tri par tas de notre cas

Procédure TRIER_TAS(Tab)

var

i,permut : entier

Début

Pour ← à faire

permut ←

← permut

taille( ) ← taille( )–1

fin pour

fin

9
3- La table à adressage direct

3- La table à adressage
direct V

Définition : 3.1- Définition


L'adressage direct est une technique simple qui fonctionne bien lorsque l'univers U des clés est
raisonnablement petit. Supposons qu'une application ait besoin d'un

ensemble dynamique dans lequel chaque élément possède une clé prise dans l'univers U = {0, 1, . . . , m − 1},
où m n'est pas trop grand. On supposera que deux éléments

ne peuvent pas avoir la même clé.

Pour représenter l'ensemble dynamique, on utilise un tableau, aussi appelé table à adressage direct, T[0 . .
m−1], dans lequel chaque position, ou alvéole, correspond à

une clé de l'univers U

Implémentation d'un ensemble dynamique à l'aide de table à adressage direct T [0,..., 9].

Chaque clé appartient a U = {0, ..., 9} et correspond à un indice de T.

K = {2, 3, 5, 8} est l'ensemble des clés réelles et détermine les alvéoles de la table qui contiennent des pointeurs
sur les éléments. Les autres alvéoles contiennent NIL.

Plus généralement, l'alvéole k pointe sur un élément de l'ensemble ayant pour clé k. T[k] ←NIL si
l'ensemble ne contient aucun élément de clé k.

3.2- Algorithmes associés

- RECHERCHER-ADRESSAGE-DIRECT (T, k)
renvoyer T[k]

- INSERER-ADRESSAGE-DIRECT (T, x)
T[clé[x]] ← x

- SUPPRIMER-ADRESSAGE-DIRECT (T, x)
T [clé[x]]← NIL

10
3- La table à adressage direct

Remarque : 3.3- Remarque

L'inconvénient de l'adressage direct est évident : si l'univers U est grand, gérer une table T de taille U peut se
révéler compliqué, voire impossible, compte tenu de

la mémoire généralement disponible dans un ordinateur.

Par ailleurs, l'ensemble K des clés réellement conservées peut être tellement petit comparé à U que la majeure
partie de l'espace alloué pour T est gaspillé.

Lorsque l'ensemble K des clés stockées dans un dictionnaire est beaucoup plus petit que l'univers U de toutes
les clés possibles, une table de hachage requiert moins

de place de stockage qu'une table à adressage direct.

11
Application 3 :

Application 3 :
VI
Exercice [solution n°5 p.17]
[* ]

L'adressage direct fonctionne bien :

 lorsque l'univers U des clés est raisonnablement grand

 lorsque l'univers U des clés est petit

 lorsque l'univers U des clés est grand

Exercice [solution n°6 p.17]


[* ]

Un alvéole est :

 une représentation d'une table

 est l'ensemble dynamique d'un tableau

 est une position de l'adressage direct

12
4- Tables de hachage

4- Tables de hachage
VII
4.1- Généralité

Une table de hachage est une structure de données qui permet une association clé–valeur, c'est-à-dire une
implémentation du type abstrait tableau associatif ; en particulier, l'implémentation d'une table des symboles
lorsque les clés sont des chaînes de caractères.

Avec l'adressage direct, un élément de clé k est conservé dans l'alvéole k. Avec le hachage, cet élément est
stocké dans l'alvéole h(k) ; autrement dit, on utilise une

fonction de hachage h pour calculer l'alvéole à partir de la clé k.

h établit une correspondance entre l'univers U des clés et les alvéoles d'une table de hachage.

On dit qu'un élément de clé k est haché dans l'alvéole h(k) ; on dit également que h(k) est la valeur de
hachage de la clé k.

- Le but de la fonction de hachage (h) est de réduire l'intervalle des indices de tableau à gérer. Au lieu de
U valeurs, il suffit de gérer m valeurs. Les besoins en stockage sont réduits en conséquence.

- L'inconvénient de cette idée est que deux clés peuvent être hachées vers la même alvéole, entraînant
ainsi une collision. Heureusement, il existe des techniques efficaces pour résoudre les conflits créés par
les collisions.

4.2-Résolution de collisions par chaînage

Avec le chaînage, on place dans une liste chaînée tous les éléments hachés vers la même alvéole. L'alvéole j
contient un pointeur vers la tête de liste de tous les éléments hachés vers j ; si aucun n élément n'est présent,
l'alvéole j contient NIL.

Les opérations de dictionnaire sur une table de hachage T sont faciles à implémenter lorsque les collisions
sont résolues par chaînage.

INSERER-HACHAGE-CHAÎNEE(T, x) : insère x en tête de la liste T[h(clé[x])]

RECHERCHER-HACHAGE-CHAÎNEE(T, k) : recherche un élément de clé k dans la liste T[h(k)]

SUPPRIMER-HACHAGE-CHAÎNÉE(T, x) : supprime x de la liste T[h(clé[x])]

13
4- Tables de hachage

4.3- Fonctions de Hachage

Une fonction de hachage est une fonction qui transforme une donnée (la clé) en un entier (l'indice dans le
tableau).

Formellement : h(k) = i, elle établit une correspondance entre un couple(clé,valeur) et un indice du tableau.
Le couple se trouvera à T[i].

Principe :

C'est une technique très utilisée en informatique, elle se base sur une fonction h appelée fonction de hachage ou
de hashcoding, qui appliquée à la clé fournit l'indice correspondant dans la table.

On trouve plusieurs types de fonctions utilisées en Hashcoding :

- Si la clé est une chaîne de caractères (nom)

h(clé) = CodeASCII ( 1er car) + Code ASCII(2eme ` car) mod N

CodeASCI : ramène la valeur décimale correspondant à la table ASCII voir le lien : http://www.table-ascii.com/

- Si clé est une valeur numérique.

h(clé) = clé mod N

La fonction de hachage doit donner des valeurs entières dans l'intervalle des indices de la tables : 0 <=h(cle´) <=
N.

En plus, cette fonction doit être la plus distribuée possible sur cet intervalle, pour que les informations ne se
concentrent pas dans une partie de la table.

- Illustration :

Une bonne fonction de Hachage vérifie (approximativement) l'hypothèse de Hachage uniforme : chaque clé a
autant de chance d'être hachée dans une quelconque des m alvéoles.

14
Application 4 :

Application 4 :
VIII
Exercice [solution n°7 p.18]
[*]

Une table de hachage

 est une structure de données permettant d'implémenter des valeurs à indice numérique

est une structure de données qui permet l'implémentation d'une table des symboles lorsque les clés sont des
chaînes de caractères.

 est une structure de données permettant d'utiliser les listes

Exercice [solution n°8 p.18]


[*]

Une fonction de hachage est :

 établit une correspondance entre un association clé,valeur et un indice du tableau

 établit une correspondance entre un couple(clé,valeur) et une chaîne

établit une correspondance entre un couple(clé,valeur) et une liste


 chaînée

15
Solutions des exercices

Solutions des exercices

> Solution n°1 Exercice p. 5

La structure de tas est :

 un sous arbres

 un tableau qui peut être vu comme un arbre binaire

 un sous-arbres d'un arbre binaire

> Solution n°2 Exercice p. 5

A partir de la fonction du fils gauche veiller donner la valeur de de son indice et la valeur du nœud pour i =5

indice =10 valeur du nœud = 85

Veiller remplir le tableau de tas correspondant à l'arbre ci-dessus :

20 29 27 30 38 32 45 51 45 85 50 67

> Solution n°3 Exercice p. 9

Un tri par tas commence par utiliser

 Une fonction pere

 Une procédure ENTASSER

 Une procédure CONSTRUIRE_TAS

16
Solutions des exercices

> Solution n°4 Exercice p. 9

Soit le graphique ci-dessus, et considérons un tableau Tab.

L'appel qui permet de restaurer la propriété de tas est ENTASSER(Tab,1)

Compléter la procédure de tri par tas de notre cas

Procédure TRIER_TAS(Tab)

var

i,permut : entier

Début

CONSTRUIRE_TAS({E}Tab:entier)

Pour i ← longueur(Tab) à 2 faire

permut ← Tab[1]

tab[1] ← Tab[i]

Tab[i] ← permut

taille(Tab) ← taille(Tab) – 1

ENTASSER(Tab,1)

fin pour

fin

> Solution n°5 Exercice p. 12

L'adressage direct fonctionne bien :

 lorsque l'univers U des clés est raisonnablement grand

 lorsque l'univers U des clés est petit

 lorsque l'univers U des clés est grand

> Solution n°6 Exercice p. 12

Un alvéole est :

 une représentation d'une table

17
Solutions des exercices

 est l'ensemble dynamique d'un tableau

 est une position de l'adressage direct

> Solution n°7 Exercice p. 15

Une table de hachage

 est une structure de données permettant d'implémenter des valeurs à indice numérique

est une structure de données qui permet l'implémentation d'une table des symboles lorsque les clés sont des chaînes
de caractères.

 est une structure de données permettant d'utiliser les listes

> Solution n°8 Exercice p. 15

Une fonction de hachage est :

 établit une correspondance entre un association clé,valeur et un indice du tableau

 établit une correspondance entre un couple(clé,valeur) et une chaîne

établit une correspondance entre un couple(clé,valeur) et une liste


 chaînée

18

Vous aimerez peut-être aussi