Несогласованные поддеревья. Реализация массового обновления — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Несогласованные поддеревья)
Строка 1: Строка 1:
 
== Несогласованные поддеревья ==
 
== Несогласованные поддеревья ==
  
В несогласованном поддереве дерева отрезков в вершинах хранятся не истинные значения сумм на отрезках (по операции <tex>\oplus</tex>). При этом в корне поддерева, которому соответствует отрезок <tex>a_i..a_j</tex> хранится несогласованность <tex>d</tex>. Для того чтобы узнать истинное значение нужно «собрать» все несогласованности на пути от вершины к корню дерева: <tex>b_i = b'_i \odot \left(\bigodot\limits_k d_k \right)</tex>. То есть для этого необходимо, чтобы вторая операция <tex>\odot</tex> была ассоциативной.
+
В несогласованном поддереве дерева отрезков в вершинах хранятся не истинные значения сумм на отрезках (по операции <tex>\oplus</tex>). При этом в корне поддерева, которому соответствует отрезок <tex>a_i..a_j</tex> хранится несогласованность <tex>d</tex>. Для того чтобы узнать истинное значение нужно «собрать» все несогласованности на пути от вершины к корню дерева: <tex>b_i = b'_i \odot \left(\bigodot\limits_k d_k \right)</tex>. То есть для этого необходимо, чтобы вторая операция <tex>\odot</tex> была ассоциативной. Если в вершине хранится истинное значение суммы, то
 +
<tex>d = \perp</tex> {{---}} нейтральный элемент относительно операции <tex>\odot</tex>.
  
 
== Массовые операции ==
 
== Массовые операции ==
 +
 +
Рассмотрим два примера: присваивание на отрезке и прибавление на отрезке.
 +
 +
=== Присваивание ===
 +
 +
<tex>a[i]..a[j] \leftarrow c</tex>
 +
 +
Для того, чтобы присвоить всем элементам на отрезке новое значение, его нужно, как в обычном запросе разбить на <tex>log n</tex> отрезков,
 +
которые соответствуют некоторым вершинам, и в соответствующие узлы добавить несогласованность: <tex>d_k \leftarrow c</tex>.

Версия 05:36, 17 апреля 2011

Несогласованные поддеревья

В несогласованном поддереве дерева отрезков в вершинах хранятся не истинные значения сумм на отрезках (по операции [math]\oplus[/math]). При этом в корне поддерева, которому соответствует отрезок [math]a_i..a_j[/math] хранится несогласованность [math]d[/math]. Для того чтобы узнать истинное значение нужно «собрать» все несогласованности на пути от вершины к корню дерева: [math]b_i = b'_i \odot \left(\bigodot\limits_k d_k \right)[/math]. То есть для этого необходимо, чтобы вторая операция [math]\odot[/math] была ассоциативной. Если в вершине хранится истинное значение суммы, то [math]d = \perp[/math] — нейтральный элемент относительно операции [math]\odot[/math].

Массовые операции

Рассмотрим два примера: присваивание на отрезке и прибавление на отрезке.

Присваивание

[math]a[i]..a[j] \leftarrow c[/math]

Для того, чтобы присвоить всем элементам на отрезке новое значение, его нужно, как в обычном запросе разбить на [math]log n[/math] отрезков, которые соответствуют некоторым вершинам, и в соответствующие узлы добавить несогласованность: [math]d_k \leftarrow c[/math].