Изменения

Перейти к: навигация, поиск

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

231 байт добавлено, 22:16, 5 сентября 2019
Правка пунктуации
==Алгоритм==
Реализация запроса снизу вверх в дереве отрезков является, в отличие от [[Реализация запроса в дереве отрезков сверху| реализации запроса сверху вниз]], итеративным методом. Будем рассматривать абстрактную операцию, обладающую свойством ассоциативности, и обозначать ее a <tex> a \circ b</tex> b.
[[Дерево отрезков. Построение|Построим дерево отрезков]] , и установим границы отрезка на соответствующие им листья. Будем действовать в 3 этапа:
# Если элемент, попавший на левую границу, является правым сыном, то запишем в результат значение, полученное после выполнения нашей операции над предыдущим результатом и значением этого элемента, а левую границу перемещаем на один элемент вправо. Аналогично с правой границей (является ли она левым сыном). Таким образом мы учтем вклад нужной нам вершины и избавимся от вклада ненужного нам поддерева.
# Устанавливаем границы отрезка на родительские элементы текущих границ. Это позволит узнать, входит ли полученный отрезок в искомый или нет. Повторяем этап 1, пока границы не пересекутся.
==Псевдокод==
Пусть результат считаем на отрезке <tex> [left, right]</tex>. При этом значения <tex>left </tex> и <tex>right</tex>, передающиеся в функцию, должны указывать на листья дерева (необходимо увеличить значение на индекс массива, с которого начинаются листья). Переменные left_res <tex>leftRes</tex> и right_res <tex>rightRes</tex> будут собирать значения на отрезках, отделившихся соответственно слева или справа от рассматриваемого.
'''int''' query(left: '''int''', right: '''int'''): left_res leftRes = '''neutral'''; right_res rightRes = '''neutral''';
'''while''' left < right
'''if''' left '''mod ''' 2 == 0 left_res leftRes = left_res leftRes <tex> \circ </tex> data[left]; left = left '''div ''' 2; '''if''' right '''mod ''' 2 == 1 right_res rightRes = data[right] <tex> \circ </tex> right_res;rightRes right = (right '''div''' 2 - 1) div 2;
'''if''' left == right
left_res leftRes = left_res leftRes <tex> \circ </tex> data[left]; '''return''' left_res leftRes <tex> \circ </tex> right_res;rightRes
==СсылкиСм. также==* [[Реализация запроса в дереве отрезков сверху]]
[http://e-maxx.ru/algo/segment_tree MAXimal :: algo :: Дерево отрезков]==Источники информации==
* [http://e-maxx.ru.wikipedia.org/wikialgo/%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 Википедия {{---}} segment_tree MAXimal :: algo :: Дерево отрезков]
* [http://rainru.ifmowikipedia.ruorg/catwiki/view.php/vis/trees/segment%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 Википедия {{---2006 Визуализатор}} Дерево отрезков]
* [http://rain.ifmo.ru/cat/view.php/vis/trees/segment-2006/algorithm АлгоритмВизуализатор]
* [http://rain.ifmo.ru/cat/view.php/vis/trees/segment-2006/algorithm Алгоритм]
[[Категория: Дискретная математика и алгоритмы]]
[[Категория: Дерево отрезков]]
Анонимный участник

Навигация