• Aucun résultat trouvé

Arbres et graphes

N/A
N/A
Protected

Academic year: 2022

Partager "Arbres et graphes"

Copied!
35
0
0

Texte intégral

(1)

Andrea G. B. Tettamanzi, 2012 1

Algorithmique Algorithmique

Programmation Objet Programmation Objet

Python Python

Andrea G. B. Tettamanzi

Université de Nice Sophia Antipolis Département Informatique

[email protected]

(2)

CM - Séance 9

Arbres et

Graphes

(3)

Andrea G. B. Tettamanzi, 2012 3

Plan

• Arbres

– Définitions – Parcours – Réalisation

• Graphes

(4)

Arbre

• Structure de données récursive

• Un arbre est formé par

– Un nœud (dit « racine »), contenant

• Des données ou une référence à des données

• Des références (ou pointeurs) à des (sous-)arbres – Zéro ou plus sous-arbres

• Un nœud n'ayant pas des sous-arbres est dit « feuille »

• Les autres nœuds sont dits « nœuds internes »

• Nous avons déjà rencontré ce type de structure quand on a étudié les tas

(5)

Andrea G. B. Tettamanzi, 2012 5

Arbre

(6)

Arbre

• La racine r de l'arbre est l'unique nœud ne possédant pas de parent

• Tout nœud x qui n’est pas la racine a

– un unique parent, noté x.parent ou parent(x) (appelé « père » parfois)

– 0 ou plusieurs fils ; x.fils ou fils(x) désigne l’ensemble des fils de x

• Si x et y sont des nœuds tels que x soit sur le chemin de r à y, – x est un ancêtre de y

– y est un descendant de x

• Les fuilles n'ont pas de fils

(7)

Andrea G. B. Tettamanzi, 2012 7

Arbre

1 e s t l a r a c i n e 9 , 1 0 , 6 , 3 , 1 1 , 1 2 , 8 s o n t l e s f e u il l e s 1 1 e s t u n d e s c e n d a n t d e 4 , m a i s p a s d e 2 2 e s t u n a n c ê t r e d e 1 0

(8)

Arbre

• Quand il n’y a pas d’ambiguïté, on regarde les arêtes d’un arbre comme étant orienté de la racine vers les feuilles

• La profondeur d’un nœud (depth) est définie récursivement par – prof(v) = 0, si v est la racine

– prof(v) = prof(parent(v)) + 1

• La hauteur d’un nœud (height) est la plus grande profondeur d’une feuille du sous-arbre dont il est la racine

(9)

Andrea G. B. Tettamanzi, 2012 9

Arbre

1 e s t l a r a c i n e 2 , 3 , 4 s o n t à l a p r o f o n d e u r 1 5 , 6 , 7 , 8 à l a p r o f o n d e u r 2 L a h a u t e u r d e 2 e s t 2 , c e ll e d e 9 e s t 0 , c e ll e d e 3 e s t 0 , c e ll e d e 1 e s t 4

(10)

Arbre : Utilisation

• Les arbres sont un peu partout en Informatique

• Représenter la structure syntaxique d'espressions (parsing) – Mathématiques ou logiques

– De langages de programmations – Du langage naturel

• Gérer des bases de données

• Indexation de fichiers.

• Tri par tas

• Ils permettent des recherches rapides et efficaces.

(11)

Andrea G. B. Tettamanzi, 2012 11

Arbre : Parcours

• Parcours (tree traversal) :

– on traverse l’ensemble des nœuds de l’arbre

• Parcours en largeur d’abord (breadth first)

• Parcours en profondeur d’abord (depth first) – Préfixé

– Infixé – Postfixé

(12)

Parcours en largeur d'abord

• On visite la racine

• Puis on répète le processus suivant jusqu’à avoir visité tous les sommets :

– visiter un fils non visité du sommet le moins récemment visité qui a au moins un fils non visité

• On visite tous les sommets à la profondeur 1,

• puis tous ceux à la profondeur 2,

