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

Материал из Викиконспекты
Версия от 16:56, 21 июня 2012; 217.66.152.132 (обсуждение) (Новая страница: «''Алгоритм Шибера-Вишкина'' применяется для нахождения наименьшего общего предка двух ве...»)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

Алгоритм Шибера-Вишкина применяется для нахождения наименьшего общего предка двух вершин в дереве. Он использует [math]O(n)[/math] времени на подготовку и затем отвечает на каждый запрос за [math]O(1)[/math].

Идея алгоритма

Основная идея алгоритма следующая.

  1. Если бы дерево, в котором нужно искать [math]LCA[/math] было бы цепочкой, можно было бы найти [math]LCA(u, v)[/math] просто взяв ту вершину, которая находится в дереве выше.
  2. Если дерево — полное двоичное дерево высоты [math]h[/math], то можно сопоставить каждой вершине битовый вектор длиной [math]h[/math] (целое число от [math]0[/math] до [math]2^h-1[/math]) и с помощью битовых операций над этими векторами найти [math]LCA(u, v)[/math]

Тогда, представив данное дерево как полное двоичное дерево, в каждой вершине которого находится цепочка, можно научиться искать [math]LCA(v, u)[/math] в нем за [math]O(1)[/math].

Подготовка

Перенумеруем вершины в порядке префиксного обхода дерева: сначала обходится текущая вершина, затем — поддеревья. Пусть [math]\operatorname{order} : V \to \mathbb{N}[/math] — такой порядок обхода.

Обозначим за [math]\operatorname{size} v[/math] количество вершин в поддереве вершины [math]v[/math]. Здесь и далее считаем, что вершина является и своим предком, и своим потомком.

Утверждение:
Пусть [math]u[/math] — вершина из поддерева [math]v[/math]. Тогда [math]\operatorname{order} u \in [\operatorname{order} v; \operatorname{order}v + \operatorname{size} v - 1][/math]
[math]\triangleright[/math]

По определению [math]\operatorname{order}[/math], [math]\operatorname{order} u[/math] вершин из поддерева [math]v[/math] образуют отрезок натуральных чисел длиной [math]\operatorname{size} v - 1[/math]. Так как этот отрезок начинается с

[math]\operatorname{order}v + 1[/math], то [math]\operatorname{order} u[/math] — отрезок [math][\operatorname{order} v; \operatorname{order} v + \operatorname{size} v - 1][/math].
[math]\triangleleft[/math]

Покроем дерево путями. А именно, сопоставим каждой вершине [math]v[/math] число [math]\operatorname{chain} v[/math] такое, что прообраз каждого [math]\operatorname{chain} v[/math] в [math]T[/math] связен и является простым путем от какой-то вершины вниз до листа.

Утверждение:
В качестве [math]\operatorname{chain} v[/math] можно выбрать [math]\operatorname{order} u[/math], кратное максимальной степени двойки, где [math]u \in S(v)[/math].
[math]\triangleright[/math]
?
[math]\triangleleft[/math]

Обработка запроса