Метод двоичного подъёма — различия между версиями
Строка 6: | Строка 6: | ||
Препроцессинг заключается в том, чтобы посчитать функцию: <tex> dp[v][i] </tex> - это номер вершины, в которую мы придем если пройдем из вершины <tex> v </tex> вверх по подвешенному дереву <tex> 2 ^ i </tex> шагов, причем если мы пришли в корень, то мы там и останемся. | Препроцессинг заключается в том, чтобы посчитать функцию: <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> p[v] </tex> и глубину вершины в подвешенном дереве <tex> depth[v] </tex>. Если <tex> v </tex> - корень, то <tex> p[v] = v </tex>. Тогда для функции <tex> dp </tex> есть рекуррентная формула: | ||
+ | |||
<tex>dp[v][i]= \begin{cases} | <tex>dp[v][i]= \begin{cases} | ||
p[v] & i = 0,\\ | p[v] & i = 0,\\ |
Версия 06:45, 7 мая 2011
Эта статья находится в разработке!
Метод двоичного подъема - это один из самых простых методов для решения задачи LCA в on-line и он не использует метод решение задачи RMQ. Он основан на методе динамического программирования.
Описание алгоритма
Как и все on-line алгоритмы, этот метод делает сначала препроцессинг, чтобы потом отвечать на запросы.
Препроцессинг
Препроцессинг заключается в том, чтобы посчитать функцию:
- это номер вершины, в которую мы придем если пройдем из вершины вверх по подвешенному дереву шагов, причем если мы пришли в корень, то мы там и останемся. Для этого сначала обойдем дерево в глубину и для каждой вершины запишем номер ее родителя и глубину вершины в подвешенном дереве . Если - корень, то . Тогда для функции есть рекуррентная формула:
Для того чтобы отвечать на запросы нам нужны будут только те значения
, где , ведь при больших значение будет номером корня.