• puis tous ceux à la profondeur 3

• etc…

(13)

Andrea G. B. Tettamanzi, 2012 13

Parcours en largeur d'abord

L a r g e u r d

a b o r d : o r d r e d e v i s it e 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 1 0 , 1 1 , 1 2

(14)

Parcours en largeur d'abord

Liste ParcoursEnLargeur() F ← File()

F.enfiler(racine()) L ← Liste()

tant que non F.estVide()

x ← F.premier() ; F.défiler() L.ajouter(x)

pour chaque fils y de x F.enfiler(y)

renvoyer L

(15)

Andrea G. B. Tettamanzi, 2012 15

Parcours en largeur d'abord avec passes

Liste ParcoursEnLargeurAvecPasses() F1 ← File() ; F2 ← File()

F1.enfiler(racine()) L ← Liste()

répéter :

tant que non F1.estVide()

x ← F1.premier() ; F1.défiler() L.ajouter(x)

pour chaque fils y de x F2.enfiler(y)

échanger(F1, F2) # Fin d'une passe, début de la suivante tant que non F1.estVide()

renvoyer L

(16)

Andrea G. B. Tettamanzi, 2012 16

Parcours en largeur d'abord avec passes

L a r g e u r d

a b o r d a v e c p a s s e s O r d r e d e v i s it e : P a s s e 1 : 1 P a s s e 2 : 2 , 3 , 4 P a s s e 3 : 5 , 6 , 7 , 8 P a s s e 4 : 9 , 1 0 , 1 1 ,

(17)

Andrea G. B. Tettamanzi, 2012 17

Parcours en profondeur d'abord

• Défini de façon récursive

• visit(noeud x) previsit(x)

pour chaque fils y de x visit(y)

postvisit(x)

• Premier appel : visit(T.racine())

(18)

Parcours en profondeur d'abord

• Ordre préfixé ou postfixé dépend des fonctions previsit et postvisit

• Si previsit(x) : met x dans liste

– alors liste contient l’ordre préfixé

• Si c’est postvisit qui le fait

– alors liste contiendra l’ordre postfixé

(19)

Andrea G. B. Tettamanzi, 2012 19

Parcours en profondeur d'abord

O r d r e d e v i s it e p r é fi x é O n m a r q u e q u a n d o n a tt e i n t l e n o e u d 1 , 2 , 5 , 9 , 1 0 , 6 , 3 , 4 , 7 , 1 1 , 1 2 , 8

(20)

Andrea G. B. Tettamanzi, 2012 20

Parcours en profondeur d'abord

O r d r e d e v i s it e p o s tf i x é O n m a r q u e q u a n d o n q u it t e l e n o e u d 9 , 1 0 , 5 , 6 , 2 , 3 , 1 1 , 1 2 , 7 , 8 , 4

(21)

Andrea G. B. Tettamanzi, 2012 21

Parcours infixé

• Valable uniquement pour les arbre binaires (2 fils au plus)

• visit(sommet x) previsit(x)

si fils gauche y existe alors visit(y) invisit(x)

si fils droit y existe alors visit(y) postvisit(x)

• Premier appel : visit(T.racine())

• invisit(x) place x dans la liste

(22)

Andrea G. B. Tettamanzi, 2012 22

Parcours en profondeur d'abord

O r d r e d e v i s it e i n fi x é ( o n i g n o r e 3 ) O n m a r q u e e n t r e l e s d e u x fi l s 9 , 5 , 1 0 , 2 , 6 , 1 , 1 1 , 7 , 1 2 , 4

(23)

Andrea G. B. Tettamanzi, 2012 23

Profondeur d'abord itérative

• On peut éviter d'utiliser un algorithme récursif pour représenter un parcours en profondeur d’abord

• Il faut utiliser une pile

– Visiter un fils revient à empiler le père

– Et visiter le fils (qui va être empilé par ces fils et ainsi de suite) – Remonter (terminer l’appel récursif) revient à dépiler

