AccueilđŸ‡«đŸ‡·Chercher

Arbre cartésien

En algorithmique, un arbre cartésien est un arbre binaire construit à partir d'une séquence de nombres. Il est défini[1] comme un tas dont un parcours symétrique de l'arbre renvoie la séquence d'origine.

Une séquence de nombres et l'arbre cartésien qui en dérive.

Description

Introduits par Jean Vuillemin (1980)[2] dans le cadre des structures de donnĂ©es de recherche par plage gĂ©omĂ©trique, les arbres cartĂ©siens ont Ă©galement Ă©tĂ© utilisĂ©s dans la dĂ©finition des arbres-tas et des structures de donnĂ©es d'arbres de recherche binaire randomisĂ©s pour les problĂšmes de recherche dichotomique. L'arbre cartĂ©sien pour une sĂ©quence peut ĂȘtre construit en temps linĂ©aire en utilisant un algorithme basĂ© sur la structure de pile pour trouver toutes les valeurs plus petites les plus proches dans une sĂ©quence.

DĂ©finition

L'arbre cartésien associé à une séquence de nombres distincts est un arbre binaire défini de maniÚre unique par les propriétés suivantes :

  1. L'arbre cartĂ©sien d'une sĂ©quence a un nƓud pour chaque Ă©lĂ©ment de la sĂ©quence, et chaque nƓud est associĂ© Ă  un seul Ă©lĂ©ment.
  2. Un parcours symĂ©trique de l'arbre (c'est-Ă -dire un parcours qui renvoie pour tout nƓud, d'abord le rĂ©sultat du parcours de son fils gauche, puis le nƓud lui-mĂȘme, puis le parcours de son fils droit) de l'arbre donne la sĂ©quence d'origine. En d'autres termes, le sous-arbre gauche se compose des valeurs antĂ©rieures Ă  la racine dans l'ordre de sĂ©quence, tandis que le sous-arbre droit se compose des valeurs postĂ©rieures Ă  la racine, et une contrainte de classement similaire s'applique Ă  chaque nƓud infĂ©rieur de l'arborescence.
  3. L'arbre est un tas binaire : le parent Ă©ventuel de tout nƓud a une valeur plus petite que le nƓud lui-mĂȘme[3].

En accord avec la dĂ©finition d'un tas, la racine de l'arbre doit ĂȘtre le plus petit nombre de la sĂ©quence. Partant de lĂ , on obtient une autre dĂ©finition, rĂ©cursive de l'arbre comme suit : la racine est la valeur minimale de la sĂ©quence, et les sous-arbres gauche et droit sont les arbres cartĂ©siens pour les sous-sĂ©quences Ă  gauche et Ă  droite de la valeur racine. Cette dĂ©finition donne une autre maniĂšre de construire l'arbre Ă  partir de la sĂ©quence.

Si une séquence de nombres contient des répétitions, on peut toujours définir un arbre cartésien associé, mais il faut une rÚgle supplémentaire pour comparer les éléments de valeur égale (on peut par exemple choisir que le premier de deux éléments égaux est traité comme le plus petit des deux) avant d'appliquer les rÚgles ci-dessus.

Un exemple d'arbre cartésien est illustré dans la figure en introduction.

Recherche par plage et ancĂȘtres communs les plus bas

