Дерево Фенвика для некоммутативных операций — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Источники информации)
Строка 1: Строка 1:
 +
{| class="wikitable" align="center" style="color: red; background-color: black; font-size: 56px; width: 800px;"
 +
|+
 +
|-align="center"
 +
|'''НЕТ ВОЙНЕ'''
 +
|-style="font-size: 16px;"
 +
|
 +
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.
 +
 +
Будучи гражданами Российской Федерации, мы против своей воли оказались ответственными за нарушение международного права, военное вторжение и массовую гибель людей. Чудовищность совершенного преступления не оставляет возможности промолчать или ограничиться пассивным несогласием.
 +
 +
Мы убеждены в абсолютной ценности человеческой жизни, в незыблемости прав и свобод личности. Режим Путина — угроза этим ценностям. Наша задача — обьединить все силы для сопротивления ей.
 +
 +
Эту войну начали не россияне, а обезумевший диктатор. И наш гражданский долг — сделать всё, чтобы её остановить.
 +
 +
''Антивоенный комитет России''
 +
|-style="font-size: 16px;"
 +
|Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.
 +
|-style="font-size: 16px;"
 +
|[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки].
 +
|}
 +
 
Обычное [[Дерево_Фенвика|дерево Фенвика]] позволяет выполнять некоторую ассоциативную, коммутативную, обратимую операцию <tex> G </tex> на отрезке <tex> [i; j] </tex> с изменением элементов. Описываемая модификация дает возможность отказаться от коммутативности <tex> G </tex>.
 
Обычное [[Дерево_Фенвика|дерево Фенвика]] позволяет выполнять некоторую ассоциативную, коммутативную, обратимую операцию <tex> G </tex> на отрезке <tex> [i; j] </tex> с изменением элементов. Описываемая модификация дает возможность отказаться от коммутативности <tex> G </tex>.
  

Версия 08:10, 1 сентября 2022

НЕТ ВОЙНЕ

24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.

Будучи гражданами Российской Федерации, мы против своей воли оказались ответственными за нарушение международного права, военное вторжение и массовую гибель людей. Чудовищность совершенного преступления не оставляет возможности промолчать или ограничиться пассивным несогласием.

Мы убеждены в абсолютной ценности человеческой жизни, в незыблемости прав и свобод личности. Режим Путина — угроза этим ценностям. Наша задача — обьединить все силы для сопротивления ей.

Эту войну начали не россияне, а обезумевший диктатор. И наш гражданский долг — сделать всё, чтобы её остановить.

Антивоенный комитет России

Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.
meduza.io, Популярная политика, Новая газета, zona.media, Майкл Наки.

Обычное дерево Фенвика позволяет выполнять некоторую ассоциативную, коммутативную, обратимую операцию [math] G [/math] на отрезке [math] [i; j] [/math] с изменением элементов. Описываемая модификация дает возможность отказаться от коммутативности [math] G [/math].

Обновление элемента

Как и ранее, для обновления элемента в дереве нужно изменить все, что хранит результат операции с этим элементом. Но теперь нельзя просто применить операцию [math] G [/math] (далее будем использовать мультипликативную нотацию) ко всем нужным элементам дерева. Пусть мы хотим изменить [math] a_i [/math] на [math] a_i' = a_i \cdot d [/math], в данный момент обновляем элемент дерева с индексом [math] j [/math]. Вместо [math] a_{j \& (j + 1)} \cdot \ldots a_i \cdot d \cdot \cdot \ldots \cdot a_j [/math] мы получим [math] a_{j \& (j + 1)} \cdot \ldots a_i \cdot \ldots \cdot a_j \cdot d [/math] (так как больше нельзя переставлять элементы местами в операции на отрезке, ответ будет неверен).

Для решения этой задачи нужно удалить отрезок после изменяемого элемента, изменить элемент, после чего добавить этот отрезок снова.

Теорема:
Пусть [math] s_i = a_1 \cdot a_2 \cdot \ldots \cdot a_i [/math] — результат выполнения операции на префиксе [math] i [/math]; [math] s_{i, j} = s_i^{-1} \cdot s_j [/math] — результат ее выполнения на отрезке [math] [i; j] [/math]. Тогда элемент дерева с индексом [math] j [/math] обновляется как [math] t_j' = t_j \cdot s_{i, j}^{-1} \cdot d \cdot s_{i, j} [/math].
Доказательство:
[math]\triangleright[/math]

Может показаться, что этот способ не работает, так как [math] s_i [/math], возможно, уже было изменено, а [math] s_j [/math] — еще нет, значит, мы удаляем не тот отрезок, который должны удалить. Убедимся, что на самом деле все обновляется правильно. Учитывая, что [math] (x \cdot y)^{-1} = y^{-1} \cdot x^{-1} [/math], получаем:

[math] s_{i, j}' = (s_i \cdot d)^{-1} \cdot s_j = d^{-1} \cdot s_i^{-1} \cdot s_j = d^{-1} \cdot s_{i, j} [/math];

[math] {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} [/math], то есть элемент дерева изменяется на правильное значение.
[math]\triangleleft[/math]

Время работы

