Plan. Arbres équilibrés Arbres AVL Arbres a-b Quelques compléments de Java. Amphi 9 1

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

Chapitre 10. Les interfaces Comparable et Comparator 1

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

Les arbres binaires de recherche

Une introduction à Java

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

Programmer en JAVA. par Tama

Utilisation d objets : String et ArrayList

Arbres binaires de recherche

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

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

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

Projet de programmation (IK3) : TP n 1 Correction

ARBRES BINAIRES DE RECHERCHE

Cours 1: Java et les objets

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

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

Java Licence Professionnelle CISII,

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

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

Bases du langage. Historique Applications et applets Éléments de base du langage Classes et objets Les exceptions

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

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

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

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

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

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

Corrigé des exercices sur les références

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

Exercices sur les interfaces

PROGRAMMATION PAR OBJETS

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

Généralités sur le Langage Java et éléments syntaxiques.

Package Java.util Classe générique

Polycopié Cours Programmation Orientée Objet sous Java Programme : Filière SMI S5

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

Langage Java. Classe de première SI

Programmation par les Objets en Java

Premiers Pas en Programmation Objet : les Classes et les Objets

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

Introduction à JDBC. Accès aux bases de données en Java

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

TD/TP PAC - Programmation n 3

Algorithmique, Structures de données et langage C

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

Quelques Algorithmes simples

Recherche dans un tableau

as Architecture des Systèmes d Information

Programmation Objet I

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

Java c est quoi? Java pourquoi?

Programmation avec des objets : Cours 7. Menu du jour

Un ordonnanceur stupide

JAVA. Introduction à la programmation objet avec java 1/4. Nadir BOUSSOUKAIA

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

TP, première séquence d exercices.

ALGORITHMIQUE ET PROGRAMMATION ORIENTEE OBJET

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

INF 321 : mémento de la syntaxe de Java

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

Programmation en Java IUT GEII (MC-II1) 1

Solutions du chapitre 4

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

TD/TP PAC - Programmation n 3

Conventions d écriture et outils de mise au point

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

INF601 : Algorithme et Structure de données

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

Chapitre V. Les classes : Object, Vector, etc.

TP1 : Initiation à Java et Eclipse

Introduction au langage Java

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

Programme Compte bancaire (code)

Cours 14 Les fichiers

Représentation d un entier en base b

Corrigés des premiers exercices sur les classes

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

Initiation à la programmation en Python

Programmation Par Objets et Langage Java

Programmation Orientée Objet Java

C++ COURS N 2 : CLASSES, DONNÉES ET FONCTIONS MEMBRES Classes et objets en C++ Membres d'une classe Spécification d'une classe Codage du comportement

JAVA TD0. Prise en main du langage Environnement de base JAVA 1

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

Apprendre Java en 154 minutes

Langage à objets : JAVA (1)

Applet pour visualiser les variables «automate» notifiées

1. Qu'est-ce que SQL? La maintenance des bases de données Les manipulations des bases de données... 5

Classe Interne, Anonyme & Enumération

Généralités. javadoc. Format des commentaires. Format des commentaires. Caractères spéciaux. Insérer du code

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Master d Informatique Corrigé du partiel novembre 2010

Programmation Orientée Objet application au langage Java Version Novembre 2007

Le Langage De Description De Données(LDD)

PROJET ALGORITHMIQUE ET PROGRAMMATION II

Java Licence Professionnelle CISII,

Threads. Threads. USTL routier 1

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

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

Programmation Par Objets

OpenPaaS Le réseau social d'entreprise

Transcription:

Plan Arbres équilibrés Arbres AVL Arbres a-b Quelques compléments de Java Amphi 9 1

Structures d'arbre Les structures d'arbre permettent de réaliser des opérations dynamiques, telles que recherche, prédécesseur, successeur, minimum, maximum, insertion, et suppression en temps proportionnel à la hauteur de l'arbre. Si l'arbre est équilibré, la hauteur est en O(log n) où n est le nombre de nœuds. Divers types d'arbres équilibrés sont utilisés : arbres AVL, 2-3, bicolores, b-arbres. Amphi 9 2

Arbres AVL : définition Un arbre binaire est un arbre AVL (Adelson-Velskii et Landis) si, pour tout sommet, les hauteurs des sous-arbres gauche et droit diffèrent d au plus 1. 3 4 1 2 1 0 2 0 0 1 0 0 Amphi 9 3

Exemple : arbres de Fibonacci Amphi 9 4

