Arbre couvrant minimal par l algorithme de Kruskal

Documents pareils
Les arbres binaires de recherche

Projet d informatique M1BI : Compression et décompression de texte. 1 Généralités sur la compression/décompression de texte

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Les structures de données. Rajae El Ouazzani

M2-Images. Rendu Temps Réel - OpenGL 4 et compute shaders. J.C. Iehl. December 18, 2013

Resolution limit in community detection

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

1 Recherche en table par balayage

Bases de programmation. Cours 5. Structurer les données

Introduction à la Programmation Parallèle: MPI

Initiation à la programmation en Python

Algorithmique, Structures de données et langage C

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

Compression de Données - Algorithme de Huffman Document de Conception

Une nouvelle approche de détection de communautés dans les réseaux sociaux

Algorithmes de recherche

Jean-Philippe Préaux

Baccalauréat ES/L Amérique du Sud 21 novembre 2013

Quelques Algorithmes simples

Grandes lignes ASTRÉE. Logiciels critiques. Outils de certification classiques. Inspection manuelle. Definition. Test

I. Introduction aux fonctions : les fonctions standards

Conventions d écriture et outils de mise au point

Cours d Algorithmique et de Langage C v 3.0

MIS 102 Initiation à l Informatique

Programme Compte bancaire (code)

Introduction à la théorie des graphes. Solutions des exercices

Certificat Big Data - Master MAthématiques

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Cours de Programmation 2

Génération de code binaire pour application multimedia : une approche au vol

Cours de Master Recherche

Cours 7 : Utilisation de modules sous python

1 de 46. Algorithmique. Trouver et Trier. Florent Hivert. Mél : Florent.Hivert@lri.fr Page personnelle : hivert

L exclusion mutuelle distribuée

TP3 : Manipulation et implantation de systèmes de fichiers 1

Cahier des charges. driver WIFI pour chipset Ralink RT2571W. sur hardware ARM7

Cours d algorithmique pour la classe de 2nde

Jade. Projet Intelligence Artificielle «Devine à quoi je pense»

Atelier Transversal AT11. Activité «Fourmis» Pierre Chauvet.

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

ACTIVITÉ DE PROGRAMMATION

TP Bases de données réparties

Chap III : Les tableaux

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

Travaux Dirigés n 1 : chaînes de caractères

Brefs rappels sur la pile et le tas (Stack. / Heap) et les pointeurs

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

Algorithmique et structures de données I

Algorithmique et Programmation, IMA


Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs)

Programmation C. Apprendre à développer des programmes simples dans le langage C

Une bibliothèque de templates pour CUDA

La NP-complétude. Johanne Cohen. PRISM/CNRS, Versailles, France.

Eléments de Théorie des Graphes et Programmation Linéaire

Représentation d un entier en base b

Initiation à l algorithmique

Continuité et dérivabilité d une fonction

TPs Architecture des ordinateurs DUT Informatique - M4104c SUJETS. R. Raffin Aix-Marseille Université romain.raffin-at-univ-amu.fr

Baccalauréat ES Antilles Guyane 12 septembre 2014 Corrigé

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

Simulation d une économie monétaire (programmation impérative, sujet 3)

Cours d initiation à la programmation en C++ Johann Cuenin

Chp. 4. Minimisation d une fonction d une variable

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Complexité. Licence Informatique - Semestre 2 - Algorithmique et Programmation

Découverte de Python

Exclusion Mutuelle. Arnaud Labourel Courriel : arnaud.labourel@lif.univ-mrs.fr. Université de Provence. 9 février 2011

Baccalauréat ES Polynésie (spécialité) 10 septembre 2014 Corrigé

Poker. A rendre pour le 25 avril

1 Introduction C+ + Algorithm e. languag. Algorigramm. machine binaire. 1-1 Chaîne de développement. Séance n 4

PROJET ALGORITHMIQUE ET PROGRAMMATION II

Université du Québec à Chicoutimi. Département d informatique et de mathématique. Plan de cours. Titre : Élément de programmation.

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

physicien diplômé EPFZ originaire de France présentée acceptée sur proposition Thèse no. 7178

Exercices types Algorithmique et simulation numérique Oral Mathématiques et algorithmique Banque PT

L ANALYSE EN COMPOSANTES PRINCIPALES (A.C.P.) Pierre-Louis GONZALEZ

