Arbre de portée
En informatique, un arbre de portĂ©e, en anglais range tree, est un arbre enracinĂ© qui sert de structure de donnĂ©es pour stocker une liste de points. Il permet de trouver efficacement tous les points Ă une certaine distance d'un autre point, et typiquement utilisĂ© pour deux dimensions ou plus. Les arbres de portĂ©e ont Ă©tĂ© introduits par Jon Louis Bentley en 1979[1]. Des structures de donnĂ©es similaires ont Ă©tĂ© indĂ©pendamment dĂ©couvertes par Lueker[2], Lee and Wong[3], et Willard[4]. L'arbre de portĂ©e est une alternative Ă l'arbre kd. Par rapport aux arbres kd, l'arbre de portĂ©e offre des requĂȘtes plus rapides en mais un stockage pire en , oĂč n est le nombre de points stockĂ©s dans l'arbre, d la dimension de chaque point et k le nombre de points signalĂ© par une certaine requĂȘte.
Bernard Chazelle a amĂ©liorĂ© ce temps de requĂȘte en et la complexitĂ© spatiale en [5] - [6].
Description
Un arbre de portĂ©e avec un ensemble de points Ă 1 dimension est un arbre binaire de recherche Ă©quilibrĂ© en ces points. Les points stockĂ©s dans l'arbre sont stockĂ©s dans les feuilles de l'arbre ; chaque nĆud interne stocke la plus grande valeur contenue dans son sous-arbre gauche. Un arbre de portĂ©e sur un ensemble de points en d dimensions est un arbre binaire de recherche Ă plusieurs niveaux rĂ©cursivement dĂ©fini. Chaque niveau de la structure de donnĂ©es est un arbre binaire de recherche sur l'une des d dimensions. Le premier niveau est un arbre binaire de recherche sur la premiĂšre des d coordonnĂ©es. Chaque sommet v de cet arbre contient une structure associĂ©e qui est un arbre de portĂ©e (d-1) dimensionnel sur la derniĂšre (d-1) coordonnĂ©e des points stockĂ©s dans le sous-arbre de v.
Opérations
Construction
Un arbre de portĂ©e Ă 1 dimension d'un ensemble de n points est un arbre binaire de recherche, qui peut ĂȘtre construit en une complexitĂ© en temps de O(n log n)). Les arbres de portĂ©e de dimensions plus grande sont construites rĂ©cursivement en construisant un arbre binaire de recherche Ă©quilibrĂ© sur la premiĂšre coordonnĂ© des points, et ensuite, pour chaque sommet v dans cet arbre, en construisant un arbre de portĂ©e Ă (d-1) dimensions sur les points contenus dans le sous-arbre de v. Construire un arbre de portĂ©e de cette façon requiert un temps en O(nlogdn)).
Cela peut ĂȘtre amĂ©liorĂ© en remarquant qu'un arbre de portĂ©e sur un ensemble de points Ă 2 dimensions peut ĂȘtre construit en temps O(n log n)[7]. Soit S l'ensemble de n points Ă 2 dimensions. Si S contient seulement un point, retourner une feuille contenant ce point. Sinon, construire la structure associĂ©e de S, un arbre de portĂ©e de 1 dimensions sur la coordonnĂ©e y' des points dans S. Soit xm la mĂ©diane des la coordonnĂ©e x des points. Soit 'SL l'ensemble des points avec la coordonnĂ©e x infĂ©rieure ou Ă©gale Ă xm et soit SR l'ensemble des points avec la coordonnĂ©e x supĂ©rieure Ă xm. Construire rĂ©cursivement vL, un arbre de portĂ©e Ă 2 dimensions sur SL, et vR, un arbre de portĂ©e Ă 2 dimensions sur SR. CrĂ©er un sommet v avec pour enfant Ă gauche vL et Ă droite vR. Si on trie les points par leurs coordonnĂ©es y au dĂ©but de l'algorithme, et en maintenant cet ordre quand on coupe les points par leurs coordonnĂ©es x, on peut construire la structure associĂ©e Ă chaque sous-arbre en temps linĂ©aire. Cela rĂ©duit le temps pour construire un arbre de portĂ©e Ă 2 dimensions Ă O(n log n), ce qui rĂ©duit aussi le temps pour construire un arbre de portĂ©e Ă d dimensions Ă O(n logdâ1n).
RequĂȘte de distance
Les arbres de portĂ©e peuvent ĂȘtre utilisĂ©s pour trouver un ensemble de points qui se situent Ă un intervalle donnĂ©. Pour signaler les points dans l'intervalle [x1, x2], on commence par chercher x1 et x2. Ă certains sommets dans l'arbre, le chemin de recherche pour x1 et x2 va diverger. Soit vsplit le dernier sommet que ces deux chemins de recherche ont en commun. On continue Ă chercher pour x1 dans l'arbre de portĂ©e. Pour chaque sommet v dans le chemin de recherche depuis vsplit Ă x1, si la valeur stockĂ©e Ă v est plus grande que x1, on signale chaque point dans le sous-arbre droit de v. Si v est une feuille, on signale la valeur stockĂ©e sur v si c'est Ă l'intĂ©rieur de l'intervalle de la requĂȘte. Similairement, on signale tous les points stockĂ©s dans le sous-arbre gauches avec les sommets qui ont une valeur infĂ©rieure Ă x2 tout au long du chemin de recherche de vsplit Ă x2, et on signale la feuille de ce chemin si elle est Ă l'intĂ©rieur de l'intervalle de la requĂȘte.
Ătant donnĂ© que l'arbre de portĂ©e est un arbre binaire Ă©quilibrĂ©, le chemin de recherche de x1 et x2 a une longueur de O(log n). Signaler tous les points stockĂ©s dans le sous-arbre d'un sommet peut ĂȘtre effectuĂ© en temps linĂ©aire en utilisant un algorithme de parcours d'arbre. Ainsi le temps pour effectuer une requĂȘte de distance est O(log n + k), oĂč k est le nombre de points dans l'intervalle de la requĂȘte.
Les requĂȘtes de distance sont similaires dans d dimensions. Au lieu de signaler tous les points stockĂ©s dans les sous-arbres des chemins de recherche, on effectue une requĂȘte de distance Ă (d-1) dimensions sur la structure associĂ©e Ă chaque sous-arbre. Finalement, une requĂȘte de distance Ă 1 dimension va ĂȘtre effectuĂ©e et les points corrects vont ĂȘtre signalĂ©s.
De mĂȘme, les requĂȘtes de distance Ă 2 dimensions peuvent ĂȘtre effectuĂ©es. Un arbre binaire dans la coordonnĂ©e est nĂ©cessaire, oĂč chaque nĆud est augmentĂ© avec un sous-arbre dans la coordonnĂ©e y qui contient tous les points descendants. Trivialement, cette structure de donnĂ©es peut ĂȘtre calculĂ©e en un temps de O(nlog2n) qui peut ĂȘtre optimisĂ© en O(nlogn). Ătant donnĂ© qu'on augmente chaque nĆud avec un sous-arbre, la complexitĂ© de l'espace requis de cette structure de donnĂ©es est O(nlogn). La complexitĂ© en temps de chaque requĂȘte sera O(log2n).
Ătant donnĂ© qu'une requĂȘte Ă d dimensions consiste en des requĂȘtes de distance Ă O(log n) (dâ1)dimensions , il survient que le temps pour effectuer une requĂȘte de distance Ă d dimensions est O(logdn + k), oĂč k est le nombre de points dans l'intervalle de la requĂȘte. Cela peut ĂȘtre rĂ©duit Ă O(logdâ1n + k) en utilisant la technique de cascade fractionnĂ©e[2] - [4] - [7].
Voir aussi
Références
- (en) J. L. Bentley, « Decomposable searching problems », Information Processing Letters, vol. 8, no 5,â , p. 244â251 (DOI 10.1016/0020-0190(79)90117-0)
- (en) G. S. Lueker, 19th Annual Symposium on Foundations of Computer Science (sfcs 1978), , 28â21 p. (DOI 10.1109/SFCS.1978.1), « A data structure for orthogonal range queries »
- (en) D. T. Lee et C. K. Wong, « Quintary trees: A file structure for multidimensional database systems », ACM Transactions on Database Systems, vol. 5, no 3,â , p. 339 (DOI 10.1145/320613.320618)
- Dan E. Willard, « The super-b-tree algorithm », Tech report TR-03-79, Cambridge, MA, Aiken Computer Lab, Harvard University,â
- (en) Bernard Chazelle, « Lower Bounds for Orthogonal Range Searching: I. The Reporting Case », ACM, vol. 37,â , p. 200-212 (lire en ligne)
- (en) Bernard Chazelle, « Lower Bounds for Orthogonal Range Searching: II. The Arithmetic Model », ACM, vol. 37,â , p. 439-463 (lire en ligne)
- (en) Mark de Berg, Otfried Cheong, Marc van Kreveld et Mark Overmars, Computational Geometry : algorithms and applications, Berlin, Springer, , 386 p. (ISBN 978-3-540-77973-5, BNF 41264669, DOI 10.1007/978-3-540-77974-2)
Liens extérieurs
- Range and Segment Trees in CGAL, the Computational Geometry Algorithms Library.
- Lecture 8: Range Trees, Marc van Kreveld.
- Erik Demaine, « Lecture 9: Augmentation: Range Trees », sur MIT : vidéo d'un cours sur les arbres de portée.