Изменения

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

Метод двоичного подъёма

1548 байт добавлено, 06:44, 7 мая 2011
Нет описания правки
{{В разработке}}
Метод двоичного подъема - это один из самых простых методов для решения задачи LCA в on-line и он не использует метод решение задачи RMQ. Он основан на методе динамического программирования.
==Описание алгоритма==
Как и все on-line алгоритмы, этот метод делает сначала препроцессинг, чтобы потом отвечать на запросы.
===Препроцессинг===
Препроцессинг заключается в том, чтобы посчитать функцию: <tex> dp[v][i] </tex> - это номер вершины, в которую мы придем если пройдем из вершины <tex> v </tex> вверх по подвешенному дереву <tex> 2 ^ i </tex> шагов, причем если мы пришли в корень, то мы там и останемся.
Для этого сначала обойдем дерево в глубину и для каждой вершины запишем номер ее родителя <tex> p[v] </tex> и глубину вершины в подвешенном дереве <tex> depth[v] </tex>. Если <tex> v </tex> - корень, то <tex> p[v] = v </tex>. Тогда для функции <tex> dp </tex> есть рекуррентная формула:
<tex>dp[v][i]= \begin{cases}
p[v] & i = 0,\\
dp[dp[v][i - 1]][i - 1] & i > 0.
\end{cases}</tex>
Для того чтобы отвечать на запросы нам нужны будут только те значения <tex> dp[v][i] </tex>, где <tex> i \le \log_2{n} </tex>, ведь при больших <tex> i </tex> значение <tex> dp[v][i] </tex> будет номером корня. ==Описание алгоритма=Ответы на запросы===Метод двоичного подъема - это один из самых простых методов для решения задачи LCA в on-line и он не использует метод решение задачи RMQ. Он основан на методе динамического программирования.
Анонимный участник

Навигация