Реализация запроса в дереве отрезков снизу — различия между версиями
Gemin (обсуждение | вклад) (→Алгоритм) |
Gemin (обсуждение | вклад) (→Алгоритм) |
||
Строка 4: | Строка 4: | ||
[[Файл:Down-up1.png|right|350px|thumb|Реализация запроса снизу вверх]] | [[Файл:Down-up1.png|right|350px|thumb|Реализация запроса снизу вверх]] | ||
Будем рассматривать дерево отрезков с операцией нахождения минимального значения на отрезке(RMQ).<br> | Будем рассматривать дерево отрезков с операцией нахождения минимального значения на отрезке(RMQ).<br> | ||
− | Установим границы отрезка на соответствующие листья. Если элемент попавший на левую границу является правым сыном, то отрезаем | + | Установим границы отрезка на соответствующие листья. Если элемент попавший на левую границу является правым сыном, то отрезаем его и аналогично рассматриваем элемент попавший на правую границу (является ли этот элемент левым сыном). Затем поднимаемся к родителям элементов, попавших на новые границы. Отрезая элемент, мы считаем минимум из отрезанного и минимума на оставшемся отрезке. Закончим алгоритм, когда границы пересекутся. |
==Псевдокод== | ==Псевдокод== |
Версия 22:06, 8 мая 2011
Содержание
Описание
Реализация запроса снизу вверх в дереве отрезков является, в отличие от реализации сверху вниз, итеративным методом.
Алгоритм
Будем рассматривать дерево отрезков с операцией нахождения минимального значения на отрезке(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;
Функция
возвращает родителя аргумента.