Cours 7. Files d attente Piles Graphes non orientés. Jean-Jacques.Levy@inria.fr http://jeanjacqueslevy.net



Documents pareils
Programme Compte bancaire (code)

Corrigé des exercices sur les références

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Génie Logiciel avec Ada. 4 février 2013

Programmer en JAVA. par Tama

Projet de programmation (IK3) : TP n 1 Correction

Un ordonnanceur stupide

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Programmation Réseau. Sécurité Java. UFR Informatique jeudi 4 avril 13

Programmation Par Objets

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

Remote Method Invocation Les classes implémentant Serializable

Programmation avec des objets : Cours 7. Menu du jour

Cahier des Charges du Projet Domotique. Choquet Mathieu Masson Jérôme Groupe 6. Domotique. p.1

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Package Java.util Classe générique

Java Licence Professionnelle CISII,

Page 1 sur 5 TP3. Thèmes du TP : l la classe Object. l Vector<T> l tutorial Interfaces. l Stack<T>

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Pour plus de détails concernant le protocole TCP conférez vous à la présentation des protocoles Internet enseignée pendant.

ACTIVITÉ DE PROGRAMMATION

Calcul Parallèle. Cours 5 - JAVA RMI

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Auto-évaluation Programmation en Java

Chapitre 10. Les interfaces Comparable et Comparator 1

Dis papa, c est quoi un bus logiciel réparti?

Les structures de données. Rajae El Ouazzani

Programmation client-serveur sockets - RPC

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

Déroulement. Evaluation. Préambule. Définition. Définition. Algorithmes et structures de données 28/09/2009

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

Développement Logiciel

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Java RMI. Arnaud Labourel Courriel: Université de Provence. 8 mars 2011

TD3: tableaux avancées, première classe et chaînes

Serveur d'archivage 2007 Installation et utilisation de la BD exist

Plan du cours. Historique du langage Nouveautés de Java 7

Université Kasdi Merbeh Ouargla FSSI/ Département des maths et de l informatique Corrigé type TD N 8 de ASD2 (Les Graphes)

Langage à objets : JAVA (1)

Programmation Objet Java Correction

Introduction au langage Java

as Architecture des Systèmes d Information

Programmation Internet en Java

La persistance des données dans les applications : DAO, JPA, Hibernate... COMPIL 2010 francois.jannin@inp-toulouse.fr 1

Premiers Pas en Programmation Objet : les Classes et les Objets

Les arbres binaires de recherche

INF 321 : mémento de la syntaxe de Java

Programmation par les Objets en Java

Java 1.5 : principales nouveautés

Structure fonctionnelle d un SGBD

Utilisation d objets : String et ArrayList

Resolution limit in community detection

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

MapReduce et Hadoop. Alexandre Denis Inria Bordeaux Sud-Ouest France ENSEIRB PG306

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

Algorithmique I. Algorithmique I p.1/??

Tp 1 correction. Structures de données (IF2)

Communication inter-processus (IPC) : tubes & sockets. exemples en C et en Java. F. Butelle

Programmation Réseau SSH et TLS (aka SSL)

LOG4430 : Architecture logicielle et conception avancée

Remote Method Invocation (RMI)

Structures dynamiques Listes chaînées

Arbres binaires de recherche

Solutions du chapitre 4

Exercices INF5171 : série #3 (Automne 2012)

Flux de données Lecture/Ecriture Fichiers

Synchro et Threads Java TM

TD 1 - Structures de Traits et Unification

Remote Method Invocation en Java (RMI)

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Certificat Big Data - Master MAthématiques

Introduction : les processus. Introduction : les threads. Plan

Intergiciels pour la répartition CORBA : Common Object Request Broker. Patrice Torguet torguet@irit.fr Université Paul Sabatier

Map-Reduce : un cadre de programmation parallèlle pour l analyse de grandes données. Stéphane Genaud ENSIIE

Architecture des ordinateurs

ALGORITHMIQUE ET PROGRAMMATION ORIENTEE OBJET

PROGRAMMATION PAR OBJETS

