Algorithmique avancée - eCursus · Algorithmique avancée Théorie des graphes Mme Henry...

Post on 29-Sep-2020

8 views 0 download

Transcript of Algorithmique avancée - eCursus · Algorithmique avancée Théorie des graphes Mme Henry...

Algorithmique avancée

Théorie des graphes

Mme Henry Gros-Désormeaux

Professeur agrégé de Mathématiques, docteur en informatique

Université des Antilles

Février 2020

Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 1 / 33

1. Introduction

2. Généralités sur les graphes

2.1 Vocabulaire

2.2 Représentation d'un graphe

2.3 Algorithmes de parcours de graphes

3. Arbres

3.1 Vocabulaire

3.2 Arbre binaire

Pré requis : liste, tableau

Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 2 / 33

Problème des 7 ponts de Könisgberg, Euler, 1736

Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 3 / 33

Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 4 / 33

Problème du voyageur de commerce, Hamilton

Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 5 / 33

Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 6 / 33

Dé�nition 2.1

Graphe non orienté G = (V ,E ), n sommets, m arêtes

V : ensemble non vide et �ni de sommets

E : ensemble d'arêtes (paire d'éléments de V , éventuellement valuée)

Si e = (x , y), x et y sont les extrémité de e et x , y sont dits adjacents

ou voisins

e est incidente à x et y

ordre d'un graphe : nombre de sommets, degré d'un sommet : nombre

de voisins, notion de sommet isolé

Propriétés 1∑x∈V d(x) = 2|E |

Cadre : Graphe simple

Graphe orienté : arcs, degré intérieur, degré extérieur

Graphe pondéré : arêtes valuées

Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 7 / 33

Exemple 2.1

Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 8 / 33

Chaîne, cycle, chemin, circuit

Graphe non orienté

chaîne [x , y ] : suite �nie consécutives d'arêtes reliant les sommets x et

y

chaîne élémentaire : sommets distincts, chaîne simple : arêtes

distinctes

cycle : chaîne simple dont les 2 extrémités sont identiques

Graphe orienté

chemin [x , y ] : suite �nie d'arcs consécutifs reliant x à y

chemin élémentaire, chaîne élémentaire

circuit

Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 9 / 33

chemin, chaîne eulérien : toutes les arêtes sont présentes une seule fois

cycle, circuit hamiltonien: tous les sommets sont présents une seule fois

longueur : nombre d'arêtes

Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 10 / 33

Matrice d'adjacenceTableau à double entrée M[i ][j ], de dimension N(nombre de sommets)

M[i , j ] = 1 ou 0

0 1 1 0 0

1 0 1 1 1

1 1 0 1 1

0 1 0 0 0

0 1 1 0 0

import numpy as np

G=np.array(

[[0,1,1,0,0],[1,0,1,1,1],[1,1,0,1,1],[0,1,0,0,0],[0,1,1,0,0]])

Occupation mémoire O(n2)Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 11 / 33

Matrice d'incidence

Pour un graphe orienté Tableau à double entrée M[i ][j ], de dimension

N(nombre de sommets)

M[i , j ] = 1 si i est l'origine de l'arc, -1 si i est l'extrémité , 0 sinon

Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 12 / 33

Liste d'adjacence

0→ 1, 2, 1→ 0, 2, 3, 4, 2→ 0, 1, 3, 4, 3→ 1, 4→ 1, 2

S=[0,1,2,3,4]

G=[[1,2],[0,2,3,4],[0,1,3,4],[1],[1,2]]

Graphe orienté : liste de successeurs ou liste de prédecesseurs

Occupation mémoire O(n +m)Autre représentation possible : liste des sommets et liste des arêtes ou liste

des arcs

Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 13 / 33

Représentation par classe en Python

class Graph:

def __init__(self,nbsommets,listeAdj):

self.n=nbsommets

self.adjacence=listeAdj

def nbsommets(self):

return self.n

Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 14 / 33

Introduction

Exploration globale du graphe

Dé�nition 2.2

Un graphe non orienté est connexe si deux sommets quelconques peuvent

être reliés par une chaîne.

Un graphe orienté est fortement connexe, s'il existe un chemin entre tous

sommets x et y .

Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 15 / 33

Exploration en largeur

Sommet initial r : racine de l'exploration

Un sommet marqué est exploré quand on a marqué tous ses voisins

FIFO : premier marqué, premier traité

exemple : r : sommet a

[[b, c][a, c , d , e], [a, b, e], [b], [b, c]] Ordre d'exploration :a b c d e

Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 16 / 33

Entrée : G: graphe, s: racine

début

file : liste vide

marque : liste de n booléens initialisés à Faux

marque[s]=vrai

enfiler(s,file)

Tant que file non vide:

u=défiler(file)

pour chaque sommet v adjacent au sommet u:

si marque[v] est faux alors

marque[v]=vrai

enfiler(v)

fin si

fin pour

Fin tant que

Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 17 / 33

Exploration en profondeur

Sommet initial s : racine de l'exploration

Un sommet marqué est exploré quand on a marqué tous ses voisins

LIFO : dernier marqué, premier traité

exemple : s : sommet A