Hauteur d un arbre AVL Propriété. Soit A un arbre AVL ayant n sommets et de hauteur h. Alors log 2 (1+n) 1+ h a log 2 (2 + n) avec a 1,44. Par exemple, si n = 100000, 17 h 25. On a toujours n 2 h+1-1 donc log 2 (1+n) 1+ h. Amphi 9 5

Hauteur d un arbre AVL (2) Soit N(h) le nombre minimum de sommets d un arbre AVL de hauteur h. Alors N(h) = 1 + N(h-1) + N(h-2). h-1 h-2 Amphi 9 6

Hauteur d un arbre AVL (2) La suite F(h) = N(h)+1 vérifie F(0) = 2, F(1) = 3, F(h+2) = F(h+1) + F(h) donc F(h) = 1/ 5 (f h+3 f -(h+3) ) où f = 1 + 5 2 est le nombre d'or 1 + n F(h) > 1/ 5 (f h+3 1) h+3 < log 2 (2+n) / log 2 f + log 2 5 a log 2 (2+n) +2 Amphi 9 7

Rotations et équilibrage Les rotations gauche et droite transforment un arbre Elles préservent l'ordre infixe Elles se réalisent en temps constant. q droite p p W rotation gauche U q U V V W Amphi 9 8

c U p q V W Implantation (non destructive) droite rotation gauche static Arbre rotationg(arbre a) { Arbre b = a.filsd; Arbre c = new Arbre (a.filsg, a.contenu, b.filsg); return new Arbre (c, b.contenu, b.filsd); } Amphi 9 9 a U p V q b W

Implantation (destructive) a U b p q V W droite rotation gauche a U p V q b W static Arbre rotationg(arbre a) { Arbre b = a.filsd; } a.filsd = b.filsg; b.filsg = a; return b; Amphi 9 10

Double rotation U p V q r rotation gauche autour de p W X U p double rotation droite q V W Amphi 9 11 r X U p V q W r X rotation droite autour de r

Insertion dans un arbre AVL Insertion ordinaire, suivie de rééquilibrage. 44 71 83 50 44 71 83 37 61 37 61 61 50 37 44 50 71 83 double rotation autour de «71» Amphi 9 12

Insertion dans un arbre AVL Insertion ordinaire, suivie de rééquilibrage. 44 71 83 rotation gauche autour de «44» 61 71 83 37 61 44 50 61 37 50 37 44 50 71 83 rotation droite autour de «71» Amphi 9 13

Propriétés Pour rééquilibrer un arbre AVL après une insertion, une seule rotation ou double rotation suffit. Pour rééquilibrer un arbre AVL après une suppression, il faut jusqu à h rotations ou double rotations (h est la hauteur de l'arbre). Amphi 9 14

Algorithme Algorithme. Soit A un arbre, G et D ses sousarbres gauche et droit. On suppose que h(g) h(d) = 2 Si h(g) h(d) = 2, on fait une rotation droite. Soient g et d les sous-arbres gauche et droit de G. Si h(g) < h(d), on fait d'abord une rotation gauche de G. Si h(g) h(d) = -2, opérations symétriques. Amphi 9 15

class Avl { char contenu; int hauteur; Avl filsg, filsd; Implantation : la classe AVL } Avl(Avl g, char c, Avl d) { filsg = g; contenu = c; filsd = d; hauteur = 1 + Math.max(H(g), H(d)); }... Amphi 9 16

Implantation : calculs sur la hauteur Toutes les méthodes sont dans la classe AVL. static int H(Avl a) { return (a == null)? -1 : a.hauteur; } static void Avl calculerhauteur(avl a) { a.hauteur = 1 + Math.max(H(a.filsG), H(a.filsD)); } Amphi 9 17

Implantation des rotations static Avl rotationg(avl a) { Avl b = a.filsd; Avl c = new Avl(a.filsG, a.contenu, b.filsg); return new Avl(c, b.contenu, b.filsd); } Amphi 9 18

Implantation du rééquilibrage static Avl equilibrer(avl a) { calculerhauteur(a); if (H(a.filsG) - H(a.filsD) == 2) { if (H(a.filsG.filsG) < H(a.filsG.filsD)) a.filsg = rotationg(a.filsg); return rotationd(a); } // else if (H(a.filsG)- H(a.filsD) == -2){...} return a; } Amphi 9 19

Implantation de l insertion static Avl inserer(int x, Avl a) { if (a == null) return new Avl(null, x, null); if (x < a.contenu) a.filsg = inserer(x, a.filsg); else if (x > a.contenu) a.filsd = inserer(x, a.filsd); // seul changement : return equilibrer(a); } Amphi 9 20

Pourquoi des b-arbres? On doit souvent manipuler de grands volumes de données. Si les données ne tiennent pas en mémoire vive, les problèmes d'accès au disque deviennent primordiaux. Un seul accès au disque prend environ autant de temps que 200 000 instructions. L'utilisation d'un b-arbre minimise le nombre d'accès au disque. Amphi 9 21

Information sur disque Un disque est divisé en pages (par exemple de taille 512, 2048, 4096 ou 8192 octets). La page est l'unité de transfert entre mémoire et disque. Les informations sont constituées d'enregistrements, accessibles par une clé. Une page contient plusieurs enregistrements. Problème : trouver la page contenant l'enregistrement de clé c. Amphi 9 22

Chaque noeud interne contient des balises Arbres de recherche généralisés 8 15 34 46 65 clés 8 clés ]8-15] clés ]15-34] clés ]34-46] clés ]46-65] clés > 65 Amphi 9 23

