IFT2015 Miklós Csűrös 10 novembre Arbres. 8.1 Structures arborescentes

Documents pareils
Les structures de données. Rajae El Ouazzani

Les arbres binaires de recherche

ARBRES BINAIRES DE RECHERCHE

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

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Algorithmique et Programmation, IMA

Algorithmique, Structures de données et langage C


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

INF601 : Algorithme et Structure de données

Cours 1 : Introduction Ordinateurs - Langages de haut niveau - Application

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

Cours 1 : La compilation

Chap 4: Analyse syntaxique. Prof. M.D. RAHMANI Compilation SMI- S5 2013/14 1

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

Arbres binaires de recherche

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Introduction à MATLAB R

Cours d algorithmique pour la classe de 2nde

Sub CalculAnnuite() Const TITRE As String = "Calcul d'annuité de remboursement d'un emprunt"

Module BDWEB. Maîtrise d informatique Cours 9 - Xquery. Anne Doucet. anne.doucet@lip6.fr

Analyse de sécurité de logiciels système par typage statique

Organigramme / Algorigramme Dossier élève 1 SI

STAGE IREM 0- Premiers pas en Python

LES OUTILS D ALIMENTATION DU REFERENTIEL DE DB-MAIN

Quelques Algorithmes simples

Chapitre 7. Récurrences

Algorithmique I. Algorithmique I p.1/??

Conception de circuits numériques et architecture des ordinateurs

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

1 Définition et Appel d une fonction. V. Phan Luong. Cours 4 : Fonctions

Licence Sciences et Technologies Examen janvier 2010

LES TYPES DE DONNÉES DU LANGAGE PASCAL

Architecture des Systèmes d Information Architecture des Systèmes d Information

Java Licence Professionnelle CISII,

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)

Chp. 4. Minimisation d une fonction d une variable

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

Fondements de l informatique Logique, modèles, et calculs

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Programmation C++ (débutant)/instructions for, while et do...while

L exclusion mutuelle distribuée

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

Notions fondamentales du langage C# Version 1.0

Programmer en JAVA. par Tama

Découverte de Python

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

Cours Informatique Master STEP

Expression des contraintes. OCL : Object C o n t r a i n t L a n g u a g e

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Chapitre VI- La validation de la composition.

Cours 1 : Qu est-ce que la programmation?

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Initiation à l algorithmique

Claude Delannoy. 3 e édition C++

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

Création et Gestion des tables

Examen Médian - 1 heure 30

Anne Tasso. Java. Le livre de. premier langage. 10 e édition. Avec 109 exercices corrigés. Groupe Eyrolles, , ISBN :

Architecture des ordinateurs TD1 - Portes logiques et premiers circuits

Introduction à la Programmation Parallèle: MPI

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

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

Définitions. Numéro à préciser. (Durée : )

Continuité et dérivabilité d une fonction

Corrigé des TD 1 à 5

as Architecture des Systèmes d Information

La mémoire. Un ordinateur. L'octet. Le bit

Calculabilité Cours 3 : Problèmes non-calculables.

CAC: Un algorithme d arc-consistance. configurable, générique et adaptatif.

Raisonnement probabiliste

Souad EL Bernoussi. Groupe d Analyse Numérique et Optimisation Rabat http ://

Représentation des Nombres

Rappels d architecture

SUPPORT DE COURS. Langage C

Cours d Algorithmique et de Langage C v 3.0

UML (Paquetage) Unified Modeling Language

Resolution limit in community detection

Conventions d écriture et outils de mise au point

INF 321 : mémento de la syntaxe de Java

Initiation à la Programmation en Logique avec SISCtus Prolog

Résolution de systèmes linéaires par des méthodes directes

Langage C. Patrick Corde. 22 juin Patrick Corde ( Patrick.Corde@idris.fr ) Langage C 22 juin / 289

Programmation linéaire

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

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

