ASD-chap1 2023
ASD-chap1 2023
ASD-chap1 2023
avancées
Mastère Infotronique
1/80
Plan du cours
• Complexité
• Algorithmes de tri
• Programmation dynamique
• Algorithmes gloutons
• NP-complétude
3/80
Structures de données élémentaires
• Il existe plusieurs manières de représenter la notion
d’ensemble
• Il n’y a pas une représentation « meilleure » que les
autres dans l’absolu
– La meilleure représentation sera celle qui permettra de
concevoir l’algorithme de moindre complexité
• Chaque élément de ces ensembles pourra comporter
plusieurs champs
– Les champs peuvent être consultés des lors qu’on
possède une référence sur cet élément une référence
4/80
Structures de données élémentaires
5/80
Structures de données élémentaires
• Liste chainée
• Piles
• Files
• Arbres
• Tables de hachage
6/80
Listes chainées
7/80
Listes chainées
◼ Une liste chaînée est une structure de données dont les
éléments sont arrangés linéairement
◼ l'ordre linéaire étant donné par des pointeurs sur les
éléments
8/80
Listes chainées
◼ Un pointeur TETE(L) est associé à une liste chaînée L
◼ il pointe sur le premier élément de la liste
9/80
Listes chaînées
Liste: Sa représentation réelle en mémoire
10/80
Listes chainées
11/80
Listes chainées
◼ Une liste chaînée peut prendre plusieurs formes
◼ Liste doublement chainée: en plus du champ successeur,
13/80
Listes chainées
◼ Liste triée ou non triée: suivant que l’ordre linéaire des
éléments de la liste correspond ou non à l’ordre linéaire
des clés de ces éléments
14/80
Listes chainées
Algorithmes de manipulation des listes chaînées
◼ L la liste chainée
◼ TETE(L) pointeur sur le premier élément de la liste
◼ QUEUE(L) pointeur sur le dernier élément de la liste
suivant
15/80
28/80
Listes chainées
Types
Cellule = Struct
cle : Entier
successeur : ^Cellule
FinStruct
Variables
tete : ^Cellule
16/80
Listes chainées
◼ Recherche: RECHERCHE-LISTE(L,k) retourne un pointeur
sur le premier élément de L de clé k, si cet élément existe, sinon
retourne NIL
RECHERCHE-LISTE(L,k){
pTETE(L);
tant que(p!=NIL et clé(p)!=k)
Psuccesseur(p);
retourner p;
}
17/80
Listes chainées
INSERTION-LISTE(L,X){
successeur(x)TETE(L);
TETE(L) ) x;
}
18/80
Listes chainées
◼ Suppression: SUPPRESSION-LISTE(L,X) supprime de la
liste L son élément pointé par X
SUPPRESSION-LISTE(L,X){
Si x=TETE(L) alors TETE(L) ) successeur(x)
sinon{
y TETE(L);
tant que successeur(y)!=x faire
y successeur(y);
fin tant que
successeur(y) successeur(x);
}
}
20/80
Piles
Définition
◼ Une pile est une structure de données mettant en
œuvre le principe « dernier entré premier sorti »
21/80
Piles
Applications
23/80
Piles
• On note:
• sommet(P) l’indice du tableau contenant la tête de la pile initialisé à
-1 ➔ pile vide
• longeur(P) taille de la pile
• PILE-VIDE(P) retourne vrai si pile vide sinon retourne faux
• EMPILER(P,x) empile l’élement x dans la pile
• DEPILER(P) dépile l’élement x de la pile
24/80
Piles
PILE-VIDE(P){
Si sommet(P)==-1
alors retourner VRAI
sinon retourner FAUX
}
25/80
Piles
EMPILER(P,x){
Si sommet(P)==longueur(P)-1
alors erreur (débordement positif)
sinon { sommet(P)sommet(P)+1
P[sommet(P)]x
}
}
DEPILER(P){
Si PILE-VIDE(P)
alors erreur (débordement négatif )
sinon { sommet(P)sommet(P)-1
retourner P[sommet(P)+1]
}
}
26/80
Piles
Types
Pile = ^Cellule
Cellule = Struct
Elem : Entier
Suiv : Pile
FinStruct
Variables
P : Pile
27/80
Procédure Empiler(x :entier, P :Pile)
Variables
Q : Pile
Début
Allouer(Q)
Q^.Elem x
Q^.Suiv P
P Q
Fin
29/80
Files
Définition (file) :
◼ Une file est une structure de données mettant en œuvre le
principe « premier entré premier sorti »
◼ FIFO : First In First Out
◼ Une file se comporte comme une file d’attente de la vie
courante
30/80
Files
Applications
• En général, on utilise des files pour mémoriser temporairement des transactions qui
doivent attendre pour être traitées.
• Les serveurs d'impression, qui doivent traiter les requêtes dans l'ordre dans lequel
elles arrivent, et les insèrent dans une file d'attente (ou une queue).
• Certains moteurs multitâches, dans un système d'exploitation, qui doivent accorder du
temps- machine à chaque tâche, sans en privilégier aucune.
• Un algorithme de parcours en largeur utilise une file pour mémoriser les nœuds visités.
31/80
Files
32/80
Files
33/80
Files
◼ Initialement : tete(F) = -1
queue(F) = 0
34/80
Files
FILE-VIDE(F){
si tete(F)==-1 alors
retourner VRAI
sinon
retourner FAUX
}
INSERTION(F,x){
si (queue(F) (modulo n) ==tete(F))
alors erreur (débordement positif)
sinon{
F[queue(F)]=x
Si tete(F)=-1alors
Tete(F)=queue(F)
queue(F)=(queue(F)+1) (modulo n)
}
35/80
}
Files
SUPPRESSION(F){
si FILE-VIDE(F)
alors erreur (débordement négatif)
sinon {
X = F[tete(F)];
tete(F)=(tete(F)+1) modulo n;
Si tete(F) = queue(F)
tete(F) = -1
retourner X;
}
}
36/80
Exemple
37/80
Files
Types
File : ^cellule
Cellule = Struct
Elem : Entier
Suiv : File
FinStruct
Variables F : File
38/80
Procédure Initialiser(F :File)
Début
F.Tête Nil
F.Queue Nil
Fin
39/80
Arbres
40/80
Arbres
arêtes 41/80
Arbres
niveau 2
parent
et
niveau 3
fils
feuilles 42/80
48/80
Arbres
43/80
Arbre binaire
◼ Arbre binaire: structure de donnée qui peut être définie
récursivement de la façon suivante:
◼ Soit vide
44/80
Arbres binaires
45/80
Arbres binaires
10 16
8 12 15 18
7 9 11 13
46/80
Arbre binaire de recherche
47/80
Arbre binaire de recherche
clé(y)≤clé(x)
48/80
Arbre binaire de recherche
Exemple
49/80
Arbre binaire de recherche
• Pour accéder à la clé la plus petite dans un ABR il suffit de descendre sur le
fils gauche autant que possible ➔ le dernier nœud visité, qui n’a pas de
fils gauche, porte la valeur la plus petite de l’arbre.
50/80
Arbre binaire de recherche
• Pour accéder à la clé la plus grande dans un ABR il suffit de descendre sur
le fils droit autant que possible ➔ le dernier nœud visité, qui n’a pas de
fils droit, porte la valeur la plus grande de l’arbre.
51/80
Arbre binaire de recherche
52/80
Arbres Binaires: représentation par
pointeurs
Types
Arbre = ^Noeud
Noeud = Struct
clé : Entier
sa-gauche : Arbre
sa-droit : Arbre
FinStruct
Variables
Racine : Arbre
53 53/80
59/80
Parcours infixe
Parcours Infixe d’un arbre est décrit réursivement :
54 54/80
59/80
ABR: parcours infixe
Exemple:
Infixe visites :
14
(8)
(10)
10 16 (11)
(14)
(15)
8 11 15 18 (16)
(18)
55 59/80
55/80
ABR: parcours infixe
Parcours infixe d’un arbre binaire de recherche permet l'affichage des
clés des nœuds par ordre croissant
Infixe(A) {
Si A≠NIL
{
Infixe(sa-gauche(A));
Afficher(cle(A));
Infixe(sa-droit(A));
}
}
62/80
56/80
ABR : Rechercher un élément
Soit un ABR :
G D
63 63/80
57/80
ABR : Rechercher un élément
rechercher(racine, x) Exemple:
comparer x à la clé de la racine:
14
- si x == clé retourner A
- si x < clé => chercher dans G
10 16
- si x > clé => chercher dans D
8 11 15
chercher de la même manière
dans G ou D
58/80 64
ABR : Rechercher un élément
• Recherche d'un élément : rechercher(A,k)
◼ retourne le pointeur sur un nœud dont la clé est k,
rechercher(A,k){
si (A==NIL ou cle(A)==k)
retourner A
sinon si (k≤cle(A))
rechercher(sa-gauche(A),k)
sinon
rechercher(sa-droit(A),k)
59/80
65/80
}
ABR : Insertion d’un élément
66/80
60/80
ABR : Insertion d’un élément
4) Ajouter L C 5) Ajouter M
C
A L
A L
B
B M 61/80 67
ABR : Insertion d’un élément
Ajout de : A B C L M Ajout de : C A B L M
A
C
B
A L
C
L B M
M 62/80
68/80
ABR : Insertion d’un élément
◼ la fonction insertion(A,k) insère un nœud de clé k dans l'arbre dont
la racine est pointée par A
Insertion(A,k){
Creer_nœud(z); cle(z)=k; sa-gauche(z)=NIL; sa-droit(z)=NIL;
x=A; père_de_x=NIL;
tant que (x≠NIL){
pere_de_x=x;
si (k≤cle(x)) x=sa-gauche(x)
sinon x=sa-droit(x)
}
si (A==NIL) A=z
sinon si (k≤cle(pere_de_x)) sa-gauche(pere_de_x)=z
sinon sa-droit(pere_de_x)=z
}
63/80
69/80
ABR : Minimum
• Minimum(A) :
◼ la fonction minimum(A) retourne le pointeur NIL
66/80
Tables de hachage
• Définitions
• Une table de hachage (hash table en anglais) est une structure de donnée
permettant d'associer une valeur à une clé.
• Il s'agit d'un tableau ne comportant pas d'ordre (un tableau est indexé par
des entiers). L'accès à un élément se fait en transformant la clé en une
valeur de hachage (ou simplement hachage) par l'intermédiaire d'une
fonction de hachage.
67/80
Tables de hachage
68/80
Tables de hachage
69/80
Tables de hachage
Cette structure n'est donc pas adaptée pour accéder à des données
triées
70/80
Tables de hachage
Lorsque deux clés ont la même valeur de hachage (collision), ces clés ne
peuvent être stockées à la même position. De nombreuses stratégies de
résolution des collisions existent mais les plus connues et utilisées sont le
chaînage et l'adressage ouvert.
Chaînage : Cette méthode est la plus simple. Chaque case de la table est en fait
une liste chaînée des clés qui ont le même hachage (chaînage en tête de liste).
Soit h(k,i) une fonction de sondage. Une méthode de sondage consiste à essayer les
alvéoles d'indice h(k,0), h(k,1), ..., jusqu'à ce qu'on trouve une alvéole vide.
Il y a trois méthodes de sondage :
73/80
Tables de hachage
74/80
Tables de hachage
Soit la structure suivante :
Item: Enregistrement
valeur : Entier
etat: Entier
Fin Enreg
HashExist (TH : THachage ,m,V :entier) : recherche d’une valeur V dans une table
de taille m, en utilisant un sondage linéaire
Hashinsert(TH: THachage,m,V :entier) : insertion d’une valeur V dans une table de
taille m, en utilisant un sondage linéaire
Hashdelete(TH: THachage,m,V :entier) : suppression d’une valeur V d’une table de
75/80
taille m, en utilisant un sondage linéaire