ALGORITHMIQUE II NOTION DE COMPLEXITE. SMI AlgoII

Rappels sur les suites - Algorithme

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

Chapitre 5 : Flot maximal dans un graphe

Algorithmes récursifs

Archivage Messagerie Evolution pour usage HTML en utilisant Hypermail

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

SUPPORT DE COURS. Dr. Omari Mohammed Maître de Conférences Classe A Université d Adrar Courriel : omarinmt@gmail.com

Université de Strasbourg UFR de Mathématique et d'informatique. L2 Informatique Semestres S3 et S4. Structures de Données et Algorithmes 1 et 2

DNS ( DOMAIN NAME SYSTEM)

SAS de base : gestion des données et procédures élémentaires

Problèmes liés à la concurrence

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

Projet de programmation (IK3) : TP n 1 Correction

Algorithmique I. Algorithmique I p.1/??

IFT3030 Base de données. Chapitre 2 Architecture d une base de données

LES OUTILS D ALIMENTATION DU REFERENTIEL DE DB-MAIN

Systèmes parallèles et distribués

Introduction au langage C

Probabilités. Rappel : trois exemples. Exemple 2 : On dispose d un dé truqué. On sait que : p(1) = p(2) =1/6 ; p(3) = 1/3 p(4) = p(5) =1/12

ARBRES BINAIRES DE RECHERCHE

introduction Chapitre 5 Récursivité Exemples mathématiques Fonction factorielle ø est un arbre (vide) Images récursives

Transcription:

Algorithmique et Programmation Arbre couvrant minimal par l algorithme de Kruskal 2009-2010 : Semestre 1

Plan de la présentation 1 Principe de l algorithme Algorithme de Kruskal Ensembles représentatifs Complexité 2 Listes d arêtes et graphes Forêts union-find 3 Correction Complexité 4

Algorithme de Kruskal Il permet de déterminer l arbre couvrant de poids minimal dans un graphe pondéré positivement. Kruskal (G) g G on définit un ensemble représentatif E i (g) = g. Pour chaque arête (u, v) de G considérée par poids croissant : Si E i (u) E i (v), on les fusionne et on garde (u,v). L ensemble des arêtes gardées forme un arbre couvrant.

Ensembles représentatifs La complexité dépend des ensembles représentatifs. Il faut : Trouver facilement l ensemble auquel appartient g. Unir aisément deux ensembles. Solution : une structure de type Union-Find Utiliser une foret d arbres disjoints relativement plats.

Ensembles représentatifs La complexité dépend des ensembles représentatifs. Il faut : Trouver facilement l ensemble auquel appartient g. Unir aisément deux ensembles. Solution : une structure de type Union-Find Utiliser une foret d arbres disjoints relativement plats.

Nous avons deux propriétés à maintenir : Tout noeud est proche de la racine qui repère l arbre. Compression de chemin Chaque fois que l on repère dans quel arbre est un élément g, on attache g directement à la racine. Une union d arbre se fait rapidement en augmentant au minimum la profondeur. Union par rang On déclare la racine de l arbre le moins haut comme fille de la racine de l autre arbre.

Nous avons deux propriétés à maintenir : Tout noeud est proche de la racine qui repère l arbre. Compression de chemin Chaque fois que l on repère dans quel arbre est un élément g, on attache g directement à la racine. Une union d arbre se fait rapidement en augmentant au minimum la profondeur. Union par rang On déclare la racine de l arbre le moins haut comme fille de la racine de l autre arbre.

Nous avons deux propriétés à maintenir : Tout noeud est proche de la racine qui repère l arbre. Compression de chemin Chaque fois que l on repère dans quel arbre est un élément g, on attache g directement à la racine. Une union d arbre se fait rapidement en augmentant au minimum la profondeur. Union par rang On déclare la racine de l arbre le moins haut comme fille de la racine de l autre arbre.

Nous avons deux propriétés à maintenir : Tout noeud est proche de la racine qui repère l arbre. Compression de chemin Chaque fois que l on repère dans quel arbre est un élément g, on attache g directement à la racine. Une union d arbre se fait rapidement en augmentant au minimum la profondeur. Union par rang On déclare la racine de l arbre le moins haut comme fille de la racine de l autre arbre.