– Quand il n’y a plus de fils, on reprend le sommet de la pile, on dépile et on passe au fils suivant

(24)

Arbre : réalisation

• Représentation des fils – Par une liste :

• Le parent possède un premier fils

• Chaque sommet possède un pointeur vers son frère suivant (liste chaînée des fils)

• Par un tableau si le nombre de fils est connu à l’avance (arbre k- aire)

• Dans le cas binaire, le parent possède le fils gauche et le fils droit

(25)

Andrea G. B. Tettamanzi, 2012 25

Arbre : réalisation

• Arbre binaire complet :

– on peut utiliser un tableau pour représenter tout l’arbre – voir exemple du tas

(26)

Arbre non binaire

• Tout arbre non binaire peut être représenté par un arbre binaire

(27)

Andrea G. B. Tettamanzi, 2012 27

Graphe orienté

• Un Graphe Orienté G=(X,U) est déterminé par la donnée : – d’un ensemble de sommets ou nœuds X

– d’un ensemble ordonné U de couples de sommets appelés arcs.

• Si u = (i, j) est un arc de G, alors – i est l’extrémité initiale de u

– j est l’extrémité terminale de u.

• Les arcs ont un sens (« orientés »).

– L’arc u = (i, j) va de i vers j.

• Ils peuvent être munis d’un coût, d’une capacité etc. (arcs étiquetés)

(28)

Graphe

(29)

Andrea G. B. Tettamanzi, 2012 29

Graphe non orienté

• Un Graphe Orienté G=(X,U) est déterminé par la donnée : – d’un ensemble de sommets ou nœuds X

– d’un ensemble de paires de sommets appelées « arêtes ».

• Les arêtes ne sont pas orientées

(30)

Graphe non orienté

(31)

Andrea G. B. Tettamanzi, 2012 31

Chemins et circuits

• Chemin de longueur q : séquence de q arcs {u1, u2, …, uq} telle que

– u1 = (i0, i1) – u2 = (i1, i2) – uq = (iq – 1, iq)

• Chemin : tous les arcs orientés dans le même sens

• Circuit : chemin dont les extrémités coïncident

(32)

Chaînes et cycles

• Chaîne de longueur q : séquence de q arêtes {u1, u2, …, uq} telle que

– u1 = (i0, i1) – u2 = (i1, i2) – uq = (iq – 1, iq)

• Cycle : chaîne dont les extrémités coïncident

(33)

Andrea G. B. Tettamanzi, 2012 33

Connexité

• Connexité : un graphe non orienté est connexe s’il existe une chaîne entre tout paire de sommets

(34)

Arbres comme graphes

• Un arbre est un graphe non orienté connexe et sans cycle

• Un graphe non orienté G ayant n sommets est un arbre si et seulement si il vérifie l’une des deux propriétés

– G est connexe et possède n – 1 arêtes – G n’a pas de cycle et a n – 1 arêtes

(35)

Andrea G. B. Tettamanzi, 2012 35

Merci de votre attention

Références

Documents relatifs

De plus, le nouveau graphe possède le même nombre de sommets, une arête et une face en moins.. Pour démontrer la formule d'Euler dans le cas général, on peut raisonner par

[r]

Activité d'approche n°3 : Dérivée de Sinus et Cosinus Dérivabilité de sinus et de cosinus. On travaille sur l'intervalle ]0

Solution. Soit A un groupe abélien fini. Le morphisme φ est donc injectif, c’est donc un isomorphisme puisque les deux groupes ont même cardinal... Soit A un groupe abélien

Dans cette exercice nous allons d´ efinir le faisceau structural sur l’espace projectif P 1 (le cas de l’espace projectif P n

Le nombre −7 est toujours négatif... Le dénominateur étant un carré, il

[r]

« Etant un ensemble ordonné on appelle préfermeture sur is toute application a de E dans E isotone et idempotente.. PREFERMETURE SUR UN ENSEMBLE ORDONNE