Реализация запроса в дереве отрезков снизу — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Псевдокод)
(Псевдокод)
Строка 13: Строка 13:
 
       while left < right
 
       while left < right
 
         if isRightSon(left)
 
         if isRightSon(left)
             res = min(result, data[left]);
+
             res = min(res, data[left]);
 
             left = parent(left + 1);
 
             left = parent(left + 1);
 
         else
 
         else
 
             left = parent(left);
 
             left = parent(left);
 
         if isLeftSon(right)
 
         if isLeftSon(right)
             result = min(result, data[right]);
+
             res = min(res, data[right]);
 
             right = parent(right - 1);
 
             right = parent(right - 1);
 
         else
 
         else
 
             right = parent(right);
 
             right = parent(right);
 
         if left == right
 
         if left == right
             result = min(result, data[left]);
+
             res = min(res, data[left]);
         return result;
+
         return res;
  
 
Функция <tex>parent()</tex> возвращает родителя аргумента.<br>
 
Функция <tex>parent()</tex> возвращает родителя аргумента.<br>

Версия 06:18, 18 мая 2011

Описание

Реализация запроса снизу вверх в дереве отрезков является, в отличие от реализации сверху вниз, итеративным методом.

Алгоритм

Реализация запроса снизу вверх

Будем рассматривать дерево отрезков с операцией нахождения минимального значения на отрезке(RMQ).
Установим границы отрезка на соответствующие листья. Если элемент попавший на левую границу является правым сыном, то отрезаем его, левая граница перемещается на один элемент вправо; в другом случае левую границу не трогаем. Аналогично рассматриваем элемент попавший на правую границу (является ли этот элемент левым сыном). Затем устанавливаем границы отрезка на родительские элементы текущих границ. Отрезая элемент, мы считаем минимум из отрезанного и минимума на оставшемся отрезке. Закончим алгоритм, когда границы пересекутся.

Псевдокод

Псевдокод функции нахождения минимума на отрезке [math][left, right][/math].

  segmentMin(left, right)
     res = MAX_INT; 
     while left < right
        if isRightSon(left)
           res = min(res, data[left]);
           left = parent(left + 1);
        else
           left = parent(left);
        if isLeftSon(right)
           res = min(res, data[right]);
           right = parent(right - 1);
        else
           right = parent(right);
        if left == right
           res = min(res, data[left]);
        return res;

Функция [math]parent()[/math] возвращает родителя аргумента.
Функции [math]isLeftSon(), isRightSon()[/math] возвращают является ли элемент правым или левым сыном соответственно. Пусть дерево отрезков реализовано на массиве с индексацией элементов с 1.

  parent(vertex)
     return vertex / 2;
  isLeftSon(vertex)
     if parent(vertex) * 2 + 1 == vertex
        return true;
     return false;

Ссылки

MAXimal :: algo :: Дерево отрезков

Дерево отрезков — Википедия

Визуализатор

Алгоритм