Реализация запроса в дереве отрезков снизу — различия между версиями
Gemin (обсуждение | вклад) |
Gemin (обсуждение | вклад) (→Псевдокод) |
||
Строка 13: | Строка 13: | ||
if left == <правый сын> | if left == <правый сын> | ||
res = min(result, data[left]); | res = min(result, data[left]); | ||
− | left = | + | left = parent(left + 1); |
else | else | ||
− | left = | + | left = parent(left); |
if right == <левый сын> | if right == <левый сын> | ||
result = min(result, data[right]); | result = min(result, data[right]); | ||
− | right = | + | right = parent(right - 1); |
else | else | ||
− | right = | + | right = parent(right); |
if left == right | if left == right | ||
result = min(result, data[left]); | result = min(result, data[left]); |
Версия 21:47, 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;