Manuel d utilisation 26 juin Tâche à effectuer : écrire un algorithme 2

Ingénierie Dirigée par les Modèles. Editeurs de modèles. (Eclipse Modeling Tools) Jean-Philippe Babau

Comparaison de fonctions Développements limités. Chapitre 10

Plan. Exemple: Application bancaire. Introduction. OCL Object Constraint Language Le langage de contraintes d'uml

Évaluation et implémentation des langages

Enseignement secondaire technique

Utilisation d objets : String et ArrayList

L informatique en BCPST

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

Langage propre à Oracle basé sur ADA. Offre une extension procédurale à SQL

Le langage C. Introduction, guide de reference

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

Architecture des ordinateurs

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

Transcription:

IFT2015 Miklós Csűrös 10 novembre 2016 8 Arbres 8.1 Structures arborescentes Un arbre est une structure récursive d importance fondamentale dans beaucoup de domaines d informatique : les structures arborescentes s adaptent à l abstraction de nombreux problèmes réels sur hiérarchies et réseaux ; les meilleures structures de données sont souvent les réalisations concrètes d arbres ; on utilise des arbres pour décrire les propriétés des algorithmes récursifs dans l analyse théorique ; on compile le code source à l aide des arbres de syntaxe ;... Dans ce cours, on considère les arbres enracinés (ou l ordre des enfants n est pas important) et les arbres ordonnés (comme l arbre binaire, ou les enfants sont ordonnés dans une liste). On identifie un arbre par sa racine. Définition 8.1. Un arbre enraciné T ou arboresence est une structure définie sur un ensemble de nœuds qui 1. est un nœud externe, ou 2. est composé d un nœud interne appellé la racine r, et un ensemble d arbres enracinés (les enfants) w parent racine enfant sous-arbre de racine w Définition 8.2. Un arbre ordonné T est une structure définie sur un ensemble de nœuds qui 1. est un nœud externe, ou 2. est composé d un nœud interne appellé la racine r, et les arbres T 0, T 1, T 2,..., T d 1. La racine de T i est apellé l enfant de r étiqueté par i ou le i-ème enfant de r. Le degré (ou arité) d un nœud est le nombre de ses enfants : les nœuds externes sont de degré 0. Le degré de l arbre est le degré maximal de ses nœuds. Un arbre k-aire est un arbre ordonné où chaque nœud interne possède exactement k enfants. Un arbre binaire est un arbre ordonné où chaque nœud interne possède exactement 2 enfants : les sous-arbres gauche et droit. 8.1

8.2 Représentation d un arbre class TreeNode // noeud interne dans arbre binaire TreeNode parent; // null pour la racine TreeNode left; // enfant gauche, null=enfant externe TreeNode droit; // enfant droit, null=enfant externe //... d autre information } class MultiNode // noeud interne dans arbre ordonné TreeNode parent; // null pour la racine TreeNode[] children; // enfants; children.length=arité //... d autre info } Arbre = ensemble d objets représentant de nœuds + relations parent-enfant. En général, on veut retrouver facilement le parent et les enfants de n importe quel nœud. Souvent, les nœuds externes ne portent pas de données, et on les représente simplement par des liens null. Si l arbre est d arité k, on peut les stocker dans un tableau de taille k. A B C D E F G H I J K L M N fils gauche frère droit Si l arité de l arbre n est pas connu en avance (ou la plupart des nœuds ont très peu d enfants), on peut utiliser une liste pour stocker les enfants : c est la représentation premier fils, prochain frère (first-child, next-sibling). (Le premier fils est la tête de la liste des enfants, et le prochain frère est le pointeur au prochain nœud sur la liste des enfants.) Ici, il fait stocker les nœuds externes explicitement. Théorème 8.1. Il existe une correspondance 1-à-1 entre les arbres binaires à n nœuds internes et les arbres ordonnés à n nœuds (internes et externes). Démonstration. On peut intérprêter «premier fils» comme «enfant gauche», et «prochain frère» comme «enfant droit» pour obtenir un arbre binaire unique qui correspond à un arbre ordonné arbitraire, et vice versa. 8.3 Propriétés niveau 0 niveau 1 niveau 2 niveau 3 niveau 4 hauteur=3 hauteur=4 Niveau (level/depth) d un nœud u : longueur du chemin qui mène à u à partir de la racine Hauteur (height) d un nœud u : longueur maximale d un chemin de u jusqu à un nœud externe dans le sous-arbre de u Hauteur de l arbre : hauteur de la racine (= niveau maximal de nœuds) Longueur du chemin (interne/externe) (internal/external path length) somme des niveaux de tous les nœuds (internes/externes) 8.2