Nous avons deux propriétés à maintenir : Tout noeud est proche de la racine qui repère l arbre. Compression de chemin Chaque fois que l on repère dans quel arbre est un élément g, on attache g directement à la racine. Une union d arbre se fait rapidement en augmentant au minimum la profondeur. Union par rang On déclare la racine de l arbre le moins haut comme fille de la racine de l autre arbre.

Complexité La complexité totale est largement dominée par a log(a). Tri des arêtes Graphe par liste d adjacence Tri fusion : - Découpage en a cases (fusion des doublons). - fusion des listes triées : log(2) récursions 2 aretes. Algorithme Kruskal - Initialisation linéaire en n - Dans le pire des cas, une boucle sur les a aretes : Au plus n fusions, et a recherches quasi-instantanées (*) (*) La complexité exacte est de O(n + 2a (1 + log 2+2d (n)))

Complexité La complexité totale est largement dominée par a log(a). Tri des arêtes Graphe par liste d adjacence Tri fusion : - Découpage en a cases (fusion des doublons). - fusion des listes triées : log(2) récursions 2 aretes. Algorithme Kruskal - Initialisation linéaire en n - Dans le pire des cas, une boucle sur les a aretes : Au plus n fusions, et a recherches quasi-instantanées (*) (*) La complexité exacte est de O(n + 2a (1 + log 2+2d (n)))

Complexité La complexité totale est largement dominée par a log(a). Tri des arêtes Graphe par liste d adjacence Tri fusion : - Découpage en a cases (fusion des doublons). - fusion des listes triées : log(2) récursions 2 aretes. Algorithme Kruskal - Initialisation linéaire en n - Dans le pire des cas, une boucle sur les a aretes : Au plus n fusions, et a recherches quasi-instantanées (*) (*) La complexité exacte est de O(n + 2a (1 + log 2+2d (n)))

