Алгоритм Шибера-Вишкина — различия между версиями
(→Подготовка) |
(→Подготовка) |
||
Строка 32: | Строка 32: | ||
|statement=В качестве <tex>\operatorname{inlabel} v</tex> можно выбрать <tex>\operatorname{order} u</tex>, кратное максимальной степени двойки, где <tex>u \in S(v)</tex>. | |statement=В качестве <tex>\operatorname{inlabel} v</tex> можно выбрать <tex>\operatorname{order} u</tex>, кратное максимальной степени двойки, где <tex>u \in S(v)</tex>. | ||
|proof= | |proof= | ||
− | Пусть <tex>\operatorname{ | + | Пусть <tex>\operatorname{inorder} v = \operatorname{order} u = k2^b</tex>, <tex>b</tex> {{---}} максимально. |
Пусть есть вершина <tex>u' \in S(i)</tex> такая, что <tex>\operatorname{order} u' = k'2^b</tex>. | Пусть есть вершина <tex>u' \in S(i)</tex> такая, что <tex>\operatorname{order} u' = k'2^b</tex>. | ||
Так как в отрезке, соответствующем вершине <tex>v</tex> есть два числа, кратных <tex>2^b</tex>, то | Так как в отрезке, соответствующем вершине <tex>v</tex> есть два числа, кратных <tex>2^b</tex>, то | ||
− | там есть и число, кратное <tex>2^{b+1}</tex>. Но тогда <tex>\operatorname{ | + | там есть и число, кратное <tex>2^{b+1}</tex>. Но тогда <tex>\operatorname{inorder} v</tex> выбран неверно. |
Значит, в поддереве <tex>v</tex> есть только одна такая вершина <tex>u</tex>, что <tex>\operatorname{order} u \hdots 2^{max}</tex>. | Значит, в поддереве <tex>v</tex> есть только одна такая вершина <tex>u</tex>, что <tex>\operatorname{order} u \hdots 2^{max}</tex>. | ||
Рассмотрим два случая. | Рассмотрим два случая. | ||
− | ''Первый случай'' <tex>\operatorname{ | + | ''Первый случай'' <tex>\operatorname{inorder} v = \operatorname{order} v</tex> |
Других таких вершин <tex>u'</tex>, что <tex>u'</tex> дает такую же степень двойки, нет. | Других таких вершин <tex>u'</tex>, что <tex>u'</tex> дает такую же степень двойки, нет. | ||
− | Значит, во всех поддеревьях <tex>v</tex> значения <tex>\operatorname{ | + | Значит, во всех поддеревьях <tex>v</tex> значения <tex>\operatorname{inorder}</tex> отличаются |
− | от <tex>\operatorname{ | + | от <tex>\operatorname{inorder} v</tex>. |
− | ''Второй случай'' <tex>\operatorname{ | + | ''Второй случай'' <tex>\operatorname{inorder} v = \operatorname{order} u</tex>, <tex>u \in S(v), u \ne v</tex> |
− | Так как в поддереве <tex>v</tex> представлены все <tex>\operatorname{order}</tex>-ы из отрезка <tex>[\operatorname{order} v; \operatorname{order} v + \operatorname{size} v - 1]</tex>, то рассмотрим того потомка <tex>w</tex> вершины <tex>v</tex>, что <tex>u \in S(w)</tex>. Тогда, так как степень двойки у <tex>u</tex> максимальна, по утверждению в начале доказательства, других вершин с такой же степенью двойки нет, то <tex>\operatorname{ | + | Так как в поддереве <tex>v</tex> представлены все <tex>\operatorname{order}</tex>-ы из отрезка <tex>[\operatorname{order} v; \operatorname{order} v + \operatorname{size} v - 1]</tex>, то рассмотрим того потомка <tex>w</tex> вершины <tex>v</tex>, что <tex>u \in S(w)</tex>. Тогда, так как степень двойки у <tex>u</tex> максимальна, по утверждению в начале доказательства, других вершин с такой же степенью двойки нет, то <tex>\operatorname{inorder} w = \operatorname{inorder} v = \operatorname{order} u</tex>. Так как отрезки, соответствующие поддеревьям сыновей, не пересекаются, не найдется другого <tex>w'</tex> {{---}} потомок <tex>v</tex>, что в поддереве <tex>w'</tex> есть вершина с такой же степенью двойки. Значит, все вершины <tex>v'</tex>, у которых <tex>\operatorname{inorder} v' = \operatorname{inorder} v</tex> находятся в поддереве <tex>w</tex>. Проведя аналогичное доказательство для <tex>w</tex>, получим требуемое. |
}} | }} | ||
==Обработка запроса== | ==Обработка запроса== | ||
Пусть <tex>x</tex>, <tex>y</tex> {{---}} вершины в исходном дереве <tex>LCA</tex> которых необходимо найти. Если <tex>\operatorname{inlabel} x = \operatorname{inlabel} y</tex>, то они принадлежат одному простому пути, а следовательно ответом на запрос является <tex>x</tex>, если <tex>\operatorname{inlabel} x \le \operatorname{inlabel} y</tex>, и <tex>y</tex>, в противном случае. Теперь рассмотрим случай, когда <tex>\operatorname{inlabel} x \ne \operatorname{inlabel} y</tex>, то есть <tex>x</tex> и <tex>y</tex> принадлежат разным простым путям. | Пусть <tex>x</tex>, <tex>y</tex> {{---}} вершины в исходном дереве <tex>LCA</tex> которых необходимо найти. Если <tex>\operatorname{inlabel} x = \operatorname{inlabel} y</tex>, то они принадлежат одному простому пути, а следовательно ответом на запрос является <tex>x</tex>, если <tex>\operatorname{inlabel} x \le \operatorname{inlabel} y</tex>, и <tex>y</tex>, в противном случае. Теперь рассмотрим случай, когда <tex>\operatorname{inlabel} x \ne \operatorname{inlabel} y</tex>, то есть <tex>x</tex> и <tex>y</tex> принадлежат разным простым путям. |
Версия 17:49, 21 июня 2012
Алгоритм Шибера-Вишкина применяется для нахождения наименьшего общего предка двух вершин в дереве. Он использует
времени на подготовку и затем отвечает на каждый запрос за .Идея алгоритма
Основная идея алгоритма следующая.
- Если бы дерево, в котором нужно искать было бы цепочкой, можно было бы найти просто взяв ту вершину, которая находится в дереве выше.
- Если дерево — полное двоичное дерево высоты , то можно сопоставить каждой вершине битовый вектор длиной (целое число от до ) и с помощью битовых операций над этими векторами найти
Тогда, представив данное дерево как полное двоичное дерево, в каждой вершине которого находится цепочка, можно научиться искать
в нем за .Подготовка
Перенумеруем вершины в порядке префиксного обхода дерева: сначала обходится текущая вершина, затем — поддеревья. Пусть
— такой порядок обхода.Обозначим за
количество вершин в поддереве вершины . Здесь и далее считаем, что вершина является и своим предком, и своим потомком.Утверждение: |
Пусть — вершина из поддерева . Тогда
|
По определению , вершин из поддерева образуют отрезок натуральных чисел длиной . Так как этот отрезок начинается с , то — отрезок . |
Покроем дерево путями. А именно, сопоставим каждой вершине
число такое, что прообраз каждого в связен и является простым путем от какой-то вершины вниз до листа.Утверждение: |
В качестве можно выбрать , кратное максимальной степени двойки, где . |
Пусть , — максимально. Пусть есть вершина такая, что . Так как в отрезке, соответствующем вершине есть два числа, кратных , то там есть и число, кратное . Но тогда выбран неверно. Значит, в поддереве есть только одна такая вершина , что .Рассмотрим два случая. Первый случай Других таких вершин , что дает такую же степень двойки, нет. Значит, во всех поддеревьях значения отличаются от .Второй случай Так как в поддереве , представлены все -ы из отрезка , то рассмотрим того потомка вершины , что . Тогда, так как степень двойки у максимальна, по утверждению в начале доказательства, других вершин с такой же степенью двойки нет, то . Так как отрезки, соответствующие поддеревьям сыновей, не пересекаются, не найдется другого — потомок , что в поддереве есть вершина с такой же степенью двойки. Значит, все вершины , у которых находятся в поддереве . Проведя аналогичное доказательство для , получим требуемое. |
Обработка запроса
Пусть
, — вершины в исходном дереве которых необходимо найти. Если , то они принадлежат одному простому пути, а следовательно ответом на запрос является , если , и , в противном случае. Теперь рассмотрим случай, когда , то есть и принадлежат разным простым путям.