
- •Граф. Ориентированный граф. Представления графа. Обход графа в глубину и в ширину.
- •Топологическая сортировка. Подсчет числа путей в орграфе.
- •Сильно связные компоненты.
- •Поиск кратчайших путей в графе. Алгоритм Флойда. Алгоритм Дейкстры. Алгоритм Форда-Беллмана.
- •Алгоритм a*. Эвристики.
- •Минимальное остовное дерево. Алгоритм Прима. Биномиальная куча.
- •Амортизационная стоимость. Фибоначчиева куча. Амортизационная стоимость (анализ)
- •Метод потенциалов
- •Фибоначчиева Куча
- •Структура
- •Время работы
- •Система непересекающихся множеств. Алгоритм Крускала.
- •Наивная реализация
- •Эвристика сжатия пути
- •Эвристика объединения по рангу
- •Потоки, Форда-Фалкерсона.
- •Декартово дерево
- •Дерево Фенвика. Дерево отрезков и динамическое программирование для rmq.
- •Сведение rmq к lca и наоборот.
- •Препроцессинг
- •Ответы на запросы
- •Алгоритм
- •Доказательство
- •Сложность
- •Алгоритм
- •Минимум внутри блока
- •Результат
- •Поиск нескольких минимумов на отрезке. Задача поиска подстрок. Алгоритм Рабина-Карпа. Конечный автомат. Алгоритм Бойера-Мура.
- •Метод хеширования
- •Алгоритм
- •Время работы
- •Алгоритм Бойера-Мура
- •Поиск со звездочками. Алгоритм Кнута-Морриса-Пратта.
- •Время работы
- •Алгоритм Ахо-Корасика.
- •Дерево ключевых слов (бор)
- •Пример дерева ключевых слов (бора)
- •Построение бора
- •Поиск строки в бору
- •Автомат Ахо-Корасик
- •Суффиксное дерево, Алгоритм Укконена.
- •2. Квадратичный алгоритм
- •3. Линейный алгоритм
- •Суффиксный массив.
- •Наивный алгоритм поиска
- •Алгоритм, использующий префиксы циклических сдвигов
- •Исключения
- •Шаблоны
- •Stl: итераторы
- •Сортировка и поиск в stl. Алгоритмы stl
- •Куча в stl. Алгоритмы stl.
- •Ассоциативный массив. Интерфейс, варианты реализации.
Доказательство
Теорема: |
= . |
Доказательство: |
|
Положим Заметим,
что
и
Суммируя,
получаем, что
имеет
минимальное значение на отрезке,
покрывающем
,
и принадлежит отрезку
,
отсюда |
|
Сложность
Следующий алгоритм строит
декартово дерево за
.
Используя Сведение
задачи LCA к задаче RMQ, получаем: препроцессинг
для
—
и
ответ на запрос —
.
В итоге получили
с
построением за
и
ответом на запрос за
.
Процесс построения дучи по массиву:
Stack.push(A[0])
For (i = 1; i < n; i++)
If(A[i] >= A[stack.top])
s.top()->right = i;
s.push(i);
else
while(A[i] < A[s.top])
cur = s.top();
s.pop();
i->left = cur;
s.top()->right = I;
s.push(i);
Restricted RMQ
Алгоритм
Фарака-Колтона, Бендера (алгоритм
Фарах-Колтона, Бендера) —
применяется для решения за
времени
специального случая задачи RMQ (поиск
минимума на отрезке), в котором соседние
элементы входной последовательности
различаются на ±1. Может быть использован
также для решения
задачи LCA.
Вход: последовательность
длины
,
соседние элементы которой отличаются
на ±1.
Выход: ответы
на онлайн запросы вида «позиция минимума
на отрезке
».
Алгоритм
Части, из которых состоит ответ на запрос RMQ
Данный
алгоритм основывается на методе решения
задачи RMQ с помощью разреженной
таблицы (sparse table, ST) за
.
Чтобы
избавиться от логарифма используется
предподсчёт ответа для небольших
подстрок входной последовательности.
Разделим последовательность
на
блоки длины
.
Для каждого блока вычислим минимум на
нём и определим
как
позицию минимального элемента в
-том
блоке.
На новой последовательности построим разреженную таблицу. Теперь для ответа на запрос RMQ , если и находятся в разных блоках, нам необходимо вычислить следующее:
минимум на отрезке от до конца содержащего блока;
минимум по всем блокам, находящимся между блоками, содержащими и ;
минимум от начала блока, содержащего , до .
Ответом на запрос будет позиция меньшего из эти трёх элементов.
Второй элемент мы уже умеем находить за с помощью и ST. Осталось научиться находить минимум по отрезку, границы которого не совпадают с границами блоков.
Минимум внутри блока
Утверждение: |
Если
две последовательности |
Таким образом, мы можем нормализовать блок, вычтя из всех его элементов первый. Тем самым мы значительно уменьшим число возможных типов блоков.
Утверждение: |
Существует |
|
Соседние
элементы в блоках отличаются на ±1.
Первый элемент в нормализованном
блоке всегда равен нулю. Таким образом,
каждый нормализованный блок может
быть представлен ±1-вектором длины |
|
Осталось
создать
таблиц
— по одной для каждого типа блока. В
такую таблицу необходимо занести
предподсчитанные ответы на все возможные
запросы минимума внутри блока
соответствующего типа, коих
.
Для каждого блока в
необходимо
заранее вычислить его тип. Таким образом
мы получили возможность отвечать на
запрос минимума по любой части блока
за
,
затратив на предподсчёт
времени.