Académique Documents
Professionnel Documents
Culture Documents
II - Application 1 : 5
IV - Application 2 : 9
VI - Application 3 : 12
VIII - Application 4 : 15
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.
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,
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]
[*]
un sous arbres
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
5
2- Construire un tas et Algorithme de tri par tas
2- Construire un tas et
Algorithme de tri par tas III
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.
var
Début
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
fin si
fin
Illustration ci-dessous
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.
Début
ENTASSER (A, i)
fin pour
fin
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
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]
[*]
Procédure TRIER_TAS(Tab)
var
i,permut : entier
Début
Pour ← à faire
permut ←
← permut
fin pour
fin
9
3- La table à adressage direct
3- La table à adressage
direct V
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
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 à
Implémentation d'un ensemble dynamique à l'aide de table à adressage direct T [0,..., 9].
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.
- 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
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
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
11
Application 3 :
Application 3 :
VI
Exercice [solution n°5 p.17]
[* ]
Un alvéole est :
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
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.
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.
13
4- Tables 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.
CodeASCI : ramène la valeur décimale correspondant à la table ASCII voir le lien : http://www.table-ascii.com/
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]
[*]
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.
15
Solutions des exercices
un sous arbres
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
20 29 27 30 38 32 45 51 45 85 50 67
16
Solutions des exercices
Procédure TRIER_TAS(Tab)
var
i,permut : entier
Début
CONSTRUIRE_TAS({E}Tab:entier)
permut ← Tab[1]
tab[1] ← Tab[i]
Tab[i] ← permut
taille(Tab) ← taille(Tab) – 1
ENTASSER(Tab,1)
fin pour
fin
Un alvéole est :
17
Solutions des exercices
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.
18