Programmation fonctionnelle



Documents pareils
Arbres binaires de recherche

Les arbres binaires de recherche

# let rec concat l1 l2 = match l1 with [] -> l2 x::l 1 -> x::(concat l 1 l2);; val concat : a list -> a list -> a list = <fun>

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

INF601 : Algorithme et Structure de données

Les structures de données. Rajae El Ouazzani

ARBRES BINAIRES DE RECHERCHE

Cours de Programmation 2

Recherche dans un tableau

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

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

Classes et Objets en Ocaml.

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

Plan du cours : Zippers. Des fonctions sur les listes avec position. Des fonctions sur les listes avec position

STAGE IREM 0- Premiers pas en Python

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

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

Quelques Algorithmes simples

Correction Code nécessaire à la compilation : let bs ="\\" let nl = "\n" ;; let appliquer = List.map ;; (* affichage d'un noeud *)

modules & compilation

Conventions d écriture et outils de mise au point

chapitre 4 Nombres de Catalan

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

Initiation à l algorithmique

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

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

Initiation à la Programmation en Logique avec SISCtus Prolog

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

Reconstruction de bâtiments en 3D à partir de nuages de points LIDAR

Module Administration BD Chapitre 1 : Surcouche procédurale dans les SGBDS

Algorithmique, Structures de données et langage C

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

Programme Compte bancaire (code)

Programmation avec des objets : Cours 7. Menu du jour

Paginer les données côté serveur, mettre en cache côté client

Vérification de programmes et de preuves Première partie. décrire des algorithmes

Cours 1 : La compilation

Licence de MIDO - 3ème année Spécialités Informatique et Mathématiques Appliquées

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

Les Triggers SQL. Didier DONSEZ. Université de Valenciennes Institut des Sciences et Techniques de Valenciennes

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

OLYMPIADES ACADEMIQUES DE MATHEMATIQUES. 15 mars 2006 CLASSE DE PREMIERE ES, GMF

Algorithmique et Programmation, IMA

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

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

Introduction aux algorithmes répartis

LES TYPES DE DONNÉES DU LANGAGE PASCAL

La fonction exponentielle

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

Un ordonnanceur stupide

length : A N add : Z Z Z (n 1, n 2 ) n 1 + n 2

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

MIS 102 Initiation à l Informatique

Utilisation de JAVA coté Application serveur couplé avec Oracle Forms Hafed Benteftifa Novembre 2008

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

L exclusion mutuelle distribuée

Rapport de Mini-Projet en ArcGIS Engine

Structures dynamiques Listes chaînées

DG-ADAJ: Une plateforme Desktop Grid

Chapitre 7. Récurrences

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

Informatique III: Programmation en C++

Algorithmique et programmation : les bases (VBA) Corrigé

1 Création d une pièce. 2 Travail complémentaire. 1-1 Réglage des barres d outils. 1-2 Exemples de réalisation de pièces à l aide d un modeleur 3D

KL5121. Pour activer des sorties en fonction de la position d'un codeur

Poker. A rendre pour le 25 avril

Formats d images. 1 Introduction

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

Sauvegarde collaborative entre pairs Ludovic Courtès LAAS-CNRS

Structurer ses données : les tableaux. Introduction à la programmation

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

V- Manipulations de nombres en binaire

Application 1- VBA : Test de comportements d'investissements

Algorithmique I. Algorithmique I p.1/??

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Organiser le disque dur Dossiers Fichiers

Convers3 Documentation version Par Eric DAVID : vtopo@free.fr

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

Utilisation d objets : String et ArrayList

Introduction à la programmation concurrente

Cours de Master Recherche

Machines virtuelles fonctionnelles (suite) Compilation ML Java

Ordonnancement temps réel

Bases de données Oracle Virtual Private Database (VPD) pour la gestion des utilisateurs d applications

Utilitaires méconnus de StrataFrame

Programmation VBA/Excel. Programmation VBA. Pierre BONNET. Masters SMaRT & GSI - Supervision Industrielle P. Bonnet

Serveurs de noms Protocoles HTTP et FTP

Domain Name Service (DNS)

Algorithmique & programmation

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

Java 1.5 : principales nouveautés

Master IMEA 1 Calcul Stochastique et Finance Feuille de T.D. n o 1

Algorithmes d'apprentissage

Problème : Calcul d'échéanciers de prêt bancaire (15 pt)

Gestion mémoire et Représentation intermédiaire

ET 24 : Modèle de comportement d un système Boucles de programmation avec Labview.

0 si a=b. Si a^ et b^ sont deux éléments différents du même anneau, alors le résultat de

TP Blender n 2 : Importation d un modèle SketchUp et animation

Organiser les informations ( approche technique )

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

Transcription:

1/30 Programmation fonctionnelle Notes de cours Cours 9 23 novembre 2011 Sylvain Conchon sylvain.conchon@lri.fr

2/30 Les notions abordées cette semaine Les foncteurs Set.Make et Map.Make d Ocaml Arbres binaires Arbres binaires de recherche Arbres équilibrés : AVL

3/30 Le foncteur Set.Make module type OrderedType = sig type t val compare : t -> t -> int end module type S = sig type elt type t val empty : t val add : elt -> t -> t val remove : elt -> t -> t val union : t -> t -> t val compare : t -> t -> int... end module Make (Ord : OrderedType) :S with type elt = Ord.t

4/30 Utilisation de Set.Make Des ensembles d entiers module Int = struct type t = int let compare = Pervasives.compare end module S = Set.Make(Int) let s1 = S.add 1 (S.add 2 S.empty) let s2 = S.add 3 (S.add 4 S.empty) let s3 = S.union s1 (S.remove 2 s1) Des ensembles d ensembles d entiers module P = Set.Make(S) let p = P.add s1 (P.add s3 P.empty)

5/30 Le foncteur Map.Make module type OrderedType = sig type t val compare : t -> t -> int end module type S = sig type key type (+ a) t val empty : t val add : key -> a -> a t -> a t val remove : key -> a t -> a t val find : key -> a t -> a... end module Make (Ord : OrderedType) :S with type key = Ord.t

Arbres binaires 6/30

7/30 Arbres binaires Les arbres binaires avec des informations de type a aux nœuds sont définis avec le type suivant : type a arbre = Vide Noeud of a * a arbre * a arbre # let a = Noeud(10, Noeud(2,Noeud(8,Vide,Vide),Vide), Noeud(5,Noeud(11,Vide,Vide),Noeud(3,Vide,Vide))) ; ; val a : arbre = Noeud (10,...,...)

8/30 Recherche dans un arbre binaire La fonction recherche, de type a -> a arbre -> bool recherche un élément dans un arbre binaire : let rec recherche e = function Vide -> false Noeud(x,g,d) -> x=e recherche e g recherche e d Le temps de recherche dans le pire des cas est en O(n). Il faut des hypothèses plus fortes sur la structure de l arbre afin d obtenir une meilleure complexité.

Arbre binaire de recherche 9/30

10/30 Arbres ordonnés (ou de recherche) Un arbre binaire est ordonné (ou de recherche) par rapport à une relation d ordre quelconque si : c est l arbre Vide ou c est un arbre non-vide Noeud(x,g,d) et 1. les éléments du sous-arbre gauche g sont inférieurs à la racine x 2. la valeur x stockée à la racine de l arbre est inférieure aux éléments du sous-arbre droit d 3. les sous-arbres g et d sont eux-mêmes ordonnés

11/30 Recherche d un élément La structure ordonnée des arbres binaires de recherche permet d effectuer la recherche d un élément avec une compléxité en moyenne de O(logn). let rec recherche e = function Vide -> false Noeud (x,, ) when x=e -> true Noeud (x, g, ) when e<x -> recherche e g Noeud (,, d) -> recherche e d

12/30 Ajout d un élément L ajout d un élément dans un arbre binaire de recherche peut se faire de deux manières : ajout aux feuilles : facile à définir ajout à la racine : utile si les recherches portent sur les éléments récemment ajoutés

13/30 Ajout aux feuilles La fonction ajout : a -> a arbre -> a arbre de la façon suivante : est définie let rec ajout e a = match a with Vide -> Noeud(e,Vide,Vide) Noeud(x,, ) when e=x -> a Noeud(x, g, d) when x<e -> Noeud(x, g, ajout e d) Noeud(x, g, d) -> Noeud(x, ajout e g, d)

14/30 Ajout à la racine L ajout à la racine d un élément x consiste à couper un arbre en deux sous-arbres (de recherche) g et d, contenant respectivement les éléments plus petits et plus grands que x construire l arbre Noeud(x,g,d)

15/30 Couper un arbre en deux La fonction coupe : a -> a arbre -> a arbre * a arbre réalise la coupure d un arbre. let rec coupe e a = match a with Vide -> (Vide, Vide) Noeud(x, g, d) when x=e -> (g, d) Noeud(x, g, d) when x<e -> let (t1, t2) = coupe e d in (Noeud(x, g, t1), t2) Noeud(x, g, d) -> let (t1, t2) = coupe e g in (t1, Noeud(x, t2, ld))

16/30 Ajout à la racine La fonction ajout : a -> a arbre -> a arbre est alors définie de la manière suivante : let ajout e a = let (g, d) = coupe e a in Noeud(e,g,d)

17/30 Suppression d un élément (1/2) La suppression d un élément x dans un arbre binaire de recherche consiste à : isoler le sous-arbre Noeud(x, g, d) supprimer le plus grand élément y de g (on obtient ainsi un arbre de recherche h) reconstruire l arbre Noeud(y, h, d) let rec enleve plus grand = function Vide -> raise Not found Noeud(x, g, Vide) -> (x, g) Noeud(x, g, d) -> let (y, d ) = enleve plus grand d in (y, Noeud(x, g, d )) val enleve plus grand : a arbre -> a * a arbre

18/30 Suppression d un élément (2/2) La fonction suppression : a -> a arbre -> a arbre est alors définie par : let rec suppression e a = match a with Vide -> Vide Noeud(x, Vide, d) when x=e -> d Noeud(x, g, d) when x=e -> let (y, g ) = enleve plus grand g in Noeud(y,g,d) Noeud(x, g, d) when e<x -> Noeud(x, suppression e g,d) Noeud(x, g, d) -> Noeud(x, g, suppression e d)

Les arbres équilibrés 19/30

20/30 Recherche de l équilibre La recherche dans un arbre ordonné est proportionnelle à la longueur de la plus grande branche de l arbre Cette recherche est optimale pour des arbres de recherche équilibrés, c est-à-dire les arbres de taille n et de hauteur log(n)

21/30 Rééquilibrage des arbres de recherche L efficacité de la recherche dans un arbre binaire ordonné dépend fortement de la forme de l arbre La forme la pire est celle du peigne : un arbre où chaque nœud n a qu un seul successeur gauche ou droit (l arbre n est alors ni plus ni moins qu une liste) ; l opération de recherche est alors en O(n) La forme la meilleure est celle de l arbre équilibré, i.e. où taille 2 prof soit prof log 2 (taille).......... Il faut donc essayer de maintenir l équilibre des arbres binaires de recherche dans les opérations d ajout, de suppression etc...............

22/30 Les arbres AVL Premiers arbres binaires équilibrés Inventés en 1962 par les russes Adelson-Velsky et Landis (d où le nom AVL) Ces arbres vérifient la propriété suivante : La différence entre les hauteurs des fils gauche et des fils droit de tout nœud ne peut excéder 1

23/30 Définition des arbres AVL Le type des AVL est similaire à celui des arbres binaires On ajoute un entier dans les noeuds afin de mémoriser la hauteur des arbres type a avl = Vide Noeud of a * a avl * a avl * int On manipule les hauteurs des arbres à l aide des deux fonctions suivantes : let height = function Vide -> 0 Noeud(,,, h) -> h let creation l v r = Noeud(v, l, r, 1 + max (height l) (height r))

24/30 Ajout d un élément let rec ajout x = function Vide -> creation Vide x Vide Noeud(v, l, r, ) as t -> if x = v then t else if x < v then equilibrage (ajout x l) v r else equilibrage l v (ajout x r)

25/30 Équilibrage Soient deux arbres l et r équilibrés tels que prof(l) prof(g) 2 La fonction equilibrage construit un arbre équilibré formé des mêmes éléments, et dans le même ordre, que Noeud(l,v,r). let equilibrage l v r = let (hl, hr) = (height l, height r) in if hl > hr + 1 then begin match l with Noeud(lv, ll, lr, ) when height ll >= height lr -> creation ll lv (creation lr v r) Noeud(lv, ll, Noeud(lrv, lrl, lrr, ), )-> creation (creation ll lv lrl) lrv (creation lrr v r) -> assert false end else if hr > hl + 1 then begin (* cas symétrique *) end else creation l v r

26/30 Équilibrage à droite par simples rotations Si hl = hr + 2 et height(lr) height(ll) height(lr) + 1 alors on réalise une rotation simple à droite : creation ll lv (creation lr v r) v lv lv v rotation droite r lr ll lr r ll

27/30 Équilibrage à droite par doubles rotations Si hl = hr + 2 et height(ll) = p et height(lr) = p + 1 alors on réalise une rotation double gauche-droite : creation (creation ll lv lrl) lrv (creation lrr v r) v lrv lv lv v lrv rotation gauche-droite r lrr ll lrr ll lrl r lrl

28/30 Suppression d un élément La suppression d un élément x dans un AVL Noeud(v, l, r, h) consiste à : Fusionner l et r si x=v Supprimer x dans l ou r selon la valeur de x < v Re-équilibrer l arbre obtenu let rec suppression x = function Vide -> Vide Noeud(v, l, r, ) -> if x = v then fusion l r else if x < v then equilibrage (suppression x l) v r else equilibrage l v (suppression x r)

29/30 Fusion de deux AVLs Soient deux AVLs t1 et t2 tels que heigth(t1) height(t2) 1. Tous les éléments de t1 sont plus petits que ceux de t2 La fonction fusion construit un AVL formé des mêmes éléments que t1 et t2 let fusion t1 t2 = match (t1, t2) with (Vide, t) (t, Vide) -> t (, ) -> equilibrage t1 (min elt t2) (suppr min elt t2)

30/30 Plus petit élément La fonction min elt retourne le plus petit élément d un arbre binaire de recherche. let rec min elt = function Vide -> raise Not found Noeud(v, Vide, r, ) -> v Noeud(v, l, r, ) -> min elt l La fonction suppr min elt supprime le plus petit élément d un AVL let rec suppr min elt = function Vide -> raise Not found Noeud(v, Vide, r, ) -> r Noeud(v, l, r, ) -> equilibrage (suppr min elt l) v r