Встречное дерево Фенвика — различия между версиями
Proshev (обсуждение | вклад) (→Любой отрезок в виде дизъюнктивных объединений O(\log N) отрезков) |
(→Любой отрезок в виде дизъюнктивных объединений отрезков) |
||
Строка 12: | Строка 12: | ||
Представим встречное дерево Фенвика <tex>2^n</tex> на <tex>2^n</tex> и посмотрим на него, как на дерево отрезков. | Представим встречное дерево Фенвика <tex>2^n</tex> на <tex>2^n</tex> и посмотрим на него, как на дерево отрезков. | ||
− | В нем существует отрезок длины <tex>1..2^n</tex>. Оставшуюся часть можно разбить на 2 поддерева, т.е. отрезок <tex>(1..n)</tex> разбивается на подотрезки <tex>(1..n/2)</tex>, <tex>(n/2+1..n)</tex>. В итоге получается структура обычного дерева отрезков, для которого известно указанное выше утверждение. | + | В нем существует отрезок длины <tex>1..2^n</tex>. Оставшуюся часть можно разбить на 2 поддерева, т.е. отрезок <tex>(1..n)</tex> разбивается на подотрезки <tex>(1..n/2)</tex>, <tex>(n/2+1..n)</tex>. В итоге получается структура обычного [[Дерево отрезков. Построение|дерева отрезков]], для которого известно указанное выше утверждение. |
Стоит отметить, что поддерево для <tex>(n/2+1..n)</tex> получается "перевернутым" из-за того, что встречное дерево, по сути, идет от <tex>n-1</tex> до <tex>1</tex> в обратном порядке. | Стоит отметить, что поддерево для <tex>(n/2+1..n)</tex> получается "перевернутым" из-за того, что встречное дерево, по сути, идет от <tex>n-1</tex> до <tex>1</tex> в обратном порядке. |
Версия 22:06, 15 июня 2011
Определение: |
Встречное дерево Фенвика — дерево Фенвика, в котором над каждым столбцом идет столбец такой же высоты, вычисляемый по формуле . |
Вспомним, что возвращает количество единиц в двоичной записи числа , а каждый столбец прямого дерева Фенвика вычисляется по формуле
Содержание
Любой отрезок в виде дизъюнктивных объединений отрезков
Докажем, что можно представить любой отрезок в виде дизъюнктивных объединений
отрезков, взятых из прямого и встречного дерева Фенвика.Представим встречное дерево Фенвика
на и посмотрим на него, как на дерево отрезков.В нем существует отрезок длины дерева отрезков, для которого известно указанное выше утверждение.
. Оставшуюся часть можно разбить на 2 поддерева, т.е. отрезок разбивается на подотрезки , . В итоге получается структура обычногоСтоит отметить, что поддерево для
получается "перевернутым" из-за того, что встречное дерево, по сути, идет от до в обратном порядке.Свойства
Встречное дерево Фенвика - это структура данных, дерево на массиве, обладающее следующими свойствами:
1) позволяет вычислять значение некоторой операции
на любом отрезке за время ;2) позволяет изменять значение любого элемента за
;3) требует
памяти, а точнее, ровно столько же, сколько и массив из элементов;4) легко обобщается на случай многомерных массивов.
5) позволяет представить любой отрезок
в виде дизъюнктивных объединений отрезков, взятых из прямого и встречного дерева Фенвика.
Применение
Встречное дерево Фенвика применяется, когда нужно посчитать некоторую операцию на структуре без использования обратного элемента по этой операции. Например, перед нами стоит задача посчитать произведение матриц, не считая обратных. С помощью встречного дерева Фенвика можно разложить запрос произведения на отрезке на
дизъюнктных отрезков, операция для которых уже посчитана, получается почти как в дереве отрезков.