Algorithme de Rémy

Page d’aide sur l’homonymie

Pour les articles homonymes, voir Rémy (homonymie).

L'algorithme de Rémy est un générateur d'arbres binaires, dont la principale application est un algorithme efficace de génération aléatoire d'arbres binaires.

L'algorithme doit son nom à son inventeur Jean-Luc Rémy.

Histoire

L'algorithme de Rémy est dû à Jean-Luc Rémy, chercheur au Centre de recherche en informatique de Nancy. Il a été créé en 1978 sans être publié immédiatement[1] et a fait partie du folklore de l'algorithmique et de la combinatoire énumérative[2] jusqu'à sa parution dans une revue francophone en 1985[3].

Description de l'algorithme

Les arbres binaires sont dénombrés par les nombres de Catalan C n {\displaystyle C_{n}} donnés par les formules de récurrence :

C 0 = 1 {\displaystyle C_{0}=1}
C n + 1 = i = 0 n C i C n i {\displaystyle C_{n+1}=\sum _{i=0}^{n}C_{i}C_{n-i}} .

Mais ces formules ne permettent pas de dériver un algorithme efficace de génération aléatoire.

L'idée de Rémy consiste à non plus compter les arbres binaires à n {\displaystyle n} nœuds, mais les arbres binaires décorés à n {\displaystyle n} nœuds, à savoir les arbres dont les feuilles ont été décorées par les nombres de 0 {\displaystyle 0} à n {\displaystyle n} dans un ordonnancement quelconque. Il y a ( n + 1 ) ! {\displaystyle (n+1)!} manières de décorer un arbre binaire, par conséquent, le nombre d'arbres binaires à n {\displaystyle n} nœuds internes est

D n = ( n + 1 ) ! C n = ( 2 n ) ! n ! = 2 ( 2 n 1 ) D n 1 . {\displaystyle D_{n}=(n+1)!C_{n}={\frac {(2n)!}{n!}}=2(2n-1)D_{n-1}.}

Comme le note Knuth, Olinde Rodrigues avait déjà démontré cette formule, en 1838, dans un article du Journal de Liouville[4]. On note au passage que cela correspond à la récurrence linéaire sur les nombres de Catalan :

C n = 2 ( 2 n 1 ) n + 1 C n 1 {\displaystyle C_{n}={\frac {2(2n-1)}{n+1}}C_{n-1}} .

Rémy a remarqué qu'il y a 2 ( 2 n 1 ) {\displaystyle 2(2n-1)} moyens de construire un arbre décoré de taille n {\displaystyle n} à partir d'un arbre décoré de taille n 1 {\displaystyle n-1} . On choisit un nœud interne ou externe (une feuille) dans cet arbre, appelons le x {\displaystyle x} . Comme il y a n 1 {\displaystyle n-1} nœuds internes et n {\displaystyle n} feuilles, il y a 2 n 1 {\displaystyle 2n-1} choix possibles de x {\displaystyle x} . On insère alors un nouveau nœud interne {\displaystyle \bullet } et une nouvelle feuille décorée par n {\displaystyle n} , dont elle est la fille droite ou la fille gauche, tandis que x {\displaystyle x} en est alors le fils gauche ou le fils droit, comme cela est illustré dans les dessins ci-dessous.

  • '"`UNIQ--postMath-00000017-QINU`"' à gauche
    x {\displaystyle x} à gauche
  • '"`UNIQ--postMath-00000018-QINU`"' à droite
    x {\displaystyle x} à droite

La suite d'arbres ci-dessus illustre des insertions de nœuds conduisant à la construction d'un arbre binaire de taille 6 {\displaystyle 6} .

Une suite d'arbres décorés illustrant l'algorithme de Rémy
Une suite d'arbres décorés illustrant l'algorithme de Rémy

On voit que ce processus est unique ; en effet, l'insertion peut être inversée par la coupe de la feuille de plus grand numéro. En conséquence, la construction de Rémy produit aléatoirement des arbres décorés de façon uniforme. Il suffit d'oublier les feuilles pour obtenir une génération aléatoire des arbres ordinaires (donc non décorés).

Implémentation efficace

Pour engendrer aléatoirement un arbre de taille n {\displaystyle n} , on peut écrire un algorithme efficace qui utilise un tableau de taille 2 n + 1 {\displaystyle 2n+1} et qui fait n 1 {\displaystyle n-1} tirages aléatoires dans des intervalles d'entiers, de taille respectivement, 2 {\displaystyle 2} jusqu'à n {\displaystyle n} , d'où une complexité linéaire de l'algorithme en nombre de tirage uniforme dans un intervalle discret. Il est possible d'améliorer cet algorithme et d'atteindre un algorithme optimal en nombre de bits aléatoires utilisés[5].

Extensions

L'algorithme de Rémy est à l'origine de plusieurs échantillonneurs aléatoires efficaces d'arbres non binaires comptés par des nombres qui sont solutions d'équations holonomes (en)[5], notamment d'échantillonneurs aléatoires pour les arbres unaires-binaires[5] ou les arbres de Schröder[2] qui sont en bijection avec les arbres planaires[6].

Références

  1. Jean-Luc Remy, « Un procédé itératif de dénombrement d'arbres binaires et son application à leur génération aléatoire », dans Actes des 3e journées de la RCP Complexité, Nice, , aussi Rapport CRIN n°80-P-053 (1980).
  2. a et b Dominique Foata et Doron Zeilberger, « A Classic Proof of a Recurrence for a Very Classical Sequence », J. Comb. Theory, Ser. A, vol. 80(2),‎ , p. 380-384 (lire en ligne)
  3. Jean-Luc Remy, « Un procédé itératif de dénombrement d'arbres binaires et son application à leur génération aléatoire », ITA, vol. 19(2),‎ , p. 179-195 (lire en ligne)
  4. Olinde Rodrigues, « Sur le nombre de moyens d'effectuer un produit de n facteurs », Journal de mathématiques pures et appliquées, vol. 3,‎ , p. 549 (lire en ligne)
  5. a b et c Axel Bacher, Olivier Bodini et Alice Jacquot, « Efficient random sampling of binary and unary-binary trees via holonomic equations », Theor. Comput. Sci., vol. 695,‎ , p. 42-53.
  6. Pierre Lescanne, « Holonomic equations and efficient random generation of binary trees », DMTCS, vol. 25, no 2,‎ (lire en ligne).

Bibliographie

  • Jean-Luc Remy, « Un procédé itératif de dénombrement d'arbres binaires et son application à leur génération aléatoire », ITA, vol. 19(2),‎ , p. 179-195 (lire en ligne)
  • Donald E. Knuth, The Art of Computer Programming, vol. 4.4 (Generating all Trees), Addison Wesley, p. 18

Voir aussi

  • icône décorative Portail des mathématiques
  • icône décorative Portail de l'informatique théorique
  • icône décorative Portail de la programmation informatique