Arbres de recherche généralisés Même principe que les arbres binaires de recherche 8 18 6 11 12 14 20 26 30 4 7 10 12 14 17 19 22 24 27 32 21 23 25 Amphi 9 24

Définition d'un arbre a-b (2a - 1 b) C'est un arbre de recherche généralisé. Les feuilles ont toutes la même profondeur. La racine a au moins 2 et au plus b fils (sauf si l'arbre est réduit à sa racine). Les autres nœuds internes ont au moins a et au plus b fils. Lorsque b = 2a - 1, un arbre a-b est appelé un b- arbre d'ordre a-1. En pratique, a peut être de l'ordre de plusieurs centaines. Amphi 9 25

Un arbre 2-4 Balises 8 20 40 6 11 12 14 21 26 30 42 4 7 10 12 14 18 21 25 30 36 41 50 Clés c 0 k 1 < c 1... k d < c d 10 11 < 12 12 < 14 14 < 18 Amphi 9 26

Taille d'un arbre a-b (2a - 1 b) Proposition. Si un arbre a-b de hauteur h contient n feuilles, alors 2a h-1 n b h et donc log n / log b h 1 + log(n/2) / log a Preuve. Tout nœud a au plus b fils. Il y a donc au plus b h feuilles. Tout nœud autre que la racine a au moins a fils, et la racine au moins 2. Au total, il y a au moins 2a h-1 feuilles. Amphi 9 27

Recherche dans un arbre a-b 8 20 40 6 11 12 14 21 26 30 42 4 7 10 12 14 18 21 25 30 36 41 50 Recherche de 30 Amphi 9 28

Insertion dans un arbre a-b (1) 8 20 40 6 10 13 21 26 30 42 4 7 9 12 14 21 25 30 36 41 50 Insertion de 11: la balise est min(11, 12) 10 13 9 12 14 10 11 13 9 11 12 14 Amphi 9 29

Insertion dans un arbre a-b (2) 8 20 40 6 10 13 21 26 30 42 4 7 9 12 14 21 25 30 36 41 50 Insertion de 13 : la balise est min(12, 13) 10 13 9 12 14 10 12 13 9 12 13 14 Amphi 9 30

Eclatement d'un nœud L'insertion d'un élément peut produire un nœud ayant plus de b fils. Il faut alors éclater le nœud. 26 21 26 27 30 21 27 30 21 25 27 30 36 21 25 27 30 36 Amphi 9 31

Insertion de 15 8 20 40 6 11 12 14 21 26 30 42 4 7 10 12 14 18 21 25 30 36 41 50 8 20 40 8 12 20 40 A éclater! 11 12 14 11 14 15 10 12 14 18 10 12 14 15 18

Après insertion de 15 12 8 20 40 6 11 14 15 21 26 30 42 4 7 10 12 14 15 18 21 25 30 36 41 50

C'est l'opération inverse de l'éclatement. Fusion de deux nœuds 26 21 27 30 21 26 27 30 21 25 27 30 36 21 25 27 30 36 Amphi 9 34

Partage de deux nœuds 18 26 32 18 27 32 20 21 27 2930 20 21 26 2930 Amphi 9 35

Suppression d'une feuille (1) Algorithme. Supprimer la feuille, puis les balises figurant sur le chemin de la feuille à la racine. Si les nœuds ainsi modifiés ont toujours a fils, l arbre est encore a-b. Si un nœud possède seulement a -1 fils, examiner ses frères adjacents. Si l'un de ces frères possède au moins a + 1 fils, il suffit de faire un partage avec ce frère. Sinon, les frères adjacents ont a fils, la fusion avec l'un deux produit un nœud ayant 2a - 1 b fils. Amphi 9 36

Exemples de suppression (1) Suppression de 25 21 26 30 21 30 20 25 30 36 20 30 36 racine 21 20 20 25 Amphi 9 37

Suppression de 12 (1) Suppression de 12 8 20 6 11 21 26 30 4 7 10 12 21 25 30 36 Amphi 9 38

Suppression de 12 (2) L'arbre n'est plus 2-4 8 20 6 21 26 30 4 7 10 21 25 30 36 Amphi 9 39

Suppression de 12 (3) Après partage avec le frère droit. 8 21 6 20 26 30 4 7 10 21 25 30 36 Amphi 9 40

Suppression de 13 (1) Suppression de 13 8 20 6 11 21 4 7 10 13 21 25 Amphi 9 41

Suppression de 13 (2) L'arbre n'est plus 2-4 8 20 6 21 4 7 10 21 25 Amphi 9 42

Suppression de 13 (3) Après fusion avec le frère droit. 8 6 20 21 4 7 10 21 25 Amphi 9 43

final La déclaration d'une variable final doit toujours être accompagnée d'une initialisation. Une méthode final ne peut être surchargée. Une variable final ne peut être modifiée. Attention! Si la variable est un tableau, donc une référence, cette référence ne change plus, mais les valeurs du tableau peuvent être modifiées. Une classe final ne peut pas avoir de classe dérivée. Les méthodes d'une classe final sont implicitement final. Amphi 9 44

final class Test { static final int n = 100; static final int[] a = {1, 2, 3}; } public static void main(string args[]) { a[0] = 5; // OK n = 9; // Erreur! Variable finale } Amphi 9 45

Spécial pub. La multiplication par 5 13 x 5 = 65 Entrée : 1011 Sortie : 1000001 Cet automate réalise la multiplication par 5 en binaire inversé. Amphi 9 46

Un petit casse-tête (1) Un joueur a les yeux bandés. Face à lui, un plateau circulaire sur lequel sont disposés en carré quatre jetons, blancs d'un côté et noirs de l'autre. La configuration de départ est inconnue du joueur. Le but du jeu est d'avoir les quatre jetons du côté blanc. Configurations possibles, à une rotation près. Amphi 9 47

Règles du jeu Le joueur peut retourner autant de jetons qu'il le souhaite, mais sans les déplacer. A chaque tour, le maître de jeu annonce si la configuration obtenue est gagnante ou pas, puis effectue une rotation du plateau de 0, 1, 2 ou 3 quarts de tours. Peut-on gagner à coup sûr? En combien de coups? Amphi 9 48

La méthode tostring (1) Méthode de la classe java.lang.object. public String tostring() Elle retourne une chaîne de caractères formée par le nom de la classe, suivi de @, du codage du type puis de la référence B byte J long C char Lnom_de_classe classe D double S short F float Z boolean I int Précédé de [ dans le cas d'un tableau Amphi 9 49

La méthode tostring (2) public static void main(string args[]) { } byte[] T = {5, 2, 6}; System.out.println(T); >[B@f96da1 [ --> Tableau B --> de bytes @ --> Adresse, suivi de l'adresse en héxadécimal Amphi 9 50

La méthode tostring (2) Elle est parfois surchargée. Par exemple, dans java.lang.class, elle donne seulement le nom de la classe. Dans java.lang.string elle retourne la chaîne de caractères. public static void main(string[]args) { String p = "bonjour"; System.out.println(p); } // affichera : bonjour Amphi 9 51

La classe String est final. Les secrets de la classe String Une chaîne de caractères renvoie toujours à la même instance de la classe String. Un tas de méthodes utiles : int length() int charat(int index) int compareto(string s) String replace(char c1, char c2) String tolowercase() String touppercase() String valueof(int i) Amphi 9 52

Autres méthodes utiles de la classe String boolean startswith(string prefix) boolean endswith(string suffix) int indexof(int ch, int from) int indexof(string facteur) int lastindexof(int ch, int from) int lastindexof(string facteur) String substring(int i, int j) int indexof(int c, int fromindex) int indexof(string facteur) String substring(int i, int j) String concat(string s), etc. Amphi 9 53

class Test { static final int[] a = {1, 2, 3}; static final int[] b = {1, 2, 3}; La classe String } public static void main(string args[]) { String s = "bonjour"; String t = "bonjour"; System.out.println(a == b); // false System.out.println(s == t); // true } Amphi 9 54