Recherche de distance bidimensionnelle Ă  l'aide d'un arbre cartĂ©sien: le point infĂ©rieur (rouge sur la figure) dans la rĂ©gion marquĂ©e qui Ă  trois cĂŽtĂ©s : deux cĂŽtĂ©s verticaux et un cĂŽtĂ© horizontal (si la rĂ©gion n'est pas vide) peut ĂȘtre trouvĂ© comme l'ancĂȘtre commun le plus proche des points les plus Ă  gauche et Ă  droite (les points bleus sur la figure) Ă  l'intĂ©rieur du carrĂ© dĂ©fini par les limites verticales. Les points restants dans la rĂ©gion Ă  trois cĂŽtĂ©s peuvent ĂȘtre trouvĂ©s en coupant l'arbre par une ligne verticale passant par le point infĂ©rieur et en se reproduisant.

Les arbres cartĂ©siens peuvent ĂȘtre utilisĂ©s comme structure de donnĂ©es efficace pour la recherche d'un Ă©lĂ©ment minimal dans un sous-tableau. Dans un arbre cartĂ©sien, cette valeur minimale est exactement celle du plus petit ancĂȘtre commun des Ă©lĂ©ments les plus Ă  gauche et Ă  droite dans la sous-sĂ©quence que l'on cherche (cela se dĂ©duit des propriĂ©tĂ©s de l'arbre). Par exemple, dans la sous-sĂ©quence (12, 10, 20, 15) de la sĂ©quence montrĂ©e dans la premiĂšre illustration, la valeur minimale de la sous-sĂ©quence (10) est le plus petit ancĂȘtre commun des valeurs extrĂȘmes de la sĂ©quence (12 et 15) dans l'arbre cartĂ©sien. Étant donnĂ© que le plus petit ancĂȘtre commun peut ĂȘtre trouvĂ© en temps constant, en utilisant une structure de donnĂ©es qui prend un espace linĂ©aire Ă  stocker et qui peut ĂȘtre construite en temps linĂ©aire, les mĂȘmes complexitĂ©s temporelles et spatiales s'appliquent au problĂšme de recherche d'un Ă©lĂ©ment minimal de la sous-sĂ©quence.

Bender et Farach Colton (2000)[4] ont considĂ©rĂ© cette relation dans l'autre sens afin de rĂ©soudre le problĂšme de recherche d'un plus petit ancĂȘtre commun en passant par un autre algorithme de recherche de minimum d'une sous-sĂ©quence. Leur structure de donnĂ©es utilise une technique basĂ©e sur des parcours eulĂ©riens pour transformer l'arbre d'entrĂ©e en une sĂ©quence, puis trouve des minima de plage dans la sĂ©quence rĂ©sultante. La sĂ©quence rĂ©sultant de cette transformation a une propriĂ©tĂ© intĂ©ressante (les nombres adjacents dans la sĂ©quence reprĂ©sentent les hauteurs des nƓuds adjacents dans l'arbre et diffĂšrent donc de 1) dont ils profitent dans leur structure de donnĂ©es; pour rĂ©soudre le problĂšme de minimisation de la sous-sĂ©quence pour les sĂ©quences qui n'ont pas cette propriĂ©tĂ©, ils passent par des arbres cartĂ©siens pour transformer le problĂšme de minimisation en un problĂšme de plus petit ancĂȘtre commun, puis appliquent leur algorithme pour avoir un problĂšme sur une sĂ©quence qui a cette bonne propriĂ©tĂ©.

Le mĂȘme problĂšme de minimisation peut Ă©galement ĂȘtre vu diffĂ©remment, comme recherche de points dans un plan. En effet, un ensemble fini de points dans le plan cartĂ©sien peut ĂȘtre transformĂ© en arbre cartĂ©sien : pour ce faire, on ordonne les points par leurs abscisses (pour avoir un unique ordre pour la sĂ©quence) et on considĂšre leurs ordonnĂ©es comme leurs valeurs dans la sĂ©quence. On construit ensuite l'arbre cartĂ©sien associĂ©. Si S est le sous-ensemble des points d'entrĂ©e dans un domaine dĂ©limitĂ© uniquement par ses abscisses : L ≀ X ≀ R, et si on note p le point le plus Ă  gauche de S (donc d'abscisse minimale) et q le point le plus Ă  droite de S (donc d'abscisse maximale), alors le plus petit ancĂȘtre commun de p et q dans l'arbre cartĂ©sien est le point le plus bas de la dalle. On peut Ă©galement chercher Ă  rĂ©pertorier tous les points dans une rĂ©gion dĂ©limitĂ©e par les inĂ©galitĂ©s L ≀ X ≀ R (abscisse) et y ≀ T (ordonnĂ©e), en trouvant ce point le plus bas b, puis en comparant son ordonnĂ©e Ă  T, et (si le point se trouve dans la rĂ©gion Ă  trois cĂŽtĂ©s) en continuant rĂ©cursivement dans le sous-domaine au-dessus de b. De cette maniĂšre, une fois que les points les plus Ă  gauche et Ă  droite de la dalle ont Ă©tĂ© identifiĂ©s, tous les points dans la rĂ©gion Ă  trois cĂŽtĂ©s peuvent ĂȘtre trouvĂ©s en temps linĂ©aire (en le nombre de points).

La recherche de plus petit ancĂȘtre commun dans un arbre cartĂ©sien permet Ă©galement de construire une structure de donnĂ©es en complexitĂ© spatiale linĂ©aire qui permet de trouver les distances entre deux points d'un espace ultramĂ©trique (s'il est fini) en temps constant. La distance Ă  l'intĂ©rieur d'un ultramĂ©trique est la mĂȘme que le poids du trajet minimax dans l'arbre couvrant minimum de l'espace muni de la distance ultramĂ©trique. À partir de l'arbre couvrant minimum, on peut construire un arbre cartĂ©sien, dont le nƓud racine reprĂ©sente l'arĂȘte de poids maximal de l'arbre couvrant minimum. La suppression de cette arĂȘte partitionne l'arbre couvrant en deux sous-arbres, et on peut alors construire rĂ©cursivement l'arbre cartĂ©sien en appliquant la mĂȘme rĂšgle pour les deux sous-arbres, qui donneront les deux fils du premier nƓud . Les feuilles de l'arbre cartĂ©sien reprĂ©sentent des points de l'espace mĂ©trique, et le plus petit ancĂȘtre commun de deux feuilles de l'arbre cartĂ©sien est l'arĂȘte de poids maximal entre ces deux points dans l'arbre couvrant minimum, qui a un poids Ă©gal Ă  la distance entre les deux points par dĂ©finition de la distance ultramĂ©trique. Une fois l'arbre couvrant minimum trouvĂ© et les poids de ses arĂȘtes triĂ©s, l'arbre cartĂ©sien peut ĂȘtre construit en temps linĂ©aire (cependant, il n'est pas unique cette fois).

Treaps

Étant donnĂ© qu'un arbre cartĂ©sien est un arbre binaire, il semble naturel de l'utiliser comme arbre binaire de recherche pour une sĂ©quence ordonnĂ©e de valeurs. Cependant, essayer de construire un arbre cartĂ©sien comme on construit un arbre binaire de recherche ne fonctionne pas bien : l'arbre cartĂ©sien d'une sĂ©quence triĂ©e est en fait un chemin, enracinĂ© Ă  son extrĂ©mitĂ© la plus Ă  gauche, et la recherche binaire dans cet arbre est finalement Ă©quivalente Ă  une recherche sĂ©quentielle naĂŻve de la liste elle-mĂȘme. Cependant, il est possible de gĂ©nĂ©rer des arbres de recherche plus Ă©quilibrĂ©s en imposant des valeurs de prioritĂ© pour chaque Ă©lĂ©ment (diffĂ©rentes des valeurs prĂ©sentes dans la sĂ©quence), qui vont servir Ă  imposer l'ordre des sommets de l'arbre cartĂ©sien. Cette construction se rapproche de celle faite dans le cadre gĂ©omĂ©trique dĂ©crit au dessus, dans lequel les abscisses d'un ensemble de points sont les clĂ©s de recherche et les ordonnĂ©es sont les prioritĂ©s.

Cette idĂ©e a Ă©tĂ© appliquĂ©e par Seidel et Aragon (1996)[5], qui ont suggĂ©rĂ© l'utilisation de nombres alĂ©atoires pour les prioritĂ©s. La structure de donnĂ©es rĂ©sultant de ce choix alĂ©atoire est appelĂ©e « treap » (ou parfois « arbre-tas » en français), car il combine arbre binaire de recherche (tree en anglais) et propriĂ©tĂ© des tas (heap en anglais). On effectue gĂ©nĂ©ralement l'insertion dans un treap en ajoutant la nouvelle clĂ© en tant que feuille d'un arbre existant, en choisissant une prioritĂ© alĂ©atoire pour celle-ci pour celui-ci, puis en effectuant des opĂ©rations de rotation de l'arbre le long d'un chemin allant du nƓud Ă  la racine de l'arbre afin de bien avoir toutes les propriĂ©tĂ©s du tas; de mĂȘme, pour supprimer un Ă©lĂ©ment, on l'enlĂšve et le remplace par un de ses fils, puis on effectue des rotations le long d'un seul chemin dans l'arbre.

Si les prioritĂ©s de chaque clĂ© sont choisies au hasard (et indĂ©pendamment) au moment oĂč la clĂ© est insĂ©rĂ©e dans l'arbre, l'arbre cartĂ©sien rĂ©sultant aura les mĂȘmes propriĂ©tĂ©s qu'un arbre de recherche binaire alĂ©atoire, un arbre calculĂ© en insĂ©rant les clĂ©s dans une permutation choisie au hasard en commençant Ă  partir d'un arbre vide, chaque insertion laissant inchangĂ©e la structure d'arbre prĂ©cĂ©dente et insĂ©rant le nouveau nƓud comme une feuille de l'arbre. Les arbres de recherche binaires alĂ©atoires ont Ă©tĂ© bien plus Ă©tudiĂ©s et sont connus pour avoir de bonnes propriĂ©tĂ©s en tant qu'arbres de recherche (ils ont une profondeur logarithmique avec une probabilitĂ© Ă©levĂ©e); on retrouve cela dans les treaps. Il est Ă©galement possible, comme le suggĂšrent Aragon et Seidel, de redĂ©finir les prioritĂ©s des nƓuds importants ou plus souvent recherchĂ©s afin de les rapprocher de la racine et donc faciliter leur accĂšs (avec une meilleure complexitĂ© temporelle).

Construction efficace

Un arbre cartĂ©sien peut ĂȘtre construit en temps linĂ©aire Ă  partir de sa sĂ©quence d'entrĂ©e. Une mĂ©thode consiste Ă  traiter simplement les valeurs de la sĂ©quence de gauche Ă  droite, de maniĂšre qu'Ă  chaque Ă©tape, l'arbre partiellement construit soit cartĂ©sien. On utilise alors une structure qui permet Ă  la fois de parcourir l'arbre vers le haut et vers le bas. Pour traiter une nouvelle valeur x, on considĂšre le nƓud reprĂ©sentant la valeur avant x dans la sĂ©quence et on suit le chemin entre ce nƓud et la racine de l'arbre jusqu'Ă  trouver une valeur y infĂ©rieure Ă  x . Ce nƓud y devient le parent de x, et le prĂ©cĂ©dent fils droit de y devient le nouvel fils gauche de x . Le temps d'exĂ©cution de cette fonction est linĂ©aire, car le temps de recherche du parent y de chaque nouveau nƓud x est compensĂ© par le nombre de nƓuds qui sont supprimĂ©s du chemin le plus Ă  droite de l'arbre.

Un autre algorithme de construction en temps linĂ©aire est basĂ© sur le problĂšme des plus proches valeurs les plus petites . Dans la sĂ©quence d'entrĂ©e, on peut dĂ©finir le voisin gauche d'une valeur x comme Ă©tant la valeur Ă  gauche de x et plus petite que x la plus proche dans la sĂ©quence. Le voisin droit est dĂ©fini de la mĂȘme maniĂšre. La sĂ©quence des voisins gauches peut ĂȘtre trouvĂ©e par un algorithme utilisant une pile qui contiendra une sous-sĂ©quence de la sĂ©quence d'entrĂ©e. Pour chaque nouvelle valeur x, la pile est dĂ©pilĂ©e jusqu'Ă  ce qu'elle soit vide ou que son premier Ă©lĂ©ment soit plus petit que x, puis on empile x. Le voisin gauche de x est l'Ă©lĂ©ment supĂ©rieur au moment oĂč x est empilĂ©, la pile est donc exactement la sĂ©quence des voisins gauches successifs. Les voisins droits peuvent ĂȘtre trouvĂ©s en appliquant le mĂȘme algorithme de pile Ă  la sĂ©quence renversĂ©e (ou en partant de l'autre cĂŽtĂ© de la pile). Le parent de x dans l'arbre cartĂ©sien est le plus grand entre le voisin gauche de x et le voisin droit de x, si au moins un existe (sinon x est la racine). Les voisins gauche et droit peuvent Ă©galement ĂȘtre construits efficacement par des algorithmes parallĂšles. Cette formulation peut donc ĂȘtre utilisĂ©e pour dĂ©velopper des algorithmes parallĂšles efficaces pour la construction d'arbres cartĂ©siens.

Un autre algorithme en temps linĂ©aire pour la construction d'arbres cartĂ©siens est basĂ© sur une mĂ©thode "diviser pour rĂ©gner". Ici, l'algorithme construit rĂ©cursivement l'arbre sur chaque moitiĂ© de la sĂ©quence d'entrĂ©e, puis fusionne les deux arbres en rĂ©alisant une opĂ©ration de fusion classique. L'algorithme est Ă©galement parallĂ©lisable car Ă  chaque niveau de rĂ©cursivitĂ©, chacun des deux sous-problĂšmes peut ĂȘtre calculĂ© en parallĂšle, et l'opĂ©ration de fusion peut Ă©galement ĂȘtre efficacement parallĂ©lisĂ©e[6].

Paires de valeurs consĂ©cutives de la sĂ©quence (reprĂ©sentĂ©es par les bords rouges Ă©pais) qui encadrent une valeur de sĂ©quence x (le point bleu foncĂ©). Le coĂ»t d'inclusion de x dans l'ordre de tri produit par l'algorithme de Levcopoulos – Petersson est proportionnel au logarithme de ce nombre de paires de parenthĂšses.

Levcopoulos et Petersson (1989)[7] ont dĂ©crit un algorithme de tri basĂ© sur des arbres cartĂ©siens. L'algorithme original utilise un arbre avec le maximum Ă  la racine, mais il peut ĂȘtre facilement modifiĂ© pour prendre en entrĂ©e un arbre cartĂ©sien avec la valeur minimale Ă  la racine. Par souci de cohĂ©rence, c'est donc cette version adaptĂ©e de l'algorithme qui est dĂ©crite ci-dessous.

L'algorithme de Levcopoulos-Petersson peut ĂȘtre considĂ©rĂ© comme une version du tri par sĂ©lection ou du tri par tas qui utilise une file de prioritĂ© des valeurs minimales possibles et qui Ă  chaque Ă©tape trouve et supprime la valeur minimale dans cette file d'attente, tout en l'ajoutant Ă  la fin d'une sĂ©quence de sortie (la sĂ©quence triĂ©e). Dans cet algorithme, la file de prioritĂ© se compose uniquement d'Ă©lĂ©ments dont le parent dans l'arbre cartĂ©sien a dĂ©jĂ  Ă©tĂ© trouvĂ© et supprimĂ©. Ainsi, l'algorithme comprend les Ă©tapes suivantes :

  1. Construire un arbre cartésien pour la séquence d'entrée
  2. Initialiser une file d'attente prioritaire, contenant initialement uniquement la racine de l'arborescence
  3. Alors que la file d'attente prioritaire n'est pas vide :
    • Rechercher et supprimer la valeur minimale x dans la file d'attente prioritaire
    • Ajouter x Ă  la sĂ©quence de sortie
    • Ajouter les fils du noeud x Ă  la file de prioritĂ©

Comme le montrent Levcopoulos et Petersson, la taille de la file d'attente prioritaire restera petite pour les sĂ©quences d'entrĂ©e qui sont dĂ©jĂ  presque triĂ©es. Cette mĂ©thode Ă  donc l'avantage d'ĂȘtre rapide lorsqu'il n'y a plus beaucoup d'Ă©changes Ă  faire. Plus prĂ©cisĂ©ment, le temps d'exĂ©cution le plus dĂ©favorable de cet algorithme est O ( n log k ), oĂč k est la moyenne, sur toutes les valeurs x de la sĂ©quence, du nombre de paires de valeurs consĂ©cutives de la sĂ©quence qui encadrent x . Ils montrent Ă©galement l'existence d'une borne infĂ©rieure de complexitĂ© : pour tout n et k = ω (1), tout algorithme de tri par comparaison doit utiliser Ω ( n log k ) comparaisons dans les pires cas.

Histoire

Les arbres cartĂ©siens ont Ă©tĂ© introduits et nommĂ©s par Jean Vuillemin (1980). Le nom est dĂ©rivĂ© du systĂšme de coordonnĂ©es cartĂ©siennes utilisĂ© pour repĂ©rer des points du plan : Vuillemin les a initialement dĂ©finis comme dans la partie sur la recherche bidimensionnelle de points, avec donc un arbre cartĂ©sien pour un ensemble de points du plan, triĂ©s par abscisses ayant la propriĂ©tĂ© des tas pour les ordonnĂ©es des points. Gabow, Bentley, Tarjan (1984)[8] et les auteurs suivants ont ensuite choisi la dĂ©finition d'un arbre cartĂ©sien Ă  partir d'une sĂ©quence; c'est en fait une gĂ©nĂ©ralisation de la dĂ©finition donnĂ©e par Vuillemin pour permettre ses applications Ă  des sĂ©quences quelconques et des problĂšmes non gĂ©omĂ©triques. Dans certaines rĂ©fĂ©rences, l'ordre est renversĂ©, ce qui signifie que le parent d'un nƓud a toujours une valeur plus grande que ce nƓud.

Notes et références

  1. D'autres définitions équivalentes sont données plus loin.
  2. Jean Vuillemin, « A unifying look at data structures », Communications of the ACM, vol. 23, no 4,‎ , p. 229–239 (ISSN 0001-0782, DOI 10.1145/358841.358852, lire en ligne, consultĂ© le ).
  3. Pour certains auteurs, le parent d'un nƓud est toujours plus grand. Ainsi, la racine est la plus grande valeur.
  4. Bender et Farach-Colton (2000).
  5. Seidel et Aragon (1996).
  6. Shun et Blelloch (2014).
  7. Levcopoulos et Petersson (1989).
  8. Gabow, Bentley et Tarjan (1984).

Bibliographie

  • Michael A. Bender et Martin Farach-Colton, « The LCA problem revisited », Proceedings of the 4th Latin American Symposium on Theoretical Informatics, Springer-Verlag, Lecture Notes in Computer Science (1776),‎ , p. 88–94 (lire en ligne).
  • Omer Berkman, Baruch Schieber et Uzi Vishkin, « Optimal doubly logarithmic parallel algorithms based on finding all nearest smaller values », Journal of Algorithms, vol. 14, no 3,‎ , p. 344–370 (DOI 10.1006/jagm.1993.101).
  • Maxime Crochemore et LuĂ­s M.S. Russo, « Cartesian and Lyndon trees », Theoretical Computer Science, vol. 806,‎ , p. 1–9 (DOI 10.1016/j.tcs.2018.08.011)
  • Erik D. Demaine, Gad M. Landau et Oren Weimann, « On Cartesian trees and range minimum queries », Automata, Languages and Programming, 36th International Colloquium, ICALP 2009, Rhodes, Greece, July 5-12, 2009, Springer-Verlag, Lecture Notes in Computer Science (5555),‎ , p. 341–353 (ISBN 978-3-642-02926-4, DOI 10.1007/978-3-642-02927-1_29).
  • Johannes Fischer et Volker Heun, « Theoretical and Practical Improvements on the RMQ-Problem, with Applications to LCA and LCE », Springer-Verlag Lecture Notes in Computer Science (4009),‎ , p. 36–48 (ISBN 978-3-540-35455-0, DOI 10.1007/11780441_5)
  • Johannes Fischer et Volker Heun, « A New Succinct Representation of RMQ-Information and Improvements in the Enhanced Suffix Array », Springer-Verlag, Lecture Notes in Computer Science (4614),‎ , p. 459–470 (ISBN 978-3-540-74449-8, DOI 10.1007/978-3-540-74450-4_41)
  • Harold N. Gabow, Jon Louis Bentley et Robert E. Tarjan, « Scaling and related techniques for geometry problems », STOC '84: Proc. 16th ACM Symp. Theory of Computing, New York, NY, USA, ACM,‎ , p. 135–143 (ISBN 0-89791-133-4, DOI 10.1145/800057.808675).
  • Dov Harel et Robert E. Tarjan, « Fast algorithms for finding nearest common ancestors », SIAM Journal on Computing, vol. 13, no 2,‎ , p. 338–355 (DOI 10.1137/0213024).
  • T. C. Hu, « The maximum capacity route problem », Operations Research, vol. 9, no 6,‎ , p. 898–900 (DOI 10.1287/opre.9.6.898, JSTOR 167055).
  • Bruno Leclerc, « Description combinatoire des ultramĂ©triques », Centre de MathĂ©matique Sociale. École Pratique des Hautes Études. MathĂ©matiques et Sciences Humaines, no 73,‎ , p. 5–37, 127 (MR 623034).
  • Christos Levcopoulos et Ola Petersson, « Heapsort - Adapted for Presorted Files », WADS '89: Proceedings of the Workshop on Algorithms and Data Structures, Springer-Verlag, Lecture Notes in Computer Science (382),‎ , p. 499–509 (DOI 10.1007/3-540-51542-9_41).
  • Raimund Seidel et Cecilia R. Aragon, « Randomized Search Trees », Algorithmica, vol. 16, nos 4/5,‎ , p. 464–497 (DOI 10.1007/s004539900061, lire en ligne).
  • Baruch Schieber et Uzi Vishkin, « On finding lowest common ancestors: simplification and parallelization », SIAM Journal on Computing, vol. 17, no 6,‎ , p. 1253–1262 (DOI 10.1137/0217079).
  • Julian Shun et Guy E. Blelloch, « A Simple Parallel Cartesian Tree Algorithm and its Application to Parallel Suffix Tree Construction », ACM Transactions on Parallel Computing, vol. 1,‎ , p. 1–20 (DOI 10.1145/2661653).
  • Jean Vuillemin, « A unifying look at data structures », Communications of the ACM, New York, NY, USA, ACM, vol. 23, no 4,‎ , p. 229–239 (DOI 10.1145/358841.358852).
Cet article est issu de wikipedia. Text licence: CC BY-SA 4.0, Des conditions supplĂ©mentaires peuvent s’appliquer aux fichiers multimĂ©dias.