0 si x est externe ; hauteur[x] = 1 + max y x.children hauteur[y] 0 si x est la racine (x.parent = null) ; niveau[x] = 1 + niveau[x.parent] sinon niveau 2 niveau 3 niveau 1 niveau 0 Un arbre binaire complet de hauteur h : il y a 2 i nœuds à chaque niveau i = 0,..., h 1. On «remplit» les niveaux de gauche à droit. Théorème 8.2. Un arbre binaire à n nœuds externes contient (n 1) nœuds internes. Théorème 8.3. La hauteur h d un arbre binaire à n nœuds internes est bornée par lg(n + 1) h n. Démonstration. Un arbre de hauteur h = 0 ne contient qu un seul nœud externe (n = 0), et les bornes sont correctes. Pour h > 0, on définit n k comme le nombre de nœuds internes au niveau k = 0, 1, 2,..., h 1 (il n y a pas de nœud interne au niveau h). On a n = h 1 k=0 n k. Comme n k 1 pour tout k = 0,..., h 1, on a que n h 1 k=0 1 = h. Pour une borne supérieure, on utilise que n 0 = 1, et que n k 2n k 1 pour tout k > 0. En conséquence, n h 1 k=0 2k = 2 h 1, d où h lg(n + 1). La preuve montre aussi les arbres extrêmes : une chaîne de nœuds pour h = n, et un arbre binaire complet. 8.4 Parcours Exercice 8.1. Soit n k le nombre de nœuds avec k enfants dans un arbre ordonné (k = 0, 1, 2,... ). Démontrer que n 0 = 1 + n 2 + 2 n 3 + 3 n 4 + + (d 1) n d, où d est le degré maximal dans l arbre. Notez que Théorème 8.2 est un cas spécial de cette égalité avec d = 2. Indice: compter les nœuds deux fois une fois selon le nombre d enfants, et une fois selon le parent. Un parcours visite tous les nœuds de l arbre. Dans un parcours préfixe (preorder traversal), chaque nœud est visité avant que ses enfants soient visités. On calcule ainsi des propriétés avec récurrence vers le parent (comme niveau). Dans un parcours postfixe (postorder traversal), chaque nœud est visité après que ses enfants sont visités. On calcule ainsi des propriétés avec récurrence vers les enfants (comme hauteur). Dans les algorithmes suivants, un nœud externe est null, et chaque nœud interne N possède les variables N.children (si arbre ordonné), ou N.left et N.right (si arbre binaire). L arbre est stocké par une référence à sa racine root. Algo PARCOURS-PRÉFIXE(x) 2 «visiter» x 3 for y x.children do 4 PARCOURS-PRÉFIXE(y) Algo PARCOURS-POSTFIXE(x) 2 for y x.children do 3 PARCOURS-POSTFIXE(y) 4 «visiter» x 8.3