STS SE. FreeRTOS. Programmation réseau WIFI. Programmation réseau. Socket Tcp. FlyPort smart Wi-Fi module

#include <stdio.h> #include <stdlib.h> struct cell { int clef; struct cell *suiv; };

Algorithmique, Structures de données et langage C

Programmation Orientée Objet Java

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

API04 Contribution. Apache Hadoop: Présentation et application dans le domaine des Data Warehouses. Introduction. Architecture

Introduction à la Programmation Parallèle: MPI

Programmation en Java IUT GEII (MC-II1) 1

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Derrière toi Une machine virtuelle!

Développement mobile MIDP 2.0 Mobile 3D Graphics API (M3G) JSR 184. Frédéric BERTIN

Corrigés des premiers exercices sur les classes

RMI. Remote Method Invocation: permet d'invoquer des méthodes d'objets distants.

Java DataBaseConnectivity

Architecture Orientée Service, JSON et API REST

INITIATION AU LANGAGE JAVA

IRL : Simulation distribuée pour les systèmes embarqués

TP, première séquence d exercices.

Transcription:

Cours 7 Files d attente Piles Graphes non orientés Jean-Jacques.Levy@inria.fr http://jeanjacqueslevy.net tel: 01 39 63 56 89 secrétariat de l enseignement: Catherine Bensoussan cb@lix.polytechnique.fr Aile 00, LIX tel: 01 69 33 34 67 http://www.enseignement.polytechnique.fr/informatique/ 1

Plan 1. Files d attente 2. Piles 3. Graphes 4. Représentation des graphes 5. Parcours en profondeur d abord 6. Parcours en largeur d abord 7. Arbres de recouvrement 8. Connexité et sortie de labyrinthe 9. Biconnexité. 2

