Дерево Фенвика для некоммутативных операций — различия между версиями
м (rollbackEdits.php mass rollback) |
|||
| (не показано 6 промежуточных версий 3 участников) | |||
| Строка 4: | Строка 4: | ||
Как и ранее, для обновления элемента в дереве нужно изменить все, что хранит результат операции с этим элементом. Но теперь нельзя просто применить операцию <tex> G </tex> (далее будем использовать мультипликативную нотацию) ко всем нужным элементам дерева. Пусть мы хотим изменить <tex> a_i </tex> на <tex> a_i' = a_i \cdot d </tex>, в данный момент обновляем элемент дерева с индексом <tex> j </tex>. Вместо <tex> a_{j \& (j + 1)} \cdot \ldots a_i \cdot d \cdot \cdot \ldots \cdot a_j </tex> мы получим <tex> a_{j \& (j + 1)} \cdot \ldots a_i \cdot \ldots \cdot a_j \cdot d </tex> (так как больше нельзя переставлять элементы местами в операции на отрезке, ответ будет неверен). | Как и ранее, для обновления элемента в дереве нужно изменить все, что хранит результат операции с этим элементом. Но теперь нельзя просто применить операцию <tex> G </tex> (далее будем использовать мультипликативную нотацию) ко всем нужным элементам дерева. Пусть мы хотим изменить <tex> a_i </tex> на <tex> a_i' = a_i \cdot d </tex>, в данный момент обновляем элемент дерева с индексом <tex> j </tex>. Вместо <tex> a_{j \& (j + 1)} \cdot \ldots a_i \cdot d \cdot \cdot \ldots \cdot a_j </tex> мы получим <tex> a_{j \& (j + 1)} \cdot \ldots a_i \cdot \ldots \cdot a_j \cdot d </tex> (так как больше нельзя переставлять элементы местами в операции на отрезке, ответ будет неверен). | ||
| + | |||
| + | Для решения этой задачи нужно удалить отрезок после изменяемого элемента, изменить элемент, после чего добавить этот отрезок снова. | ||
{{Теорема | {{Теорема | ||
|statement= | |statement= | ||
| − | + | Пусть <tex> s_i = a_1 \cdot a_2 \cdot \ldots \cdot a_i </tex> — результат выполнения операции на префиксе <tex> i </tex>; <tex> s_{i, j} = s_i^{-1} \cdot s_j </tex> — результат ее выполнения на отрезке <tex> [i; j] </tex>. Тогда элемент дерева с индексом <tex> j </tex> обновляется как <tex> t_j' = t_j \cdot s_{i, j}^{-1} \cdot d \cdot s_{i, j} </tex>. | |
|proof= | |proof= | ||
| Строка 18: | Строка 20: | ||
=== Время работы === | === Время работы === | ||
Пусть в дереве <tex> n </tex> элементов. Так как для каждого из <tex> O(\log {n}) </tex> изменяемых элементов дерева мы совершаем дополнительно запрос суммы на отрезке(а он работает за <tex> O(\log {n}) </tex> операций), то асимптотическое время работы обновления элемента ухудшается до <tex> O(\log^2{n}) </tex>. | Пусть в дереве <tex> n </tex> элементов. Так как для каждого из <tex> O(\log {n}) </tex> изменяемых элементов дерева мы совершаем дополнительно запрос суммы на отрезке(а он работает за <tex> O(\log {n}) </tex> операций), то асимптотическое время работы обновления элемента ухудшается до <tex> O(\log^2{n}) </tex>. | ||
| − | |||
| − | |||
| − | |||
| − | |||
== Пример == | == Пример == | ||
| Строка 87: | Строка 85: | ||
==См. также== | ==См. также== | ||
* [[Дерево Фенвика]] | * [[Дерево Фенвика]] | ||
| + | * [[Дерево отрезков. Построение]] | ||
| + | |||
| + | ==Источники информации== | ||
| − | * [[ | + | * [http://citeseer.ist.psu.edu/viewdoc/download;jsessionid=F180153B9C0CD797594314B736E2CCC5?doi=10.1.1.14.8917&rep=rep1&type=pdf Peter M. Fenwick: A new data structure for cumulative frequency] |
| + | * [http://en.wikipedia.org/wiki/Fenwick_tree Wikipedia — Fenwick tree] | ||
[[Категория: Дискретная математика и алгоритмы]] | [[Категория: Дискретная математика и алгоритмы]] | ||
| − | |||
[[Категория: Дерево Фенвика]] | [[Категория: Дерево Фенвика]] | ||
| − | |||
[[Категория: Структуры данных]] | [[Категория: Структуры данных]] | ||
Текущая версия на 19:23, 4 сентября 2022
Обычное дерево Фенвика позволяет выполнять некоторую ассоциативную, коммутативную, обратимую операцию на отрезке с изменением элементов. Описываемая модификация дает возможность отказаться от коммутативности .
Обновление элемента
Как и ранее, для обновления элемента в дереве нужно изменить все, что хранит результат операции с этим элементом. Но теперь нельзя просто применить операцию (далее будем использовать мультипликативную нотацию) ко всем нужным элементам дерева. Пусть мы хотим изменить на , в данный момент обновляем элемент дерева с индексом . Вместо мы получим (так как больше нельзя переставлять элементы местами в операции на отрезке, ответ будет неверен).
Для решения этой задачи нужно удалить отрезок после изменяемого элемента, изменить элемент, после чего добавить этот отрезок снова.
| Теорема: |
Пусть — результат выполнения операции на префиксе ; — результат ее выполнения на отрезке . Тогда элемент дерева с индексом обновляется как . |
| Доказательство: |
|
Может показаться, что этот способ не работает, так как , возможно, уже было изменено, а — еще нет, значит, мы удаляем не тот отрезок, который должны удалить. Убедимся, что на самом деле все обновляется правильно. Учитывая, что , получаем: ; , то есть элемент дерева изменяется на правильное значение. |
Время работы
Пусть в дереве элементов. Так как для каждого из изменяемых элементов дерева мы совершаем дополнительно запрос суммы на отрезке(а он работает за операций), то асимптотическое время работы обновления элемента ухудшается до .
Пример
Пусть есть массив из пяти матриц :
Пусть — операция умножения матриц. Дерево Фенвика выглядит так:
Пусть теперь . Значит, надо изменить и .
После этого дерево выглядит так:
Пересчитаем :
Рассчитаем суммы:
Итого в обновлённом дереве Фенвика всё верно: