Дерево Фенвика для некоммутативных операций — различия между версиями
Sementry (обсуждение | вклад) (Новая страница: «Обычное дерево Фенвика позволяет выполнять некоторую ассоциативную, ко…») |
(нет различий)
|
Версия 20:17, 15 июня 2011
Обычное дерево Фенвика позволяет выполнять некоторую ассоциативную, коммутативную, обратимую операцию на отрезке с изменением элементов. Описываемая модификация дает возможность отказаться от коммутативности .
Выполнение запроса
Выполнение запроса делается так же, как и в обычном дереве Фенвика, с той лишь разницей, что теперь важен порядок операндов в операции .
Обновление элемента
Как и ранее, для обновления элемента в дереве нужно изменить все, что хранит результат операции с этим элементом. Но теперь нельзя просто применить операцию (далее используется мультипликативная нотация) ко всем нужным элементам дерева. Пусть мы хотим изменить на , в данный момент обновляем элемент дерева с индексом . Вместо мы получим (так как больше нельзя переставлять элементы местами в операции на отрезке).
Решение - нужно удалить отрезок после изменяемого элемента, изменить элемент, после чего добавить этот отрезок снова. Пусть, - результат выполнения операции на префиксе , - результат ее выполнения на отрезке . Тогда элемент дерева с индексом обновляется как .
Может показаться, что этот способ не работает, так как , возможно, уже было изменено, а - еще нет, значит, мы удаляем не тот отрезок, который должны удалить. Убедимся, что на самом деле все обновляется правильно:
;
, то есть, элемент дерева изменяется на правильное значение.