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

Материал из Викиконспекты
Перейти к: навигация, поиск
Строка 1: Строка 1:
 
{{Определение
 
{{Определение
 
|definition=
 
|definition=
'''Встречное дерево Фенвика''' — [[Дерево Фенвика|дерево Фенвика]], в котором над каждым столбцом идет столбец такой же высоты, вычисляемый по формуле <tex>F'(i) = \sum\limits_{j=i+1}^{i+2^{h(i)}} a[j]</tex>.
+
'''Встречное дерево Фенвика''' (англ. ''counter tree Fenwick'') — [[Дерево Фенвика|дерево Фенвика]], в котором над каждым столбцом идет столбец такой же высоты, вычисляемый по формуле <tex>F'(i) = \sum\limits_{j=i+1}^{i+2^{h(i)}} a[j]</tex>.
 
}}
 
}}
  
Строка 7: Строка 7:
  
 
== Любой отрезок в виде дизъюнктивных объединений отрезков ==
 
== Любой отрезок в виде дизъюнктивных объединений отрезков ==
 
+
[[Файл:Originalbit.png|thumb|Прямое дерево Фенвика]]
 +
[[Файл:Vstbit.png|thumb|Встречное дерево Фенвика]]
 
Докажем, что можно представить любой отрезок в виде дизъюнктивных объединений <tex>O(\log N)</tex> отрезков, взятых из прямого и встречного дерева Фенвика.
 
Докажем, что можно представить любой отрезок в виде дизъюнктивных объединений <tex>O(\log N)</tex> отрезков, взятых из прямого и встречного дерева Фенвика.
  
 
Представим встречное дерево Фенвика <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> в обратном порядке.
Строка 18: Строка 19:
 
== Свойства ==
 
== Свойства ==
  
[[Файл:Originalbit.png|thumb|left|Прямое дерево Фенвика]]
+
* Встречное дерево Фенвика позволяет вычислять значение некоторой операции <tex>G</tex> на любом отрезке <tex>[L; R]</tex> за время <tex>O(\log N)</tex>;
[[Файл:Vstbit.png|thumb|Встречное дерево Фенвика]]
 
 
 
  
 +
* Такое дерево позволяет изменять значение любого элемента за <tex>O(\log N)</tex>;
  
Встречное дерево Фенвика - это структура данных, дерево на массиве, обладающее следующими свойствами:
+
* Встречное дерево Фенвика требует <tex>O (N)</tex> памяти, а точнее, ровно столько же, сколько и массив из <tex>2N</tex> элементов;
  
1) позволяет вычислять значение некоторой операции <tex>G</tex> на любом отрезке <tex>[L; R]</tex> за время <tex>O(\log N)</tex>;
+
* Данная структура данных легко обобщается на случай многомерных массивов.
  
2) позволяет изменять значение любого элемента за <tex>O(\log N)</tex>;
+
* Такое дерево Фенвика позволяет представить любой отрезок <tex>[L; R]</tex> в виде дизъюнктивных объединений отрезков, взятых из прямого и встречного дерева Фенвика.
  
3) требует <tex>O (N)</tex> памяти, а точнее, ровно столько же, сколько и массив из <tex>2N</tex> элементов;
+
== Применение ==
  
4) легко обобщается на случай многомерных массивов.
+
Встречное дерево Фенвика применяется, когда нужно посчитать некоторую операцию на структуре без использования обратного элемента по этой операции. Например, перед нами стоит задача посчитать произведение, не считая обратных. С помощью встречного дерева Фенвика можно разложить запрос произведения на отрезке на <tex>O(\log N)</tex> дизъюнктных отрезков, операция для которых уже посчитана, получается почти как в дереве отрезков.
 +
==См. также==
 +
* [[Дерево Фенвика]]
  
5) позволяет представить любой отрезок <tex>[L; R]</tex> в виде дизъюнктивных объединений отрезков, взятых из прямого и встречного дерева Фенвика.
+
* [[Дерево отрезков. Построение |Дерево отрезков]]
  
<br /> <br />
+
== Источники информации ==
 +
* [http://en.wikipedia.org/wiki/Fenwick_tree Wikipedia — Fenwick_tree Fenwick tree]
 +
* [http://e-maxx.ru/algo/fenwick_tree Maximal:: algo:: Дерево Фенвика]
  
== Применение ==
+
[[Категория: Дискретная математика и алгоритмы]]
  
Встречное дерево Фенвика применяется, когда нужно посчитать некоторую операцию на структуре без использования обратного элемента по этой операции. Например, перед нами стоит задача посчитать произведение матриц, не считая обратных. С помощью встречного дерева Фенвика можно разложить запрос произведения на отрезке на <tex>O(\log N)</tex> дизъюнктных отрезков, операция для которых уже посчитана, получается почти как в дереве отрезков.
+
[[Категория: Дерево Фенвика]]
  
== Ссылки ==
+
[[Категория: Структуры данных]]
[http://e-maxx.ru/algo/fenwick_tree Дерево Фенвика]
 

Версия 16:00, 3 июня 2015

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


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

Любой отрезок в виде дизъюнктивных объединений отрезков

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

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

Представим встречное дерево Фенвика [math]2^n[/math] на [math]2^n[/math] и посмотрим на него, как на дерево отрезков.

В нем существует отрезок [math][1..2^n][/math]. Оставшуюся часть можно разбить на 2 поддерева, т.е. отрезок [math](1..n)[/math] разбивается на подотрезки [math](1..n/2)[/math], [math](n/2+1..n)[/math]. В итоге получается структура обычного дерева отрезков, для которого известно указанное выше утверждение.

Стоит отметить, что поддерево для [math](n/2+1..n)[/math] получается "перевернутым" из-за того, что встречное дерево, по сути, идет от [math]n-1[/math] до [math]1[/math] в обратном порядке.

Свойства

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

Применение

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

См. также

Источники информации