Files d attente représentée par un tampon circulaire Premier arrivé, premier servi (First In, First Out). Structure de données très fréquente dans les programmes: par exemple dans les OS, le hardware, le temps-réel, etc. Une première méthode compacte consiste à gérer un tampon circulaire. class FIFO { int boolean int[] debut, fin; pleine, vide; contenu; FIFO (int n) { debut = 0; fin = 0; pleine = false; vide = true; contenu = new int[n]; 3

File d attente représentée par un tampon circulaire static void ajouter (int x, FIFO f) { if (f.pleine) throw new Error ("File Pleine."); f.contenu[f.fin] = x; f.fin = (f.fin + 1) % f.contenu.length; f.vide = false; f.pleine = f.fin == f.debut; static int supprimer (FIFO f) { if (f.vide) throw new Error ("File Vide."); int res = f.contenu[f.debut]; f.debut = (f.debut + 1) % f.contenu.length; f.vide = f.fin == f.debut; f.pleine = false; return res; Belle symétrie de ces procédures. Complexité en O(1). 4

File d attente représentée par une liste class FIFO { Liste debut, fin; FIFO () { debut = null; fin = null; static void ajouter (int x, FIFO f) { if (f.fin == null) f.debut = f.fin = new Liste (x); else { f.fin.suivant = new Liste (x); f.fin = f.fin.suivant; static int supprimer (FIFO f) { if (f.debut == null) throw new Error ("File Vide."); else { int res = f.debut.val; if (f.debut == f.fin) f.debut = f.fin = null; else f.debut = f.debut.suivant; return res; 5

Pile représentée par un tableau Une pile correspond à la stratégie LIFO (Last In, First Out). On peut la représenter par un tableau ou une liste. class Pile { int hauteur ; int contenu[]; Pile (int n) {hauteur = 0; contenu = new int[n]; static void empiler (int x, Pile p) { ++p.hauteur; if (p.hauteur >= p.contenu.length) throw new Error ("Pile pleine."); p.contenu[p.hauteur - 1] = x; static int depiler (Pile p) { if (p.hauteur <= 0) throw new Error ("Pile vide."); return p.contenu [--p.hauteur]; 6

Pile représentée par une liste class Pile { Liste sommet; Pile () { sommet = null; static void empiler (int x, Pile p) { p.sommet = new Liste (x, p.sommet); static int depiler (Pile p) { if (p.sommet == null) throw new Error ("Pile vide."); int res = p.sommet.val; p.sommet = p.sommet.suivant; return res; Récursif = Itératif + Pile (Randell et Russel, 1960 compilateur). Idem pour l évaluation des expressions arithmétiques avec une pile, par un parcours suffixe de l ASA, et en empilant les valeurs et opérateurs rencontrés et en faisant des opérations entre le sommet et le sous-sommet de la pile. 7

Graphe Un graphe G = (V, E) a un ensemble de sommets V et d arcs E V V. Un arc v = (n 1, n 2 ) a pour origine org(v) = n 1 et pour extrémité ext(v) = n 2. Exemples: les rues de Paris, le plan du métro. G = (N, V ) est un graphe non orienté ssi (n 1, n 2 ) V implique (n 2, n 1 ) V. Par exemple, les couloirs de l X. Un chemin est une suite d arcs v 1, v 2,... v n, telle que org(v i+1 ) = ext(v i ) pour 1 i < n, où n 0. Un circuit (ou cycle) est un chemin où ext(v n ) = org(v 1 ). Les dag (directed acyclic graphs) sont des graphes orientés sans cycles. Exemple: le graphe des dépendances inter modules pour la création d un projet informatique. (Makefile) Un arbre est un dag. Une forêt (ensemble d arbres disjoints) est un dag. 8

Exemple de graphe 000 100 001 010 101 110 011 111 Graphe de de Bruijn 9

Exemple de graphe 2 4 8 6 10 12 9 5 7 Graphe des diviseurs 3 11 10

Représentations d un graphe En gros, deux méthodes: Matrice de connexion M, où m i,j = 1 ssi (n i, n j ) est un arc du graphe. Matrice symétrique pour un graphe non orienté. class Graphe { boolean[][] = m; Graphe (int n) { m = new int[n][n]; for (int i = 0; i <= n; ++i) for (int j = 0; j <= n; ++j) m[i][j] = false; static void ajouterarc (Graphe g, int x, int y) { g.m[i][j] = true; Tableau de listes de successeurs: class Graphe { Liste[] succ; Graphe (int n) { succ = new Liste[n]; static void ajouterarc (Graphe g, int x, int y) { g.succ[x] = new Liste (y, g.succ[x]); 11

Entrée du graphe public static void main (String[] args) { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); try { String s = in.readline(); int n = Integer.parseInt(s); Graphe g = new Graphe (n); while ((s = in.readline())!= null) { StringTokenizer st = new StringTokenizer(s); int x = Integer.parseInt(st.nextToken()); int y = Integer.parseInt(st.nextToken()); if (0 <= x && x < n && 0 <= y && y < n) { ajouterarc(g, x, y); ajouterarc(g, y, x); trouverarticulations (g); imprimerarticulations (g); catch (IOException e) { System.err.println(e); 12

Parcours en profondeur d abord, Depth-First Search 0 2 1 6 5 7 4 8 6 10 2 4 12 9 5 8 9 7 3 3 10 11 13

Parcours en profondeur d abord, Depth-First Search Tarjan (1972) a démontré l utilité de cette méthode. static int id; static int[] num; static void visit (Graphe g) { id = -1; num = new int[g.succ.length]; for (int x = 0; x < g.succ.length; ++x) num[x] = -1; for (int x = 0; x < g.succ.length; ++x) if (num[x] == -1) dfs(g, x); static void dfs (Graphe g, int x) { num[x] = ++id; for (int ls = g.succ[x]; ls!= null; ls = ls.suivant) { int y = ls.val; if (num[y] == -1) dfs(g, y); Son temps est en O(V + E). Aussi appelé arborescences de Trémaux dans le polycopié. 14

Arbres de recouvrement L arbre des appels récursifs à dfs est un arbre de recouvrement (spanning tree). Les arcs d un arc sont de 4 sortes: d un noeud de l arbre à un de ses fils dans l arbre d un noeud de l arbre à un de ses ancètres dans l arbre d un noeud de l arbre à un de ses descendants non direct dans l arbre d un noeud à un de ses cousins dans l arbre [Dans dfs d un graphe non orienté, il n y a que les arcs du type 1-2.] 15

Arbre de recouvrement spanning tree 0 2 1 6 5 7 4 8 6 10 2 4 12 9 5 8 9 7 3 3 10 11 16

Parcours en largeur d abord 0 2 1 2 3 4 4 8 6 10 5 8 12 9 5 6 9 7 7 3 10 11 17

Parcours en largeur d abord, Breadth-First Search static void bfs (Graphe g, FIFO f) { while (!f.vide() ) { int x = FIFO.supprimer (f); num[x] = ++id; for (int ls = g.succ[x]; ls!= null; ls = ls.suivant) { int y = ls.val; if (num[y] == -1) { FIFO.ajouter(y, f); num[y] = -2; static void visit (Graphe g) { id = -1; FIFO f = new FIFO (g.succ.length); for (int x = 0; x < g.succ.length; ++x) num[x] = -1; for (int x = 0; x < g.succ.length; ++x) if (num[x] == -1) { FIFO.ajouter(x, f); num[x] = -2; bfs (g, f); Itératif et plus compliqué que le parcours en profondeur d abord. 18

Quelques problèmes classiques Sortie de labyrinthe (dans un graphe non-orienté) Test de non-cyclicité dans un graphe orienté Tri topologique dans un graphe orienté (Makefiles) Planarité (Tarjan) Connexité dans un graphe non orienté Plus court chemin Coloriage de graphe Optimisation de flot 19

Sortie de labyrinthe On cherche un chemin de d à s. static Liste chemin (Graphe g, int d, int s) { num[d] = ++id; if (d == s) return new Liste (d, null); for (Liste ls = g.succ[d]; ls!= null; ls = ls.suivant) { int x = ls.val; if (num[x] == -1) { Liste r = chemin (g, x, s); if (r!= null) return new Liste (d, r); return null; Exercice 1 Calculer le chemin le plus court vers la sortie. Exercice 2 Imprimer tous les chemins vers la sortie. 20

Bi-connectivité Dans un graphe non orienté, existe-t-il 2 chemins différents entre toute paire de noeuds? Un point d articulation est un point qui sépare le graphe en parties non connexes si on l enlève. Un graphe sans point d articulation est un graphe bi-connexe. Exemples: les rues de Paris, la distribution d électricité, la topologie d un réseau informatique, etc 21

Bi-connectivité Un point d attache de x est le plus petit y tel qu un chemin relie x à y contenant au plus un seul arc de retour z z (tel que z > z ) La fonction suivante (en dfs) calcule les points d articulation. static int attache (Graphe g, int k) { num[k] = ++id; int min = id; for (Liste ls = g.succ[k]; ls!= null; ls = ls.suivant) { int x = ls.val; if (num[x] == -1) { int m = attache (g, x); if (m < min) min = m; if (m >= num[k]) articulation[k] = true; else if (num[x] < min) min = num[x]; return min; 22

Bi-connectivité bis Mais correction pour un noeud racine d un arbre de recouvrement n est articulation que s il a au moins deux successeurs. static int id; static int[] num; static boolean[] articulation; static void trouverarticulations (Graphe g) { int n = g.succ.length; id = -1; num = new int[n]; articulation = new boolean[n]; int r; for (int x = 0; x < n; ++x) { num[x] = -1; articulation[x] = false; for (int x = 0; x < n; ++x) if (num[x] == -1) { r = attache(g, x); if (articulation[x] && g.succ[x].suivant == null) articulation[x] = false; 23

En TD problèmes Recherche de la plus courte sortie dans un labyrinthe Recherche de la plus longue sortie dans un labyrinthe Recherche de toutes les sorties dans un labyrinthe Enumérer tous les arbres de recouvrement Enumérer tous les chemins (élémentaires) issus du noeud. (Chemin élémentaire ne passe pas deux fois par un même noeud). 24