pplication des arbres binaires. Plan ompter les arbres binaires Tétrarbres (quad trees) Problème des n corps Recherche dans un intervalle Recherche dans un nuage de points Recherche dans un arbre d intervalles ompter les arbres binaires (1) Rappel : un arbre binaire est soit vide, soit union disjointe d'une racine, d'un sous-arbre gauche et d'un sous-arbre droit. Si b n est le nombre d'arbres binaires distincts à n nœuds, on a donc : La série (x) = n-1! b 0 = 1 b n = b i b n-i-1!n! 0 b n x n i = 0 vérifie l'identité x 2 (x) - (x) + 1 = 0 mphi 8 1 mphi 8 2 La résolution de l'équation x 2 (x) - (x) + 1 = 0 donne b n = = d'où b n ~ " -1/2 4 n n -3/2 + O(4 n n -5/2 ) ompter les arbres binaires (2) 1 n+1 2n ( n) (2n)! n!(n+1)! (1) ans un arbre, nombre de nœuds = 1 + nombre d'arcs (2) ans un arbre binaire complet (tout nœud est d'arité 0 ou 2), nombre de feuilles = 1 + nombre de nœuds internes mphi 8 3 pplication des arbres binaires. Plan ompter les arbres binaires Tétrarbres (quad trees) Problème des n corps Recherche dans un intervalle Recherche dans un nuage de points Recherche dans un arbre d intervalles mphi 8 4
Une image est : soit de couleur uniforme Une vision hiérarchique des images Tétrarbres (quad trees) Une image 2 n x 2 n est subdivisée itérativement en quadrants jusqu'au niveau du pixel. NO NE soit formée de quatre images NO NE SO SE SO NO NE SE SO SE mphi 8 5 mphi 8 6 Tétrarbre associé à une image Une échelle de 32 couleurs mphi 8 7 mphi 8 8
Tétrarbre associé à une image Tétrabres en Java (1) class Tetrarbre boolean couleur; // version noir et blanc boolean estfeuille; Tetrarbre so, no, ne, se; // onstructeur des feuilles Tetrarbre(boolean couleur) this.estfeuille = true; this.couleur = couleur;... Merci à Luc Maranget... mphi 8 mphi 8 9 Tétrarbres en Java (2)... // onstructeur des nœuds internes Tetrarbre(Tetrarbre so, Tetrarbre no, Tetrarbre ne, Tetrarbre se) this.estfeuille = false; this.so = so; this.no = no; this.ne = ne; this.se = se; static boolean[][] image; // pixels Tétrarbres en Java (3) static boolean estmonochrome( Tetrarbre so, Tetrarbre no, Tetrarbre ne, Tetrarbre se) return (so.estfeuille && no.estfeuille && ne.estfeuille && se.estfeuille && so.couleur == no.couleur && so.couleur == ne.couleur && so.couleur == se.couleur); mphi 8 11 mphi 8 12
t = taille/2 Tétrarbres en Java (4) pixel (i, j) i i + t j NO SO j + t NE SE static Tetrarbre fairerbre(int taille, int i, int j) if (taille == 1) return new Tetrarbre(image[i][j]); int t = taille/2; Tetrarbre so = fairerbre(t, i+t, j); Tetrarbre no = fairerbre(t, i, j); Tetrarbre ne = fairerbre(t, i, j+t); Tetrarbre se = fairerbre(t, i+t, j+t); if (estmonochrome(so, no, ne, se)) return new Tetrarbre(so.couleur); return new Tetrarbre(so, no, ne, se); mphi 8 13 mphi 8 14 odage Tétrabres en Java (5) On code l'arbre par un parcours préfixe. Les nœuds internes sont codés 0 et les feuilles 1. près chaque 1, on code la couleur de la feuille (0 pour blanc, 1 pour bleu). Equivaut au code : 0 11 On pourrait améliorer le code : 01111011110111110110111111 00 01 1 mphi 8 15 static void parcours(tetrarbre a) if (a!= null) if (a.estfeuille) System.out.print("1" + ((a.couleur)? "1" : "0")); else // nœud interne System.out.print("0"); parcours(a.so); parcours(a.no); parcours(a.ne); parcours(a.se); mphi 8 16
utre avantage des tétrarbres On peut changer facilement la couleur d'une image. Faire une rotation d'un quart de tour. NO SO NE SE NE NO SE SO pplication des arbres binaires. Plan ompter les arbres binaires Tétrarbres (quad trees) Problème des n corps Recherche dans un intervalle Recherche dans un nuage de points Recherche dans un arbre d intervalles SO NO NE SE NO NE SE SO mphi 8 17 mphi 8 18 Problème des n corps Objectif : simuler le comportement de n particules (force de gravité ou électrostatique). Solution directe, itérer les calculs suivants : les n(n-1) forces F(p, q) entre 2 particules p et q, la résultante des forces pour chaque particule, le mouvement résultant pour une unité de temps. Trop lent pour n grand. alcul hiérarchique calculs exacts pour des particules proches; on assimile les particules distantes à leur barycentre. mphi 8 19 lgorithme de arnes-hut Octabres: c'est la version 3 des tétrarbres : un cube est divisé récursivement en 8 cubes. alcul de la force F(p, ), sur la particule p, issue du cube de coté c et de barycentre b. Si ne contient qu'une particule q, F(p, ) = F(p, q) Si la distance de p à b est > #.c (par ex. # = 2 ou 3), F(p, ) = F(p, b) Sinon F(p, ) = résultante (F(p, 1 ),..., F(p, 8 )) où 1,..., 8 sont les 8 sous-cubes de. Hierarchical O(n log n) force calculation algorithm, J. arnes and P. Hut, Nature, v. 324, écembre 1986 mphi 8
2 1 3 4 5 6 7 8 9 11 12 1 Tétrarbre associé 1 2 3 4 2 4 1 3 4 3 4 2 3 8 12 1 3 1 4 2 4 4 5 6 7 9 2 4 11 Réalisation onnées : pour chaque cube, la masse totale et le barycentre. e calcul peut se faire récursivement. Gestion de l'octarbre L'arbre est reconstruit à chaque unité de temps. as le pire en O(n 2 ). En pratique, arbre de hauteur O(log n). Pour une distribution uniforme en 3, le nombre d'interactions à calculer est ~ 28"# 3 (n log 2 n) soit ~ 263(n log 2 n) pour # = 3 9 mphi 8 22 Résultats expérimentaux Simulation d'un système de 5000 particules : fois plus rapide qu'avec l'algorithme direct. L'algorithme est facilement parallélisable. La simulation réaliste d'une galaxie nécessite des millions d'étoiles. On connaît un algorithme en O(n). En 1994, on a simulé 7 particules pour 3 pas de calcul (une semaine de calcul sur 500 processeurs...) pplication des arbres binaires. Plan ompter les arbres binaires Tétrarbres (quad trees) Problème des n corps Recherche dans un intervalle Recherche dans un nuage de points Recherche dans un arbre d intervalles mphi 8 mphi 8 24
Recherche en une dimension Exemple Problème : ompter les éléments d un ensemble d entiers qui sont dans un intervalle donné [min, max]. Exemple : E = 7, 9,, 12, 15, Entre 12 et 19, il y a 2 éléments. L ensemble est donné par un arbre binaire de recherche. Le prétraitement se fait en O(n log n), la recherche se fait en temps O(r + log n) où r est le nombre d'éléments trouvés. 7 3 9 15 6 12 5 25 Entre 8 et 19, il y a 4 éléments. On peut couper les sous-arbres issus de 3 (à gauche de 7) et de 25 (à droite de ). mphi 8 25 mphi 8 26 Exemple plus compliqué En Java Entre 25 et 75 50 7 90 40 80 60 55 70 65 79 72 mphi 8 27 static int compter(rbre a, int min, int max) int total = 0; if (a == null) return total; if (a.contenu >= min) total += compter(a.filsg, min, max); if (a.contenu >= min && a.contenu <= max) total++; if (a.contenu <= max) total += compter(a.fils, min, max); return total; mphi 8 28
pplication des arbres binaires. Plan ompter les arbres binaires Tétrarbres (quad trees) Problème des n corps Recherche dans un intervalle Recherche dans un nuage de points Recherche dans un arbre d intervalles Recherche en deux dimensions Problème : Etant donné un ensemble de points dans le plan, déterminer ceux qui sont dans une zone donnée. Exemples : Trouver les villes à moins de 0 km de Tours Trouver les personnes entre 25 et 29 ans qui gagnent entre 00 et 00 euros par mois. mphi 8 29 mphi 8 J G F H E L K Recherche en deux dimensions I Problème : Nombre de points dans un rectangle donné. Solution en deux étapes 1. Prétraitement : un arbre pour le nuage de points 2. Réponse : une recherche dans l arbre mphi 8 31 rbres pour des points class Point // onflit avec MacLib! int x, y; Point(int a, int b) x = a; y = b; class rbre Point p; rbre filsg, fils; rbre(rbre g, Point v, rbre d) filsg = g; p = v; fils = d; mphi 8 32
rbre pour un nuage de points Exemple onstruire un arbre comme suit le premier point coupe le plan en deux, horizontalement. les points coupent des secteurs horizontalement aux niveaux pairs, et verticalement aux niveaux impairs. J G F H E L K I mphi 8 33 mphi 8 34 Exemple Exemple J G F H E L K I J G F H E L K I est fils gauche de car.y <.y est fils gauche de car.x <.x mphi 8 35 mphi 8 36
Exemple Exemple J G F H E L K I J G F H E L K I E est fils droit de car.x >.x mphi 8 37 E est fils droit de car E.y >.y est fils droit de car.x >.x mphi 8 38 la racine, le niveau est impair Insérer un point : au début static rbre ajouter(point p, rbre a) return ajouter(p, a, false); static rbre ajouter(point p, rbre a, boolean vertical)... mphi 8 39 Insérer un point : une étape static rbre ajouter(point p, rbre a, boolean vertical) if (a == null) return new rbre(null, p, null); boolean estgauche = (vertical)? (p.x < a.p.x) : (p.y < a.p.y); if (estgauche) // insérer à gauche return new rbre(ajouter(p, a.filsg,!vertical), a.p, a.fils); else // insérer à droite return new rbre(a.filsg, a.p, ajouter(p, a.fils,!vertical)); mphi 8 40
class Rectangle int g, d, b, h; g h b d La classe Rectangle g : abcisse du côté gauche d : abcisse du côté droit b : ordonnée du côté bas h : ordonnée du côté haut mphi 8 41 Le décompte (1) static int compter(rectangle r, rbre a, boolean vertical) if (a == null) return 0; int total = 0; boolean agauche = r.g <= a.p.x; boolean aroite = a.p.x < r.d; boolean enas = r.b <= a.p.y; boolean enhaut = a.p.y < r.h; boolean min, max; min = (vertical)? agauche : enas; max = (vertical)? aroite : enhaut;... // à suivre mphi 8 42 Le décompte (2) static int compter(rectangle r, rbre a, boolean vertical)... // suite if (min) total += compter(r, a.filsg,!vertical); if (agauche && aroite && enas && enhaut) total++; if (max) total += compter(r, a.fils,!vertical); return total; pplication des arbres binaires. Plan ompter les arbres binaires Tétrarbres (quad trees) Problème des n corps Recherche dans un intervalle Recherche dans un nuage de points Recherche dans un arbre d intervalles mphi 8 43 mphi 8 44
Recherche d'un intervalle coupant Problème : hercher, dans un ensemble d intervalles, un élément qui rencontre un intervalle donné. Exemple : ans une base d événements, chercher un événement qui a eu lieu durant une période donnée. Type abstrait de données onnées : Un ensemble d'intervalles fermés [g, d]. Opérations : ajouter un intervalle supprimer un intervalle chercher si l'ensemble contient un intervalle qui rencontre un intervalle donné v. mphi 8 45 mphi 8 46 Structure de données Exemple Les intervalles sont stockés dans un arbre binaire de recherche. La clé utilisée pour comparer les nœuds est l'extrémité gauche des intervalles. dmax = max des extrémités droites du sous-arbre. 8:9 16:21 [22,25] rencontre [11,14] non 25: haque noeud n contient une information supplémentaire, dmax, qui est le maximum des extrémités droites des intervalles du sous-arbre issu de n. 5:8 0:3 6: 3 15: 17:19 19: 26:26 26 mphi 8 47 mphi 8 48
Utilisation de dmax (1) Intervalle [g, d]. Règle 1 dmax = max des extrémités droites du sous-arbre. 8:9 16:21 étermine dans quel sous-arbre chercher. 25: Si filsg.dmax < g, inutile de chercher dans le sous-arbre gauche. 8:9 16:21 Intervalle [22, 25] 25: 5:8 15: 17:19 26:26 26 5:8 15: 17:19 26:26 26 0:3 6: 3 19: 0:3 6: 3 dmax = < 22 19: mphi 8 49 mphi 8 50 Règle 2 (justifiée plus loin) Utilisation de dmax Si filsg.dmax! g, inutile de chercher dans le sous-arbre droit. 8:9 16:21 Intervalle [g, d]=[22, 25] 25: dmax = > 11 dmax = < 11 pas d'intersection! 8:9 16:21 Intervalle [11, 14] 25: 5:8 15: 17:19 26:26 26 5:8 15: 17:19 26:26 26 0:3 6: 3 dmax = > 22 dmax = < 22 Intersection! 19: mphi 8 51 0:3 6: 3 19: mphi 8 52
Justification Les classes Soit v = [g, d]. Soit [g', d'] un intervalle du sous-arbre gauche d'extrémité droite maximale. Par hypothèse, on a d'! g. Supposons qu aucun intervalle du sous-arbre gauche ne rencontre [g, d]. lors [g, d] $ [g', d'] = %, d'où d < g'. Soit [g", d"] un intervalle du sous-arbre droit. On a g < d < g' < g" < d", donc [g, d] et [g", d"] sont disjoints. onc aucun intervalle ne rencontre v! Une classe d'intervalles Une classe d'arbres binaires de recherche avec un champ intervalle un champ dmax Il faut revoir le constructeur d'arbres pour le calcul de dmax! mphi 8 53 mphi 8 54 class Intervalle int min, max; Intervalle(int a, int b) min = a; max = b; lasse Intervalle static boolean rencontre( Intervalle u, Intervalle v) return u.min <= v.max && v.min <= u.max; mphi 8 55 class rbre Intervalle u; int dmax; rbre filsg, fils; lasse rbre rbre(intervalle v, rbre g, rbre d) u = v; filsg = g; fils = d; dmax = calculmax(v, g, d);... mphi 8 56
lasse rbre class rbre... static int calculmax(intervalle v, rbre g, rbre d) int m = v.max; if (g!= null && g.dmax > m) m = g.dmax; if (d!= null && d.dmax > m) m = d.dmax; return m; mphi 8 57 Recherche static rbre chercher(intervalle v, rbre a) if (a == null rencontre(v, a.u)) return a; if (a.filsg!= null) && a.filsg.dmax >= v.min) return chercher(v, a.filsg);//règle 2 else return chercher(v, a.fils);//règle 1 mphi 8 58