Académique Documents
Professionnel Documents
Culture Documents
Structures de données
Partie 1 (5h)
Ye-Qiong SONG
• Tri
• Recherche
• Traitement des chaînes de caractères
• Graphes (le plus court chemin, coloriage,…)
• Problèmes combinatoires (voyageur de
commerce, sac à dos)
• Calcul numérique (intégrale, systèmes
d’équations, …)
cours d’algo. et prog. par Y.Q. Song 4
Stratégies de conception d’algo.
Arbre du jeu
Evaluation:
cout réel du produit + cout estimé du produit suivant
e.g. pour x4
c4x4 + c2(b-x4b4)/b2
- longeur()
- ième()
- supprimer()
- ajouter()
lg = 5
Algorithme ajouter(r, e)
Algorithme supprimer(r)
pourtout i de lg-1 à r-1 faire
pourtout i de r à lg faire
éléments[i+1] = éléments[i]
éléments[i-1] = éléments[i]
finpour
finpour
éléments[i-1] = e
lg = lg-1
lg = lg+1
Rmq: la suppression de l’élément de tête est coûteuse à cause du décalage de tous
les éléments à temps de calcul long (e.g. cas dans une file d’attente FIFO)
cours d’algo. et prog. par Y.Q. Song 21
Listes implantées avec tableaux
• Solution: gestion circulaire d’un tableau
– Indice de début et indice de fin de la liste
– Plus besoin du décalage lors de la suppression de l’élément de tête, donc
plus rapide. Demande un peu plus de mémoire (deux indices au lieu d’un)
tête queue
éléments 23 182 100 20 30
queue tête
éléments 100 20 30 23 182
5 20 4 9 45
Nœud de rang r
…
Nœud de rang r
…
5 7 7
6 6
Noeud(int v) { val = v; }
}
class TesterPile{
public static void main(String[] args){
Pile p = new Pile(10);
int x;
p.empiler(1);
p.empiler(2);
x = p.depiler();
System.out.println(x);
}
}
public Pile_chainee() {
pointeur = null;
}
}
}
public Pile_chainee() {
pointeur = null;
}
public boolean estVide() {
return (pointeur == null);
}
public void empiler(int val) {
pointeur = new Noeud(val, pointeur);
} pointeur pointeur
int depiler() { 6 4 2 null
if (!estVide()) {
int val = pointeur.valeur;
pointeur = pointeur.next;
return val; pointeur
} 4 2 null
else System.out.println(‘‘la pile est vide’’);
}
} cours d’algo. et prog. par Y.Q. Song 38
• Un petit programme de test pourra être:
class TesterPile{
public static void main(String[] args){
Pile_chainee p = new Pile_chainee();
int x;
p.empiler(2);
p.empiler(4);
p.empiler(6);
x = p.depiler();
System.out.println(x);
}
}
ajout suppression
class Queue{
int fin;
int[] t;
public Queue(int taille){
t = new int[taille];
fin = 0;
}
}
debut fin
éléments 23 182 100 20 30
Relation type
Relation typeabstrait
abstrait / /représentation
représentation
REPRÉSENTATION 1
TYPE_X EN JAVA
s2
s4 s3
s7 s8
s5
s6
Un graphe (orienté) G(V,E) est un ensemble de sommets V (vertices) reliés par
des arcs E (Edges), avec a=(x,y) ∈E qui possède une extrémité initiale x ∈V et
une extrémité finale y ∈V. Si x=y, l’arc est appelé une boucle.
Si les relations entre les sommets sont symétriques, on peut avoir un graphe non
orienté. On parle alors des arêtes au lieu des arcs.
Il est possible d’ajouter des informations sur les sommets pour les identifier, ou
sur les arcs pour les pondérer. Un graphe dont les arcs (ou arêtes) portent des
valuations est appelé graphe valué.
cours d’algo. et prog. par Y.Q. Song 56
Graphes: terminologie
• Un chemin est une liste de sommets dans lequel deux sommets
successifs sont reliés par un arc. La longueur d’un chemin est égale au
nombre d’arcs. Un chemin ne rencontrant pas deux fois le même
sommet est dit élémentaire. Un cycle est un chemin dont le premier
sommet et le dernier sommet sont identique
• Un graphe est dit connexe s’il existe un chemin reliant toute paire de
sommets. (Dans l’exemple de graphe précédent, il existe deux
composantes connexes)
• Un graphe est dit creux s’il existe peu d’arcs (ou arêtes) et dense dans
le cas contraire
• Un graphe simple est un graphe sans boucle, ni arc multiple. Le
nombre d’arcs d’un graphe simple à n sommets est compris entre 0 et
n(n-1), et n(n-1)/2 si le graphe est non orienté
• Deux arcs sont dits adjacents s’ils ont au moins un sommet commun
s1 0 1 0 1 0 0 0 0 1
s2 0 0 0 0 0 0 0 0 0 s1
s3 0 0 0 1 0 0 0 0 0
s4 0 0 1 0 0 1 0 0 0
s5 0 0 0 1 0 0 0 0 0 s2 s9
s6 0 0 0 0 1 0 0 0 0
s7 0 0 0 0 0 0 0 1 0
s8 0 0 0 0 0 0 0 1 0
s4 s3
s9 0 0 0 0 0 0 0 0 0
s4 s6
s5
s6
Pour un graphe de n sommets et p arcs,
s9 cette représentation a une complexité spatiale (espace mémoire)
de n+p si le graphe est orienté, et n+2p si le graphe est non
orienté
0 0 7 5 2 1 6
6
1 7 0
2
2 7 0
7 3 5 4
1
4 6 5 7 3
3 5 0 4 3
4 6 4 0
5 7 1 2 0 4
Étapes de l'algorithme :
1.Mettre le nœud de départ dans la file.
2.Retirer le nœud du début de la file pour l'examiner.
3.Mettre tous les voisins non examinés dans la file (à la fin).
4.Si la file n'est pas vide reprendre à l'étape 2.
de graphes 2
7
1
Arbre de recherche
en-profondeur-d’abord 3
4
0 5
0 7 5 2 1 6
7 1 7 0
2 7 0
1 2 4 3 5 4
4 6 5 7 3
6 5 5 0 4 3
6 4 0
3 7 1 2 0 4
cours d’algo. et prog. par Y.Q. Song 66
0 7 5 2 1 6
1 7 0
2 7 0
3 5 4
4 6 5 7 3
En-profondeur-d’abord
5 0 4 3 En-largeur-d’abord
6 4 0
7 1 2 0 4
0
6
0
6
2
2
7
1
7
1
3
4 3
5 4
cours d’algo. et prog. par Y.Q. Song 5 67
Algorithmes de parcours de graphes
En largeur: A, B, C, E, D, F, G
En profondeur: A, B, D, F, C, G, E
cours d’algo. et prog. par Y.Q. Song 68
Graphes: application
• Problème de recherche du plus court chemin dans un graphe
• Solution de Dijkstra (algorithme de Dijkstra [1959])
• Exemple d’un graphe valué
1 s: source
x = (sx, dx)
S0 S1
où
7
8 dx = min(tous les chemins de source
10 1 sommet x, noté sx)
S2 On note:
dx=∞ si pas de chemin entre s et sx
S3 4 S4 2 dx=0 si x=s
L’ensemble solution S pour source s=s0:
2 S = {(s0,0), (s1,1), (s2,4), (s3,6),(s4,2), (s5, ∞)}
S5
cours d’algo. et prog. par Y.Q. Song 69
Graphes: application
• Algorithme de Dijkstra (condition: valeur des arcs >= 0)
aussi connu sous SPF (Shortest Path First)
Construire l’ensemble S de façon itérative: 1
S0 S1
Au début: 8 7
S=∅ 2
S5
D = {(s0,0), (s1, ∞), (s2, ∞), (s3, ∞),(s4, ∞), (s5, ∞)}
A chaque itération:
∃ m = (sm,dm) ⊂ D, t.q. ∀x ⊂ D, dm=min(dx)
m est alors retiré de l’ensemble D et ajouté dans S
(Affirmation: dm est le plus court chemin entre s et sm)
S {(A,0)}
D{(B,85), (C,217), (E,173), (D,∞),
(F,∞), (G,∞), (H,∞), (I,∞), (J,∞)}
[source: wikipédia]
cours d’algo. et prog. par Y.Q. Song 79
S D
{(A,0)} {(B,85), (C,217), (E,173), (D,∞), (F,∞),
(G,∞), (H,∞), (I,∞), (J,∞)}
{(A,0), (B,85)} {(C,217), (E,173), (D,∞), (F,165), (G,∞),
(H,∞), (I,∞), (J,∞)}
{(C,217), (E,173), (D,∞), (G,∞), (H,∞),
{(A,0), (B,85), (F,165)} (I,415), (J,∞)}
Propriétés:
-Deux nœuds quelconques de S sont connectés par un chemin simple unique,
-G est connexe, mais ne l’est plus si l’on retire une arête quelconque,
-G est sans circuit, mais ne l’est plus si l’on ajoute une arête quelconque,
-G est connexe, et Card(A) = Card(S) – 1,
-G est sans cycle, et Card(A) = Card(S) – 1
2 3 4
Une forêt est un ensemble d’arbres
5 6 7 8 9
1 2 3
1.2.1 1.2.2
1 1
2 2
3 3
VisiterPréfixe(Arbre A)
{
Visiter(A)
Si Non_Vide(gauche(A))
VisiterPréfixe(gauche(A))
Si Non_Vide(droite(A))
VisiterPréfixe(droite(A))
}
cours d’algo. et prog. par Y.Q. Song 90
Parcourir un arbre binaire
VisiterPostfixe(Arbre A)
{
Si Non_Vide(gauche(A))
VisiterPostfixe(gauche(A))
Si Non_Vide(droite(A))
VisiterPostfixe(droite(A))
Visiter(A)
}
cours d’algo. et prog. par Y.Q. Song 91
Parcourir un arbre binaire
VisiterInfixe(Arbre A)
{
Si Non_Vide(gauche(A))
VisiterInfixe(gauche(A))
Visiter(A)
Si Non_Vide(droite(A))
VisiterInfixe(droite(A))
}
cours d’algo. et prog. par Y.Q. Song 92
Parcourir un arbre binaire
Propriété:
Un parcours infixe d’un
arbre binaire de recherche
traite les sommets par clés
croissantes.
• Deux sous-algorithmes
– construction d'un ABR à partir d'une suite
d'éléments,
– parcours en profondeur dans l'ordre infixe de
cet ABR.
Insertion du 6
6
3 15 20 30 50
1 2 11 12 14 22 25 26 41 42
4 5 6 9 16 17 31 32 33 36 55 60 70
Arbre-B: définition
• Chaque nœud contient un nombre de « clés » qui servent
à séparer les sous arbres, pointés par des « pointeurs »
• Les clés de chaque nœuds sont rangés dans l’ordre
croissant
• Comme dans un ABR, prenons l’exemple d’un nœud de 2
clés k1 et k2 (k1<k2):
– Toutes clés k du sous-arbre gauche respectent k<k1
– Toutes clés k du sous-arbre entre k1 et k2 respectent k1<k<k2
– Toutes clés k du sous-arbre droit de k2 respectent k>k2
57 . . .
14 40 . . 72 84 . .
01 12 . . 15 16 17 . 47 56 . . 58 60 61 . 74 75 76 78 85 86 99 .
cours d’algo. et prog. par Y.Q. Song [Exemple de semaphore co.] 121
Arbre-B: insertion
57 . . .
14 40 . . 72 84 . .
01 12 . . 15 16 17 . 47 56 . . 58
5859
6060
6161
. 74 75 76 78 85 86 99 .
cours d’algo. et prog. par Y.Q. Song [Exemple de semaphore co.] 122
Arbre-B: insertion
57 . . .
14 40 . . 72
72 76
84 84
. ..
01 12 . . 15 16 17 . 47 56 . . 58 60 61 . 74 75 76 78 85 86 99 .
74 75 . . 77 78 . .
cours d’algo. et prog. par Y.Q. Song [Exemple de semaphore co.] 123
Arbre-B: suppression
On veut supprimer 37
xx 37 xx xx xx 41 xx xx
… xx xx xx xx … xx xx xx xx
xx xx xx xx xx xx xx xx
41 43 xx xx 43 xx xx .
cours d’algo. et prog. par Y.Q. Song [Exemple de semaphore co.] 124
Arbre-B: suppression
On veut supprimer 67 è underflow pour un abre-B d’ordre 3 (2x3 clés)
xx 55 xx
22 24 26 28 33 44 66 67 68 . . .
xx 33 xx
22 24 26 28 . . 44 55 66 68 . . .
cours d’algo. et prog. par Y.Q. Song [Exemple de semaphore co.] 125
Arbre-B: suppression
On veut supprimer 52 è underflow (arbre-B de 2x2 clés)
Mais son nœud voisin n’a pas de clé à redistribuer (sinon underflow)
35 45 55 .
40 42 . . 50 52 . .
35 55 . .
40 42 45 50
cours d’algo. et prog. par Y.Q. Song [Exemple de semaphore co.] 126
Arbre-B: complexité
50
51
52
Un arbre-B de l’ordre m (maxi m fils) et de hauteur h a n feuilles:
[m/2]h ≤ n ≤ mh
[Source: Wikipédia]
cours d’algo. et prog. par Y.Q. Song 134
3 4 5 6
12 5 6 1
se
Fig.procède aussi
18 – Un tas, avecen deux de
remontée étapes:
la valeur 21 après insertion.
-le contenu de la racine est remplacé par celui du nœud le plus à droite du
La suppression se fait de manière similaire. D’abord, le contenu du nœud le plus à droite du
dernier niveau, et ce nœud est supprimé. (pour rester un arbre tassé)
ier niveau est transféré vers la racine, et ce nœud est supprimé. Ceci garantit que l’arbre
-le contenu
tassé. Ensuite, le contenu v delalaracine
v de nouvelle racine
est comparé est comparé
à la plus à la plus
grande des valeurs de sesgrande
fils des valeurs
de ses
en a). Si cette fils
valeur est(s’il en a).
supérieure à v,Sielle
cette valeur etestremplace
est remontée supérieure à v,duelle
le contenu père.est remontée et
ontinue ensuite avec le fils. Par exemple, la suppression de 16 dans l’arbre de gauche de la
e 19 conduit remplace le contenu
d’abord à l’arbre de droitedu depère. On continue
cette figure, 5. au
et enfin ensuite
FILES
tas avec20Éle fils.
DElaPRIORIT
de figure
0 0 0
16 10 v 15
1 2 1 2 1 2
14 11
15 11 15 11
3 4 5 6
3 4 5 6 3 4 5 6
8 10 9 3
8 14 9 3 8 14 9 3
7 8 9
7 8 9 10 7 8 9 2 4 7
2 4 7 10 2 4 7
Fig. 20 – Le tas de la figure 19 après suppress
Tas(int n) {
nTas = 0; a = new int[n];
}
int maximum() {
return a[0];
}
System.out.println(t);
• Avantages
– La structure de tableau permet, par un adressage
direct, d'examiner ou de modifier une position du
tableau en O(1)
– À chaque élément de la collection est associé une clé
dans l'univers U={0,1,...,m-1} de toutes les clés
possibles
– L'implémentation d'un dictionnaire dans un tableau
ordinaire suppose que le tableau soit de taille m (toutes
les clés possibles)
[extrait de Wikipedia]
Cette méthode évite dans une certaine mesure les grappes mais
forme des grappes secondaires
cours d’algo. et prog. par Y.Q. Song 155
Double hachage
Double hachage similaire à celui du sondage linéaire : on va chercher la
première case disponible en faisant varier un indice i, mais en plus de
l'incrémenter quand on rencontre une case occupée, on va aussi le
hacher ! Cela évitera mieux le « clustering » si la fonction de hachage est
bonne.
indice = (h(k) + i*h2(k)) mod M
BucketArray
Entry free
Bucket key val
System.out.println("clé 2: value="+h.get(2));
System.out.println("clé 3: value="+h.get(3));
}
}
cours d’algo. et prog. par Y.Q. Song 179
Le test donne…
Ajout de 0
Ajout de 1
Ajout de 2
Ajout de 3
Ajout de 4
Ajout de 5
Ajout de 6
Ajout de 7
2 contains: true
0 contains: true
9 contains: false
clé 2: value=4
clé 3: value=5