Реализация запроса в дереве отрезков снизу
Содержание
Описание
Реализация запроса снизу вверх в дереве отрезков является, в отличие от реализации сверху вниз, итеративным методом.
Алгоритм
Будем рассматривать дерево отрезков с операцией нахождения минимального значения на отрезке(RMQ).
Установим границы отрезка на соответствующие листья. Если элемент попавший на левую границу является правым сыном, то отрезаем его и аналогично рассматриваем элемент попавший на правую границу (является ли этот элемент левым сыном). Затем поднимаемся к родителям элементов, попавших на новые границы. Отрезая элемент, мы считаем минимум из отрезанного и минимума на оставшемся отрезке. Закончим алгоритм, когда границы пересекутся.
Псевдокод
Псевдокод функции нахождения минимума на отрезке .
segmentMin(left, right)
res = MAX_INT;
while left < right
if left == <правый сын>
res = min(result, data[left]);
left = parent(left + 1);
else
left = parent(left);
if right == <левый сын>
result = min(result, data[right]);
right = parent(right - 1);
else
right = parent(right);
if left == right
result = min(result, data[left]);
return result;
Функция возвращает родителя аргумента.