Liste et arêtes Voir list.h et list.c. Structure d arête typedef struct edge { int weight ; int dest ; // attributs réels de l arête int origin ; // générée par le programme struct edge *next ; // structure de liste chainée } edge ; Une liste est un pointeur edge, un graphe est un tableau de listes.

Tri fusion list* copy (list graph[], int n, int a) ; Retourne un tableau de taille a dont chaque case contient une liste formée d une seule arête (orientée arbitrairement). Puis en divisant a par deux a chaque itération, list fusion (list l1, list l2) ; Retourne une liste qui est le résultat de la fusion des listes triées l1 et l2, formée en comparant leurs têtes.

Tri fusion list* copy (list graph[], int n, int a) ; Retourne un tableau de taille a dont chaque case contient une liste formée d une seule arête (orientée arbitrairement). Puis en divisant a par deux a chaque itération, list fusion (list l1, list l2) ; Retourne une liste qui est le résultat de la fusion des listes triées l1 et l2, formée en comparant leurs têtes.

Graphes Voir graph.h et graph.c. list *random graph (int n, int a, int maxweight) ; - Tire au hasard a fois deux entiers distincts inférieurs à n (extrémités de l arête) et un poids inférieur à maxweight. - Tableau done[n][n] pour éviter les doublons. - Structure union-find pour garantir la connexité. list list graph (list graph[],int n,int a) ; void set origin (list l, int i) ; Remplit le champ origin des edges. list sort graph (list igraph[],int n, int a) ; Applique le tri fusion.

Graphes Voir graph.h et graph.c. list *random graph (int n, int a, int maxweight) ; - Tire au hasard a fois deux entiers distincts inférieurs à n (extrémités de l arête) et un poids inférieur à maxweight. - Tableau done[n][n] pour éviter les doublons. - Structure union-find pour garantir la connexité. list list graph (list graph[],int n,int a) ; void set origin (list l, int i) ; Remplit le champ origin des edges. list sort graph (list igraph[],int n, int a) ; Applique le tri fusion.

Forêts de type union-find Voir forest.h et forest.c. Structure de forêt typedef struct node { struct node *parent ; int rank ; // Profondeur int label ; // Etiquette numérique pour l affichage // relation fils-ainé/frère droit générée par et pour l affichage struct node *brother ; struct node *son ; } edge ;

list kruskal(list *graph, int n,int a) ; Retourne la liste des arêtes formant un arbre couvrant. node* table (int n) ; Génère un tableau de pointeurs vers n nodes et alloue la mémoire nécessaire. node* find (node* n) ; Retourne un pointeur vers la racine de l arbre contenant n et en fait son parent immédiat. void merge (node* a, node* b) ; Fusionne les arbres contenant a et b selon le procédé d union par rang.

list kruskal(list *graph, int n,int a) ; Retourne la liste des arêtes formant un arbre couvrant. node* table (int n) ; Génère un tableau de pointeurs vers n nodes et alloue la mémoire nécessaire. node* find (node* n) ; Retourne un pointeur vers la racine de l arbre contenant n et en fait son parent immédiat. void merge (node* a, node* b) ; Fusionne les arbres contenant a et b selon le procédé d union par rang.

list kruskal(list *graph, int n,int a) ; Retourne la liste des arêtes formant un arbre couvrant. node* table (int n) ; Génère un tableau de pointeurs vers n nodes et alloue la mémoire nécessaire. node* find (node* n) ; Retourne un pointeur vers la racine de l arbre contenant n et en fait son parent immédiat. void merge (node* a, node* b) ; Fusionne les arbres contenant a et b selon le procédé d union par rang.

list kruskal(list *graph, int n,int a) ; Retourne la liste des arêtes formant un arbre couvrant. node* table (int n) ; Génère un tableau de pointeurs vers n nodes et alloue la mémoire nécessaire. node* find (node* n) ; Retourne un pointeur vers la racine de l arbre contenant n et en fait son parent immédiat. void merge (node* a, node* b) ; Fusionne les arbres contenant a et b selon le procédé d union par rang.

Affichage void print list (list l) ; Sortie de la forme : [> adresse]origin dest(weight)[> next] void print graph (list graph[],int n) ; Suite de print list séparés. void print forest(node *table, int n) ; Parcours en profondeur par la relation fils ainé / frère droit. Flag -verbose active les commentaires détaillés du déroulement du programme.

Affichage void print list (list l) ; Sortie de la forme : [> adresse]origin dest(weight)[> next] void print graph (list graph[],int n) ; Suite de print list séparés. void print forest(node *table, int n) ; Parcours en profondeur par la relation fils ainé / frère droit. Flag -verbose active les commentaires détaillés du déroulement du programme.

Utilisation Compilation Compilation assistée par Code Blocks ou makefile. Exécution bin/debug/kruskal [-flags]? n a maxweight

Correction de l algorithme

Complexité réelle Flag -time. Fonction rdtsc(). n a a log(a) Génération Tri Kruskal Total 100 150 325 36k 22k 28k 86k Variations de n 500 1500 4750 5M 4M 0.2M 9M 750 1500 4750 11M 7M 0.3M 18M 1000 1500 4750 18M 12M 0.3M 30M Variations de a 1000 1500 4750 17M 12M 0.3M 29M 1000 3000 10k 23M 17M 0.5M 40.5M 1000 6000 23k 27M 18M 0.7M 46M

Voyageur de commerce Principe de l heuristique Parcourir l arbre couvrant minimal. Nouvelle génération Les sommets sont des points dans un plan, les poids sont leurs distances euclidiennes. Exécution : On travaille dans le quart superieur droit du plan, maxweight (float) maximum des coordonnées. Parcours en profondeur de l arbre couvrant - Numérotation des noeuds dans done[n]. - Départ d un retour en arrière dans far, négatif sinon.

Voyageur de commerce Principe de l heuristique Parcourir l arbre couvrant minimal. Nouvelle génération Les sommets sont des points dans un plan, les poids sont leurs distances euclidiennes. Exécution : On travaille dans le quart superieur droit du plan, maxweight (float) maximum des coordonnées. Parcours en profondeur de l arbre couvrant - Numérotation des noeuds dans done[n]. - Départ d un retour en arrière dans far, négatif sinon.

Voyageur de commerce Principe de l heuristique Parcourir l arbre couvrant minimal. Nouvelle génération Les sommets sont des points dans un plan, les poids sont leurs distances euclidiennes. Exécution : On travaille dans le quart superieur droit du plan, maxweight (float) maximum des coordonnées. Parcours en profondeur de l arbre couvrant - Numérotation des noeuds dans done[n]. - Départ d un retour en arrière dans far, négatif sinon.

Poids total : 254.337