В информатике автономный алгоритм наименьших общих предков Тарьяна — это алгоритм вычисления наименьших общих предков для пар узлов в дереве, основанный на структуре данных union-find . Наименьшим общим предком двух узлов d и e в корневом дереве T является узел g , который является предком как d, так и e и имеет наибольшую глубину в T. Он назван в честь Роберта Тарьяна , который открыл этот метод в 1979 году. Алгоритм Тарьяна — это автономный алгоритм; то есть, в отличие от других алгоритмов наименьшего общего предка, он требует, чтобы все пары узлов, для которых требуется наименьший общий предок, были указаны заранее. Простейшая версия алгоритма использует структуру данных union-find, которая в отличие от других структур данных наименьшего общего предка может занимать больше постоянного времени на операцию, когда количество пар узлов аналогично по величине количеству узлов. Более позднее уточнение Габова и Тарьяна (1983) ускоряет алгоритм до линейного времени .
Псевдокод ниже определяет наименьшего общего предка каждой пары в P , учитывая корень r дерева, в котором дети узла n находятся в наборе n.children . Для этого автономного алгоритма набор P должен быть указан заранее. Он использует функции MakeSet , Find и Union структуры данных непересекающихся множеств . MakeSet(u) удаляет u в одноэлементный набор, Find(u) возвращает стандартного представителя набора, содержащего u , а Union(u,v) объединяет набор, содержащий u , с набором, содержащим v . TarjanOLCA( r ) сначала вызывается для корня r .
Функция TarjanOLCA(u) — это MakeSet(u) u.предок := u для каждого v в u.дети делают TarjanOLCA(v) Союз(у, г) Найти(u).ancestor := u u.color := черный для каждого v такого, что {u, v} в P, сделать , если v.color == black , то распечатать "Наименьший общий предок Тарьяна" + u + " а " + v + " это " + Find(v).ancestor + "."
Каждый узел изначально белый и окрашивается в черный цвет после того, как он и все его дочерние узлы будут посещены.
Для каждой пары узлов {u,v}, подлежащей исследованию:
Для справки, вот оптимизированные версии MakeSet , Find и Union для леса непересекающихся множеств :
Функция MakeSet(x) — это x.родитель := x x.ранг := 1 Функция Union(x, y) — это xRoot := Найти(x) yRoot := Найти(y) если xRoot.rank > yRoot.rank тогда yRoot.parent := xRoot иначе если xRoot.rank < yRoot.rank тогда xRoot.parent := yRoot иначе если xRoot.rank == yRoot.rank тогда yRoot.parent := xRoot xRoot.rank := xRoot.rank + 1 функция Find(x) — если x.parent != x тогда x.parent := Найти(x.parent) вернуть x.parent