Двумерные структуры данных: различия между версиями
KiKoS (обсуждение | вклад) (Новая страница: «В случае, если наша задача задана в 2d пространстве, мы можем делать много странных вещей...») |
KiKoS (обсуждение | вклад) м |
||
Строка 6: | Строка 6: | ||
В вершине дерева отрезков можно хранить не только число, но еще и другое дерево отрезков. Обобщать это на многомерные случаи не очень приятно, но применимо к 2д задачам это выглядит примерно так: | В вершине дерева отрезков можно хранить не только число, но еще и другое дерево отрезков. Обобщать это на многомерные случаи не очень приятно, но применимо к 2д задачам это выглядит примерно так: | ||
− | < | + | <syntaxhighlight lang='c++' line='line'> |
int get_inside(int v, int tl, int tr, int l, int r, segtree_outside &root) { | int get_inside(int v, int tl, int tr, int l, int r, segtree_outside &root) { | ||
if (tl >= r || l >= tr) { | if (tl >= r || l >= tr) { | ||
Строка 28: | Строка 28: | ||
return min(get_outside(2 * v, tl, tm, l, r, a, b), get_outside(2 * v + 1, tm, tr, l, r, a, b)); | return min(get_outside(2 * v, tl, tm, l, r, a, b), get_outside(2 * v + 1, tm, tr, l, r, a, b)); | ||
} | } | ||
− | </ | + | </syntaxhighlight> |
====Dynamic merge sort tree==== | ====Dynamic merge sort tree==== | ||
Строка 35: | Строка 35: | ||
====Фенвик==== | ====Фенвик==== | ||
В большом числе страшных двумерных структур есть возможность реализовать внешнюю структуру через [дерево Фенвика]. Такой подход сильно упростит код для задачи, а еще сильно ускорит его по времени. К примеру, для dynamic merge sort tree мы вполне могли обойтись Фенвиком декартачей. Согласитесь, что писать такой код куда проще. | В большом числе страшных двумерных структур есть возможность реализовать внешнюю структуру через [дерево Фенвика]. Такой подход сильно упростит код для задачи, а еще сильно ускорит его по времени. К примеру, для dynamic merge sort tree мы вполне могли обойтись Фенвиком декартачей. Согласитесь, что писать такой код куда проще. | ||
+ | |||
+ | {{Автор|Константин Амеличев|kik0s}} | ||
+ | [[Категория:Многомерные структуры данных]] |
Версия 20:28, 18 сентября 2019
В случае, если наша задача задана в 2d пространстве, мы можем делать много странных вещей со структурами. По сути, мы хотим комбинировать их между собой и использовать в каждый момент времени ту, которая будет эффективнее и удобнее.
Как считать время и память для таких структур? Пусть у нас есть структуры $A, B$, с затратами на время и память $time_A, time_B, memory_A, memory_B$. Тогда общая сложность по времени и памяти для структуры А, которая хранит в каждой своей ячейке структуру B — это $O(time_A \cdot time_B), O(memory_A \cdot memory_B)$.
Двумерное дерево отрезков
В вершине дерева отрезков можно хранить не только число, но еще и другое дерево отрезков. Обобщать это на многомерные случаи не очень приятно, но применимо к 2д задачам это выглядит примерно так:
1 int get_inside(int v, int tl, int tr, int l, int r, segtree_outside &root) {
2 if (tl >= r || l >= tr) {
3 return INT32_MAX;
4 }
5 if (l <= tl && tr <= r) {
6 return root.t[v].val;
7 }
8 int tm = (tl + tr) / 2;
9 return min(get_inside(2 * v, tl, tm, l, r, root), get_inside(2 * v + 1, tm, tr, l, r, root));
10 }
11
12 int get_outside(int v, int tl, int tr, int l, int r, int a, int b) {
13 if (tl >= r || l >= tr) {
14 return INT32_MAX;
15 }
16 if (l <= tl && tr <= r) {
17 return get_inside(1, 0, n - 1, a, b, t[v]);
18 }
19 int tm = (tl + tr) / 2;
20 return min(get_outside(2 * v, tl, tm, l, r, a, b), get_outside(2 * v + 1, tm, tr, l, r, a, b));
21 }
Dynamic merge sort tree
Если мы хотели в каждой вершине дерева отрезков поддерживать отсортированный подотрезок массива, а также делать запросы на изменение значений, то можно написать что-то типа merge sort tree, но в каждой вершине хранить декартово дерево, а не массив.
Фенвик
В большом числе страшных двумерных структур есть возможность реализовать внешнюю структуру через [дерево Фенвика]. Такой подход сильно упростит код для задачи, а еще сильно ускорит его по времени. К примеру, для dynamic merge sort tree мы вполне могли обойтись Фенвиком декартачей. Согласитесь, что писать такой код куда проще.
Автор конспекта: Константин Амеличев
По всем вопросам пишите в telegram @kik0s