Дерево Фенвика для некоммутативных операций — различия между версиями
Sementry (обсуждение | вклад) (Новая страница: «Обычное дерево Фенвика позволяет выполнять некоторую ассоциативную, ко…») |
Sementry (обсуждение | вклад) м |
||
Строка 16: | Строка 16: | ||
<tex> s_{i, j}^{-1}{'} \cdot d \cdot s_{i, j}{'} = (d^{-1} \cdot s_{i, j})^{-1} \cdot d \cdot d^{-1} \cdot s_{i, j} = s_{i, j}^{-1} \cdot d \cdot d \cdot d^{-1} \cdot s_{i, j} = s_{i, j}^{-1} \cdot d \cdot s_{i, j} </tex>, то есть, элемент дерева изменяется на правильное значение. | <tex> s_{i, j}^{-1}{'} \cdot d \cdot s_{i, j}{'} = (d^{-1} \cdot s_{i, j})^{-1} \cdot d \cdot d^{-1} \cdot s_{i, j} = s_{i, j}^{-1} \cdot d \cdot d \cdot d^{-1} \cdot s_{i, j} = s_{i, j}^{-1} \cdot d \cdot s_{i, j} </tex>, то есть, элемент дерева изменяется на правильное значение. | ||
+ | |||
+ | Пусть в дереве <tex> n </tex> элементов. Так как для каждого из <tex> O(log(n)) </tex> изменяемых элементов дерева мы совершаем дополнительно запрос суммы на отрезке(а он работает за <tex> O(log(n)) </tex> операций), то асимптотическое время работы обновления элемента ухудшается до <tex> O(log^2(n)) </tex>. |
Версия 20:36, 15 июня 2011
Обычное дерево Фенвика позволяет выполнять некоторую ассоциативную, коммутативную, обратимую операцию на отрезке с изменением элементов. Описываемая модификация дает возможность отказаться от коммутативности .
Выполнение запроса
Выполнение запроса делается так же, как и в обычном дереве Фенвика, с той лишь разницей, что теперь важен порядок операндов в операции
.Обновление элемента
Как и ранее, для обновления элемента в дереве нужно изменить все, что хранит результат операции с этим элементом. Но теперь нельзя просто применить операцию
(далее используется мультипликативная нотация) ко всем нужным элементам дерева. Пусть мы хотим изменить на , в данный момент обновляем элемент дерева с индексом . Вместо мы получим (так как больше нельзя переставлять элементы местами в операции на отрезке).Решение - нужно удалить отрезок после изменяемого элемента, изменить элемент, после чего добавить этот отрезок снова. Пусть,
- результат выполнения операции на префиксе , - результат ее выполнения на отрезке . Тогда элемент дерева с индексом обновляется как .Может показаться, что этот способ не работает, так как
, возможно, уже было изменено, а - еще нет, значит, мы удаляем не тот отрезок, который должны удалить. Убедимся, что на самом деле все обновляется правильно:;
, то есть, элемент дерева изменяется на правильное значение.
Пусть в дереве
элементов. Так как для каждого из изменяемых элементов дерева мы совершаем дополнительно запрос суммы на отрезке(а он работает за операций), то асимптотическое время работы обновления элемента ухудшается до .