Préfixe : 1, 2, 4, 8, 9, 5, 10, 3, 6, 7 (VGD) Infixe : 8, 4, 9, 2, 10, 5, 1, 6, 3, 7 (GVD) Suffixe : 8, 9, 4, 10, 5, 2, 6, 7, 3, 1 (GDV)

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

Les arbres binaires de recherche

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

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

Arbres binaires de recherche

Algorithmique, Structures de données et langage C

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

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

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

ARBRES BINAIRES DE RECHERCHE

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

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

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

Corrigé des exercices sur les références

Cours de Programmation Impérative: Zones de mémoires et pointeurs

Java Licence Professionnelle CISII,

Programmation en langage C

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

Limites finies en un point

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

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

Chapitre 10. Les interfaces Comparable et Comparator 1

Quelques Algorithmes simples

Assurance Qualité. Cours de génie logiciel. Renaud Marlet. LaBRI / INRIA (d'après A.-M. Hugues) màj 23/04/2007

MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES. Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année

2. Comprendre les définitions de classes

Programme Compte bancaire (code)

Cours de C. Petits secrets du C & programmation avancée. Sébastien Paumier

Les processus légers : threads. Système L3, /31

Introduction à la programmation concurrente

Cours 6 : Tubes anonymes et nommés

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

INF601 : Algorithme et Structure de données

Exo7. Calculs de déterminants. Fiche corrigée par Arnaud Bodin. Exercice 1 Calculer les déterminants des matrices suivantes : Exercice 2.

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr

chapitre 4 Nombres de Catalan

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

OS Réseaux et Programmation Système - C5

INITIATION A LA PROGRAMMATION

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

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

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

Programmation avec des objets : Cours 7. Menu du jour

Processus! programme. DIMA, Systèmes Centralisés (Ph. Mauran) " Processus = suite d'actions = suite d'états obtenus = trace

4. Groupement d objets

Derrière toi Une machine virtuelle!

SUPPORT DE COURS. Langage C

Archivage Messagerie Evolution pour usage HTML en utilisant Hypermail

TD2/TME2 : Ordonnanceur et Threads (POSIX et fair)

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

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

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

Projet de programmation (IK3) : TP n 1 Correction

Cours admin 200x serveur : DNS et Netbios

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Pensez à vous inscrire... si ce n est pas encore fait

Playing with ptrace() for fun and profit

Programmation Orientée Objet Java

Chapitre 7. Récurrences

TP2 : tableaux dynamiques et listes chaînées

Package Java.util Classe générique

I. Introduction aux fonctions : les fonctions standards

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

TD/TP PAC - Programmation n 3

Conventions d écriture et outils de mise au point

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

INFO-F-105 Language de programmation I Séance VI

COMPARAISONDESLANGAGESC, C++, JAVA ET

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

CH.6 Propriétés des langages non contextuels

TD/TP PAC - Programmation n 3

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

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

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

CONCOURS DE L AGRÉGATION INTERNE «ÉCONOMIE ET GESTION» SESSION 2015 SECONDE ÉPREUVE

Introduction au langage C

Spécification et certification d implantation chaînée avec des orbites : les hypercartes combinatoires

Baccalauréat S Antilles-Guyane 11 septembre 2014 Corrigé

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

Algorithmes d'apprentissage

Examen d informatique première session 2004

Chapitre 1 : La gestion dynamique de la mémoire

V- Manipulations de nombres en binaire

Corrigés des premiers exercices sur les classes

Document Object Model (DOM)

Objets et Programmation. origine des langages orientés-objet

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

Machines virtuelles fonctionnelles (suite) Compilation ML Java

Chapitre 2. Classes et objets

Cours de C. Allocation dynamique. Sébastien Paumier

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.

Donner les limites de validité de la relation obtenue.

Cours d Algorithmique et de Langage C v 3.0

DNS Server RPC Interface buffer overflow. Céline COLLUMEAU Nicolas BODIN

INF2015 Développement de logiciels dans un environnement Agile. Examen intra 20 février :30 à 20:30

Programmation C. J.-F. Lalande. 15 novembre 2012

Bac Blanc Terminale ES - Février 2011 Épreuve de Mathématiques (durée 3 heures)

Un ordonnanceur stupide

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

NoSQL : hype ou innovation? Grégory Ogonowski / Recherches Octobre 2011

Transcription:

Parcours d'arbres 1 2 3 4 5 6 7 8 9 10 Préfixe : 1, 2, 4, 8, 9, 5, 10, 3, 6, 7 (VGD) Infixe : 8, 4, 9, 2, 10, 5, 1, 6, 3, 7 (GVD) Suffixe : 8, 9, 4, 10, 5, 2, 6, 7, 3, 1 (GDV)

typedef struct Noeud Element contenu; struct Noeud *filsg; struct Noeud *filsd; *Arbre; void ParcoursPrefixe(Arbre a) if (a!= NULL) printf("%3d", a->contenu); ParcoursPrefixe(a->filsG); ParcoursPrefixe(a->filsD);

void ParcoursInfixe(Arbre a) if (a!= NULL) ParcoursInfixe(a->filsG); printf("%3d", a->contenu); ParcoursInfixe(a->filsD); void ParcoursSuffixe(Arbre a) if (a!= NULL) ParcoursSuffixe(a->filsG); ParcoursSuffixe(a->filsD); printf("%3d", a->contenu);

Arbres de recherche 15 12 19 8 14 16 21 10 13 17 Propriété de base : Pour chaque noeud de valeur v, les noeuds du sous-arbre gauche ont une valeur < v et ceux du sous-arbre droit ont une valeur > v.

Exercices X, Petite classe 75 (1) Montrer que le parcours infixe ordonne les nœuds par valeur croissante. (2) Montrer que si un nœud a deux fils, son successeur dans l'ordre infixe n'a pas de fils gauche et son prédécesseur n'a pas de fils droit. (3) Montrer que le successeur du nœud n est le sommet le plus à gauche dans le sous-arbre droit issu de n.

Recherche X, Petite classe 75 Arbre Recherche(Element v, Arbre a) if (a == NULL v == a->contenu) return a; if (v < a->contenu) return Recherche(v, a->filsg); return Recherche(v, a->filsd);

Arbre NouvelArbre(Element v, Arbre a, Arbre b) Arbre c; Ajout d'un élément c = (Arbre)malloc (sizeof (struct Noeud )); c->contenu = v; c->filsg = a; c->filsd = b; return c; void AjouterArbre(Element v, Arbre *ap) Arbre a = *ap; if (a == NULL ) a = NouvelArbre(v, NULL, NULL ); else if (v <= a->contenu) AjouterArbre(v, &a->filsg); else AjouterArbre(v, &a->filsd); *ap = a;

Suppression X, Petite classe 75 (a) le noeud est une feuille : on le supprime 15 15 12 19 12 19 8 14 16 21 8 14 16 21 10 13 17 10 17 (b) le noeud est un a un seul fils : on la supprime 15 15 12 19 12 19 8 14 16 21 8 13 16 21 10 13 17 10 17

(c) le noeud s a deux fils : on supprime son successeur t (qui n'a pas de fils gauche), mais on remplace la valeur de s par celle de t. 15 15 12 19 12 19 8 14 16 21 8 14 16 21 10 13 17 10 13 17 16 12 19 8 14 17 21 10 13

void SupprimerArbre(Element v, Arbre *ap) Arbre a = *ap; if (a == NULL) *ap = a; else if (v < a->contenu) SupprimerArbre(v, &a->filsg); else if (v > a->contenu) SupprimerArbre(v, &a->filsd); else if (a->filsg == NULL ) *ap = a->filsd; else if (a->filsd == NULL ) *ap = a->filsg; else (*ap)->contenu = SupprimerSuccesseur(&a); Element SupprimerSuccesseur(Arbre *ap) Arbre a = *ap; Element v; if (a->filsg == NULL ) v = a->contenu; a = NULL ; return v; return SupprimerSuccesseur(&(a->filsG));

O(log n) si l'arbre est équilibré O(n) si l'arbre est filiforme --> D'où l'intérêt des arbres équilibrés! Arbre AVL (Adel'son-Vel'skii et Landis) : pour tout noeud, la différence de hauteur entre les sous-arbres gauche et droit est égale à -1, 0 ou 1. Exemple : les tas Temps de calcul Hauteur d'un arbre AVL : O(log n)

typedef struct NoeudAVL int balance; Element contenu; struct NoeudAVL *filsg; struct NoeudAVL *filsd; *ArbreAVL;

Théorème. Soit un arbre AVL de hauteur h à n sommets. Alors log 2 (1 + n) 1 + h 1,44 log 2 (1 + n) Preuve. Pour une hauteur h donnée, le nombre maximum de sommets est atteint pour l'arbre complet à 2 h+1-1 sommets. Hauteur 0 : Hauteur 1 : Hauteur 2 : Donc n 2 h+1-1 et log 2 (1 + n) 1 + h

Soit N(h) le nombre minimum de sommets d'un arbre AVL de hauteur h. On a N(0) = 0 N(1) = 2 N(h) = 1 + N(h-1) + N(h-2) h-1 h-2 Donc F(h) = N(h) + 1 vérifie F(0) = 2 F(1) = 3 F(h) = F(h-1) + F(h-2) d'où F(h) = F h+3 = 1 [( 1 + 5 ) h+3 - ( 1-5 ) h+3 ] 5 2 2

Rotation simple x u h-1 h-2 X Y v Z h-2 u x v u x h-1 X Y v Z h-2

Double rotation X, Petite classe 75 x u v w Z h-2 h-2 X V W h-2 u u v x w v x X Z V h-2 w W

Partitions X, Petite classe 75 Données : une partition de l'ensemble 1,..., K Trouver la classe d'un élément Faire l'union de deux classes. Une première solution : Représenter la partition par un tableau classe tel que classe[i] soit la classe de l'élément i. Trouver : O(1) Union : O(n)

Deuxième solution : utilisation d'une forêt. 1 3 6 5 9 7 11 8 4 2 10 On représente la forêt par un tableau t tel que t[s] = père de s (si s est une racine, t[s] = s) Trouver : O(n) Union : proportionnel à la hauteur de l'arborescence

Union pondérée Règle : Lors de l'union, la racine de l'arbre le moins haut devient fils de la racine de l'arbre le plus haut. 1 6 5 9 3 8 4 7 11 10 2 On part de la partition de 1,..., K en K classes. 1 2 K

Notons t i (x) la taille (= nombre de noeuds) et h i (x) la hauteur du sommet x après la i-ème opération d'union pondérée. On a t 0 (x) = 1 et h 0 (x) = 0. Lemme. On a t i (x) 2 hi(x) et h n (x) log 2 (n + 1). Preuve. (a) Si h i (x) = 0, alors t i (x) = 1 (b) à suivre x

Lemme. On a t i (x) 2 hi(x) et h n (x) log 2 (n + 1). x Preuve (suite). (b) Si h i (x) > 0, soit y un fils de x. On a h i (y) = h i (x) - 1. Si y est devenu un fils de x lors de la j-ième union (j i), on a t j-1 (x) t j-1 (y), d'où t j (y) = t j-1 (y) et t j (x) 2t j (y). Ensuite, la taille de y ne varie plus, mais celle de x peut croître. De même, la hauteur de y ne varie plus, donc h i (y) = h j-1 (y). Par hypothèse de récurrence, t j-1 (y) 2 hj-1(y), donc t j (y) = t j-1 (y) 2 hj-1(y) = 2 hi(y) et t j (x) t j (x) 2.t j (y) 2.2 hi(y) = 2 h i(x) Comme t n (x) n+1, on a la seconde inégalité. y

Corollaire. Une suite de n-1 "unions" et de m "trouver" se réalise en temps O(n + m log n).

Compression des chemins On comprime un chemin en faisant de chaque nœud traversé un fils de la racine : 1 1 5 9 5 4 10 9 8 4 8 10 Prop. Une suite de n-1 "unions" et de m "trouver" (m n) se réalise en temps O(m.α(n,m)), où α est une sorte d'inverse de la fonction d'ackermann. En pratique, α(n,m) 2.