Plus petit ancêtre communEn théorie des graphes, le plus petit ancêtre commun de deux nœuds d'un arbre est le nœud le plus bas dans l'arbre (le plus profond) ayant ces deux nœuds pour descendants. Le terme en anglais est Lowest Common Ancestor (LCA). Les expressions premier ancêtre commun et plus proche ancêtre commun sont aussi utilisées. Divers algorithmes ont été inventés pour trouver rapidement le plus petit ancêtre commun[1]. DéfinitionÉtant donné un arbre, les ancêtres communs de deux nœuds, sont les sommets qui sont ancêtres de ces deux nœuds ; autrement dit ce sont les nœuds qui ont ces deux nœuds dans leurs descendances. Le plus petit ancêtre commun (PPAC) à ces deux nœuds est l'ancêtre commun le plus profond, c'est-à-dire le plus éloigné de la racine[2]. On peut aussi définir une notion de plus petits ancêtres communs dans un graphe orienté acyclique (DAG). AlgorithmesDéfinition et algorithme simpleLa plupart des algorithmes qui ont été étudiés pour trouver le PPAC dans un arbre, ont été créés pour répondre à des requêtes pour des couples de nœuds. Ces algorithmes sont donc en deux phases : un preprocessing et un algorithme pour répondre aux requêtes (queries). Un algorithme simple est de créer une table contenant tous les PPACs, puis de piocher dans ce tableau à chaque requête. Cet algorithme a une complexité en temps de O(n²) (où n est la taille de l'arbre) pour le preproccesing (si l'on utilise la programmation dynamique), et les requêtes sont traitées en temps constant[3]. Algorithmes rapidesDe nombreux algorithmes optimaux ont été proposés pour résoudre le problème PPAC. Ces algorithmes sont optimaux en ordre de grandeur, car ils ont une complexité linaire pour le preproccesing et un temps de requête constant. Certains algorithmes utilisent des structures de données adaptées pour décomposer l'arbre en chemin, alors que d'autres se basent sur un parcours eulérien de l'arbre, et le calcul de range minimum query (en) (parfois appelé minimum d'intervalle[4]). VariantesDes algorithmes ont été inventés pour des cas plus généraux, par exemple pour les DAG[5] et pour des modèles plus dynamiques avec ajouts et retraits de nœuds[6]. ApplicationsLe plus petit ancêtre commun est un objet utilisé notamment en algorithmique du texte et en bio-informatique où de nombreux objets peuvent être représentés par des arbres[7]. Un exemple important est la manipulation des arbres des suffixes, qui permettent de résoudre rapidement certains problèmes comme la recherche de la plus longue sous-chaîne commune[8]. HistoriqueLe problème qui consiste à trouver le PPAC a été défini la première fois[7] par Aho, Hopcroft et Ullman en 1973[9]. Le premier algorithme optimal est dû à Harel et Tarjan[10], il a ensuite été simplifié par Tarjan et Gabow grâce à la structure Union-Find[11],[12], puis encore simplifié en 1988[13]. En 1993, Berkman et Vishkin ont publié un algorithme sur un principe complètement différent[14], simplifié en 2000[3]. Notes et références
|