Algo NIVEAU(x, n) // remplit niveau[ ] // parent de x est à niveau n // appel initiel avec x = root et n = 1 N N2 niveau[x] n + 1 // (visite préfixe) N3 for y x.children do N4 NIVEAU(y, n + 1) Algo HAUTEUR(x) // retourne hauteur de x H1 max 1 // (hauteur maximale des enfants) H2 if x null then H3 for y x.children do H4 h HAUTEUR(y) ; H5 if h > max then max h H6 return 1 + max // (visite postfixe) Lors d un parcours infixe (inorder traversal), on visite chaque nœud après son enfant gauche mais avant son enfant droit. (Ce parcours ne se fait que sur un arbre binaire.) Algo PARCOURS-INFIXE(x) ( ) 2 PARCOURS-INFIXE x.left 3 «visiter» x ( ) 4 PARCOURS-INFIXE x.right Un parcours préfixe peut se faire aussi à l aide d une pile. Si au lieu de la pile, on utilise une queue, alors on obtient un parcours par niveau. Algo PARCOURS-PILE 1 initialiser la pile P 2 P.push(root) 3 while P 4 x P.pop() 5 if x null then 6 «visiter» x 7 for y x.children do P.push(y) Algo PARCOURS-NIVEAU 1 initialiser la queue Q 2 Q.enqueue(root) 3 while Q 4 x Q.dequeue() 5 if x null then 6 «visiter» x 7 for y x.children do Q.enqueue(y) Exercice 8.2. Montrer comment faire un parcours postfixe, sans récursion, à l aide d une pile. Indice: placez des paires (x, e) sur la pile où e encode l état du nœud x dans le parcours. Exercice 8.3. Montrer le code pour un parcours postfixe quand l arbre est stocké en format premier-fils-prochain-frère. 8.5 Arbre syntaxique Une expression arithmétique peut être representée par * notation infixe: 2*(3+7) un arbre syntaxique. Parcours différents du même arbre notation préfixe: * 2 + 3 7 notation postfixe: 2 3 7 + * mènent à des représentations différentes de la même expression. (L arbre montre l application de règles dans une 2 + 3 7 grammaire formelle pour expressions : E E + E E E nombre.) Une opération arithmétique a op b est écrite en notation polonaise inverse ou notation «postfixée» par a b op. Avantage : pas de parenthèses! Exemples : 1 + 2 1 2 +, (3 7) 8 3 7 8. Une telle expression s évalue à l aide d une pile : op pop(), b pop(), a pop(), c op(a, b), push(c). On répète le code tandis qu il y a un opérateur en haut. À la fin, la pile ne contient que le résultat numérique. L évaluation correspond à un parcours postfixe de l arbre syntaxique. 8.4

Algorithme EVAL(x) // (évalation de l arbre syntaxique avec racine x) E1 si x n a pas d enfants alors retourner sa valeur // (c est une constante) E2 sinon // (x est une opération op d arité k) `x.enfant[i] E3 pour i 0,..., k 1 faire f i EVAL E4 retourner le résultat de l opération op avec les opérands (f 0, f 1,..., f k 1 Langages. La notation préfixe est généralement utilisée pour les appels de procédures, fonctions ou de méthodes dans des langages de programmation populaires comme Java et C. En même temps, les opérations arithmétiques et logiques sont typiquement écrites en notation infixe. Le langage PostScript (Devoir 2) utilise la notation postfixe partout, même en instructions de contrôle. En conséquence, l interpréteur se relie sur des piles dans l exécution. Le code b 5 2 sub 20 moveto 30 40 lineto} if dessine une ligne entre les points (3, 20) et (30, 40) si b est vrai. En Javaesque, on écrirait if (b) moveto(5-2,20); lineto(30, 40)}. Le langage Lisp utilise la notation préfixe avec parènthèses obligatoires. En conséquence, les listes sont des objets fondamentaux ( Lisp =List Processing Language) lors d exécution : une liste est formée d une tête (car pour Lispéens) et d une queue cette dernière est aussi une liste (cdr pour le Lispéen). (with-canvas (:width 100 :height 200) ((moveto (- 5 2) 20) (lineto 30 40))) 8.5