Ordre d'exploration :

Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 18 / 33

Parcours en profondeur récursif

Entrée : G: graphe, s: racine\\

marque : liste initialisée avec n booléens à False

Début

parcours_profondeur(G,s,marque)

marque[s]=True

pour chaque sommet v adjacent au sommet s:

si v.marque est faux alors

parcours_profondeur(G,v,marque)

fin si

fin pour

Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 19 / 33

Recherche de cycles dans un graphe

Théorème 2.1

Soit G un graphe non-orienté de matrice d'adjacence A. Le nombre de

chaines de longueur n joignant le sommet i au sommet j est donné par le

terme d'indice i,j de la matrice An

Conséquences : Méthode pour déterminer l'existence de cycles

Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 20 / 33

Algorithme de Dijkstra, 1959

Généralisation de BFS

Graphe Valué avec des coûts positifs

Principe du marquage

sommet non marqué, en cours de traitement, marqué

Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 21 / 33

Dé�nition 3.1

Un arbre est un graphe simple non orienté connexe sans cycles

Applications : arbres généalogiques, arbres de décision (météorologie,

domaine médical...)

Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 22 / 33

Vocabulaire

racine (→orientation implicite), feuille (degré 1)

Propriétés 2

Pour tout sommet u, il existe un unique chemin de la racine vers u.

Nombre d'arêtes=nombre de sommets −1

Tout sommet a sur ce chemin est un ancêtre de u et u est dit descendant

de a.

père, �ls, arité d'un sommet : nombre de �ls, feuille

profondeur d'un sommet : distance à la racine (3 est à la hauteur 0)

Hauteur d'un arbre : distance maximale d'une feuille à la racine

Le sous-arbre de racine 6 est de hauteur 1

Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 23 / 33

Structure d'arbres

class Arbre:

def __init__(self,racine,listeFils):

self.n=racine

self.fils=listeFils

def ajoutfils(self,arbre1):

self.fils=arbre1

Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 24 / 33

Les arbres binaires sont dé�nis récursivement.

Un arbre binaire T est une structure :

qui ne contient aucun noeud (arbre vide) ou

qui est formé de 3 ensembles disjoints de noeuds : un noeud racine, un

arbre binaire (sous-arbre gauche) et un arbre binaire (sous-arbre droit)

Vocabulaire : enfant gauche, enfant droit, enfant manquant

Arbre binaire complet : chaque noeud est soit une feuille, soit un noeud

qui a 2 enfants.

A la profondeur p, 2p noeuds.

Si h est la hauteur de l'arbre binaire, le nombre de feuilles est majoré par 2h

Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 25 / 33

Implémentation

Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 26 / 33

Arbres binaires de recherche

Chaque noeud contient une clé et éventuellement des données satellites.

Les clés sont stockées de manière à satisfaire la propriété suivante :

Propriétés 3

Soit x un noeud d'un arbre binaire.

Si y est un noeud du sous-arbre gauche de x, alors y.clé≤ x.clé

Si y est un noeud du sous-arbre de droite de x, alors x.clé≤y.clé

Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 27 / 33

Parcours en largeurA�chage des noeuds niveau par niveau

Entrée : A: arbre

début

file:liste vide

Si A non nul,

enfiler(A,file)

Tant que file non vide:

u=défiler(f)

Si u.filsG non nul

enfiler(u.filsG)

Fin Si

Si u.filsD non nul

enfiler(u.filsD)

Fin Si

Fin tant que

Fin SiMme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 28 / 33

Parcours en profondeur

3 types de parcours :

parcours pré�xe : a�che la racine avant les valeurs de chacun de ses

sous-arbes

parcours su�xe : a�che la racine après la valeur de ses sous-arbres

parcours in�xe : a�che les valeurs du sous-arbre gauche, puis la

racine, puis les valeurs du sous-arbre droit (ordre trié)

Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 29 / 33

pré�xe : r,a,c,h,d,i,j,l,b,e,k,f

su�xe: h,c,i,l,j,d,a,k,e,f,b,r

in�xe: c,h,a,i,d,l,j,r,k,e,b,f

Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 30 / 33

Pseudo-code

ParcoursInfixe(x)

Si x non nul

ParcoursInfixe(x.gauche)

Afficher x.clé

ParcoursInfixe(x.droite)

Fin Si

ParcoursPrefixe(x)

Si x non nul

Afficher x.clé

ParcoursPrefixe(x.gauche)

ParcoursPrefixe(x.droite)

Fin Si

Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 31 / 33

Recherche d'une clé

Pseudo-code

Version récursive

Rechercher(x,k)

Si x est nul ou k=x.cle

renvoie x

Si k<x.cle

renvoie Rechercher(x.gauche,k)

sinon renvoie Rechercher(x.droite,k)

Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 32 / 33

Insertion d'un élément

Arbre_Inserer(T,z)

y=None

x=T.racine

Tant que x non vide

y=x

si z.cle < x.cle

x=x.gauche

sinon x=x.droite

z.p=y

si y==nul

T.racine=z

sinon si

z.cle<y.cle

y.gauche=z

sinon

y.droite=z

Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 33 / 33