INFO0902 – Data Structures and
Algorithms
Graphes
Justus H. Piater
Concepts et définitions
Graphe
Concepts et définitions 3/40
Définition: Un graphe est (ici) un ensemble
de nœuds (vertices) et un ensemble de paires
d’éléments de , les arêtes (edges).
Deux nœuds liés par une arête sont adjacents.
Le degré d’un nœud est le nombre des arêtes
incidentes.
Exemples?
Graphes orientés
Concepts et définitions 4/40
Une arête peut être orientée (directed) ou non.
Un graphe est orienté si toutes les arêtes sont
orientées.
Une arête orientée a une origine et une destination.
Un nœud peut avoir des arêtes entrantes et des
arêtes sortantes.
Exemples?
Propriétés basiques
Concepts et définitions 5/40
Proposition: Si est un graphe avec arêtes,
alors .
Proposition: Si est un graphe orienté avec
arêtes, alors .
Proposition: Soit un graphe simple avec
nœuds et arêtes. Le nombre des arêtes est : Si
est non-orienté, alors ; si est orienté,
alors .
Graphes pondérés
Concepts et définitions 6/40
Les arêtes sont annotées d’une étiquette numérique,
son poids.
Exemples?
144
802
1235
964 1090
184
1258
2704
867
2342
1121
1391
621 740
849
337 1464
1846
187
DFW
BOS
MIA
LAX
PVD
ORD
SFO
JFK
BWI
TDA, SDD et algorithmes basiques
TDA graphe
TDA, SDD et algorithmes basiques 8/40
Vertices vertices(void);
Edges edges(void);
Edges incidentEdges(Vertex v);
Vertex opposite(Vertex v, Edge e);
Array endVertices(Edge e);
Boolean areAdjacent(Vertex v, Vertex w);
Object replace(Vertex v, Object o);
Object replace(Edge e, Object o);
Vertex insertVertex(Object o);
TDA graphe (suite)
TDA, SDD et algorithmes basiques 9/40
Edge insertEdge(Vertex v, Vertex w, Object o);
Object removeVertex(Vertex v);
Object removeEdge(Edge e);
Structure de liste des arêtes
TDA, SDD et algorithmes basiques 10/40
Deux conteneurs et :
Nœud:
une référence vers sa propre position (ou entrée)
dans
une référence vers les données
Arête:
une référence vers sa propre position (ou entrée)
dans
une référence vers les données
deux références vers les nœuds connectés
Regardons un exemple…
Complexité en espace?
Complexité en temps des méthodes?
Structure de liste des adjacences
TDA, SDD et algorithmes basiques 11/40
Pour éviter le parcours de toutes les arêtes, on
représente les incidences explicitement:
Incidence:
une référence vers l’arête incidente
Au nœud on ajoute une référence vers le conteneur
des incidences sur .
À l’arête connectant et on ajoute deux références
vers les incidences associées à dans et .
Regardons un exemple…
Complexité en espace?
Complexité en temps des méthodes?
Structure de matrice des adjacences
TDA, SDD et algorithmes basiques 12/40
Pour déterminer les adjacences entre deux nœuds en
temps constant, on ajoute à la structure de liste des
arêtes une matrice des adjacences:
Matrice des adjacences:
une matrice dont l’élément contient une
référence vers l’arête correspondante (ou nulle si elle
n’existe pas).
À chaque nœud on ajoute un indice (clé) entre et .
Regardons un exemple…
Complexité en espace?
Complexité en temps des méthodes?
Parcours en profondeur
TDA, SDD et algorithmes basiques 13/40
un fil (comme l’utilisa Thésée pour sortir du
labyrinthe)
de la peinture (comme Thésée aurait pû l’utiliser
pour trouver le Minotaure plus vite)
Algorithm DFS( , ):
Input: A graph and a vertex of .
Output: A labeling of the edges in the connected component
of as discovery edges and back edges.
label as visited
foreach in .incidentEdges( ) do
if is unvisited then
.opposite( , )
if is unexplored then
label as a discovery edge
DFS( , )
else
label as a back edge
Un exemple
TDA, SDD et algorithmes basiques 14/40
M N O P
I J K L
E F G H
A B C D
Parcours en profondeur: propriétés
TDA, SDD et algorithmes basiques 15/40
Proposition: Les arêtes de découverte forment un
arbre couvrant.
À prouver:
Tous les nœuds sont atteints.
Les arêtes de découverte ne forment aucun cycle.
Temps de calcul? Exigences aux structures de
données?
Parcours en largeur
TDA, SDD et algorithmes basiques 16/40
Avancer par «couches» de distance constante du
nœud de départ
Regardons un exemple
Parcours en largeur (suite)
TDA, SDD et algorithmes basiques 17/40
Algorithm BFS( , ):
Input: A graph and a vertex of .
Output: A labeling of the edges in the connected component
of as discovery edges and cross edges.
label as visited; insert it into container
while is not empty do
create empty container
foreach in do
foreach in .incidentEdges( ) do
if is unexplored then
.opposite( , )
if is unexplored then
label as a discovery edge
label as visited; insert it into
else
label as a cross edge
Parcours en largeur: propriétés
TDA, SDD et algorithmes basiques 18/40
Proposition: Les arêtes de découverte forment un
arbre couvrant.
Les conteneurs contiennent les nœuds des plus
courts chemins de longueur à partir de .
Temps de calcul? Exigences aux structures de
données?
Implémentation
TDA, SDD et algorithmes basiques 19/40
Comment attacher des attributs (visited, discovery
edge, back edge, cross edge) aux nœuds et arêtes:
Prévoir un champ explored?
Table de hashage externe?
Le design pattern décorable: attacher une application
à (ici) la position.
Object element(void);
Object get(Object key);
Object put(Object key, Object value);
Object remove(Object key);
Entries entries(void);
Plus courts chemins – Dijkstra
1 / 10 100%