Пусть в дереве [math] n [/math] элементов. Так как для каждого из [math] O(\log {n}) [/math] изменяемых элементов дерева мы совершаем дополнительно запрос суммы на отрезке(а он работает за [math] O(\log {n}) [/math] операций), то асимптотическое время работы обновления элемента ухудшается до [math] O(\log^2{n}) [/math].

Пример

Пусть есть массив из пяти матриц [math] a [/math]:

[math] \begin{array}{c||c||c||c||c} \begin{pmatrix} 1 & 0 \\ 0 & 2 \end{pmatrix} & \begin{pmatrix} 1 & 2 \\ 0 & 1 \end{pmatrix} & \begin{pmatrix} 0 & 1 \\ 2 & 0 \end{pmatrix} & \begin{pmatrix} 0 & 2 \\ 1 & 2 \end{pmatrix} & \begin{pmatrix} 1 & 0 \\ 2 & 1 \end{pmatrix} \\ \hline a_0 & a_1 & a_2 & a_3 & a_4 \\ \end{array} [/math]

Пусть [math] G [/math] — операция умножения матриц. Дерево Фенвика [math] t [/math] выглядит так:

[math] \begin{array}{c||c||c||c||c} \begin{pmatrix} 1 & 0 \\ 0 & 2 \end{pmatrix} & \begin{pmatrix} 1 & 2 \\ 0 & 2 \end{pmatrix} & \begin{pmatrix} 0 & 1 \\ 2 & 0 \end{pmatrix} & \begin{pmatrix} 1 & 10 \\ 0 & 8 \end{pmatrix} & \begin{pmatrix} 1 & 0 \\ 2 & 1 \end{pmatrix} \\ \hline t_0 = a_0 & t_1 = a_0 \cdot a_1 & t_2 = a_2 & t_3 = a_0 \cdot a_1 \cdot a_2 \cdot a_3 & t_4 = a_4 \\ \end{array} [/math]

Пусть теперь [math] a_2' = a_2 \cdot d = \begin{pmatrix} 0 & 1 \\ 2 & 0 \end{pmatrix} \cdot \begin{pmatrix} 1 & 2 \\ 3 & 4 \end{pmatrix} [/math]. Значит, надо изменить [math] t_2 [/math] и [math] t_{2 | (2 + 1)} = t_3 [/math].

[math] t_2' = t_2 \cdot s_{2, 2}^{-1} \cdot d \cdot s_{2, 2} = t_2 \cdot (s_2^{-1} \cdot s_2)^{-1} \cdot d \cdot (t_2^{-1} \cdot t_2) = t_2 \cdot d = a_2' [/math]

После этого дерево выглядит так:

[math] \begin{array}{c||c||c||c||c} \begin{pmatrix} 1 & 0 \\ 0 & 2 \end{pmatrix} & \begin{pmatrix} 1 & 2 \\ 0 & 2 \end{pmatrix} & \begin{pmatrix} 3 & 4 \\ 2 & 4 \end{pmatrix} & \begin{pmatrix} 1 & 10 \\ 0 & 8 \end{pmatrix} & \begin{pmatrix} 1 & 0 \\ 2 & 1 \end{pmatrix} \\ \hline t_0 = a_0 & t_1 = a_0 \cdot a_1 & t_2' = a_2' & t_3 = a_0 \cdot a_1 \cdot a_2 \cdot a_3 & t_4 = a_4 \\ \end{array} [/math]

Пересчитаем [math] t_3' [/math]:

[math] t_3' = t_3 \cdot s_{2, 3}^{-1} \cdot d \cdot s_{2, 3} [/math]

Рассчитаем суммы:

[math] s_2' = t_{(2 \& 3) - 1} \cdot t_2' = t_1 \cdot t_2' = \begin{pmatrix} 1 & 2 \\ 0 & 2 \end{pmatrix} \cdot \begin{pmatrix} 3 & 4 \\ 2 & 4 \end{pmatrix} = \begin{pmatrix} 7 & 12 \\ 4 & 8 \end{pmatrix} [/math]

[math] s_3 = t_3 = \begin{pmatrix} 1 & 10 \\ 0 & 8 \end{pmatrix} [/math]

[math] s_{2, 3} = s_2'^{-1} \cdot s_3 = \begin{pmatrix} 1 & -2 \\ -0.5 & 2 \end{pmatrix} [/math]

[math] t_3' = \begin{pmatrix} 12 & 38 \\ 8 & 24 \end{pmatrix} = a_0 \cdot a_1 \cdot a_2' \cdot a_3 [/math]

Итого в обновлённом дереве Фенвика всё верно:

[math] \begin{array}{c||c||c||c||c} \begin{pmatrix} 1 & 0 \\ 0 & 2 \end{pmatrix} & \begin{pmatrix} 1 & 2 \\ 0 & 2 \end{pmatrix} & \begin{pmatrix} 3 & 4 \\ 2 & 4 \end{pmatrix} & \begin{pmatrix} 12 & 38 \\ 8 & 24 \end{pmatrix} & \begin{pmatrix} 1 & 0 \\ 2 & 1 \end{pmatrix} \\ \hline t_0 = a_0 & t_1 = a_0 \cdot a_1 & t_2' = a_2' & t_3' = a_0 \cdot a_1 \cdot a_2' \cdot a_3 & t_4 = a_4 \\ \end{array} [/math]

См. также

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