Реализация запроса в дереве отрезков снизу — различия между версиями
Gemin (обсуждение | вклад) |
Gemin (обсуждение | вклад) (→Ссылки) |
||
| Строка 32: | Строка 32: | ||
[http://ru.wikipedia.org/wiki/%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D0%BE%D0%B2 - Дерево отрезков — Википедия] | [http://ru.wikipedia.org/wiki/%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D0%BE%D0%B2 - Дерево отрезков — Википедия] | ||
| + | |||
| + | [http://rain.ifmo.ru/cat/view.php/vis/trees/segment-2006 - Визуализатор] | ||
| + | |||
| + | [http://rain.ifmo.ru/cat/view.php/vis/trees/segment-2006/algorithm - Алгоритм] | ||
Версия 22:01, 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;
Функция возвращает родителя аргумента.