Изменения

Перейти к: навигация, поиск

Алгоритм Шибера-Вишкина

1276 байт убрано, 21:25, 23 июня 2012
Обработка запроса
}}
Найдем вершину <tex>\operatorname{inlabel} z</tex>, где <tex>z = LCA(x, y)</tex>. На прошлом шаге была найдена вершина
<tex>LCA(\operatorname{inlabel} x, \operatorname{inlabel} y)</tex>. Если бы в двоичном дереве были представлены все вершины,
то это и было бы ответом. Но такой вершины может не оказаться. Воспользуемся значениями <tex>\operatorname{ascendant} \operatorname{inlabel} x</tex> и <tex>\operatorname{ascendant} \operatorname{inlabel} y</tex>. Они характеризуют пути
из вершин <tex>\operatorname{inlabel} x</tex> и <tex>\operatorname{inlabel} x</tex> к корню. С их помощью (с помощью
операции ''логическое и''), можно получить список вершин, через которые проходят оба эти пути и взять с пересечения
самую низкую посещаемую обоими.
 
Для этого можно воспользоваться описанным при построении методом для нахождения <tex>\operatorname{inlabel} v</tex>.
После этих действий нами был получен путь, в котором находится ответ. Осталось посмотреть на точки входа
<tex>x</tex> и <tex>y</tex> на путь <tex>\operatorname{inlabel} LCA(x, y)</tex>.
Это можно сделать с помощью посчитанной функции <tex>\operatorname{head}</tex>: найти <tex>\operatorname{head} v'</tex>, где <tex>v'</tex> {{---}} вершина предпоследнего пути в пути. Тогда, поднявшись от нее на один вверх по начальному дереву, получим искомую точку входа.
Имея две точки входа, можно, как и в первом случае, сравнить их по высоте и выбрать более высокое из них.
Анонимный участник

Навигация