Встречное дерево Фенвика — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Свойства)
Строка 4: Строка 4:
 
}}
 
}}
  
Вспомним, что <tex>h(i)</tex> возвращает количество единиц в двоичной записи числа <tex>i</tex>, а каждый столбец прямого дерево Фенвика вычисляется по формуле <tex>F(i) = \sum_{j=i-2^{h(i)}+1}^i a[j]</tex>
+
Вспомним, что <tex>h(i)</tex> возвращает количество единиц в двоичной записи числа <tex>i</tex>, а каждый столбец прямого дерева Фенвика вычисляется по формуле <tex>F(i) = \sum_{j=i-2^{h(i)}+1}^i a[j]</tex>
  
 
== Свойства ==
 
== Свойства ==
Строка 15: Строка 15:
 
Встречное дерево Фенвика - это структура данных, дерево на массиве, обладающее следующими свойствами:
 
Встречное дерево Фенвика - это структура данных, дерево на массиве, обладающее следующими свойствами:
  
1) позволяет вычислять значение некоторой обратимой операции <tex>G</tex> на любом отрезке <tex>[L; R]</tex> за время <tex>O(\log N)</tex>;
+
1) позволяет вычислять значение некоторой операции <tex>G</tex> на любом отрезке <tex>[L; R]</tex> за время <tex>O(\log N)</tex>;
  
 
2) позволяет изменять значение любого элемента за <tex>O(\log N)</tex>;
 
2) позволяет изменять значение любого элемента за <tex>O(\log N)</tex>;
Строка 29: Строка 29:
 
== Применение ==
 
== Применение ==
  
Дерево Фенвика позволяло вычислять значение операции <tex>G</tex> на отрезке <tex>[L; R]</tex> с помощью формулы включений-исключений и запросов вида <tex>G([0; R])</tex> и <tex>G([0; L])</tex>. Встречное дерево Фенвика позволяет нам сразу обрабатывать запрос вида <tex>G([L; R])</tex>
+
Встречное дерево Фенвика применяется, когда нужно посчитать некоторую операцию на структуре без использования обратного элемента по этой операции. Например, перед нами стоит задача посчитать произведение матриц, не считая обратных. С помощью встречного дерева Фенвика можно разложить запрос произведения на отрезке на <tex>O(\log N)</tex> дизъюнктных отрезков, операция для которых уже посчитана, получается почти как в дереве отрезков.
  
 
== Ссылки ==  
 
== Ссылки ==  
 
[http://e-maxx.ru/algo/fenwick_tree Дерево Фенвика]
 
[http://e-maxx.ru/algo/fenwick_tree Дерево Фенвика]

Версия 06:00, 24 мая 2011

Определение:
Встречное дерево Фенвикадерево Фенвика, в котором над каждым столбцом идет столбец такой же высоты, вычисляемый по формуле [math]F'(i) = \sum_{j=i+1}^{i+2^{h(i)}} a[j][/math].


Вспомним, что [math]h(i)[/math] возвращает количество единиц в двоичной записи числа [math]i[/math], а каждый столбец прямого дерева Фенвика вычисляется по формуле [math]F(i) = \sum_{j=i-2^{h(i)}+1}^i a[j][/math]

Свойства

Прямое дерево Фенвика
Встречное дерево Фенвика


Встречное дерево Фенвика - это структура данных, дерево на массиве, обладающее следующими свойствами:

1) позволяет вычислять значение некоторой операции [math]G[/math] на любом отрезке [math][L; R][/math] за время [math]O(\log N)[/math];

2) позволяет изменять значение любого элемента за [math]O(\log N)[/math];

3) требует [math]O (N)[/math] памяти, а точнее, ровно столько же, сколько и массив из [math]2N[/math] элементов;

4) легко обобщается на случай многомерных массивов.

5) позволяет представить любой отрезок [math][L; R][/math] в виде дизъюнктивных объединений отрезков, взятых из прямого и встречного дерева Фенвика.



Применение

Встречное дерево Фенвика применяется, когда нужно посчитать некоторую операцию на структуре без использования обратного элемента по этой операции. Например, перед нами стоит задача посчитать произведение матриц, не считая обратных. С помощью встречного дерева Фенвика можно разложить запрос произведения на отрезке на [math]O(\log N)[/math] дизъюнктных отрезков, операция для которых уже посчитана, получается почти как в дереве отрезков.

Ссылки

Дерево Фенвика