День 8. Кучи (5 января)
Лектор: [Сережа.K]
- Биномиальная куча
- Определение биномиального дерева, кучи
- Merge за O(logn)
- Merge → Add, ExtractMin
- Build за O(n), Add за амортизированную O(1)
- Использование: ориентированный остов минимального веса с фиксированным корнем
- Куча Фибоначчи
- Add за O(1), Merge за O(1), ExtractMin за O(logn)
- DecreaseKey за O(1), Дейкстра за O(m + nlogn)
- Доказательство DecreaseKey: size[k] ≥ φk, потенциал равен R+2M.
- Цифровые алгоритмы. Веса целые от 1 до C.
- Алгоритм Диала за O(m + nC). Применение для вещественных весов. Разбор задачи с контеста.
- Radix Heap, Дейкстра за O(m + nlogC)
- В алгоритме Диала наиболее долгая операция − поиск не пустой очереди
- Общая идея: храним бакеты вершин с расстоянием из [D, D+X), если X=1, минимум можно вытащить за O(1), иначе "разгружаем бакет"
- При разгрузке бакета для каждой вершины v величина ind[v] "номер бакета в котором находится вершина" только убывает, поэтому суммарное время O(nlogC)
- Two Level Radix Heap и Hot Heap, Дейкстра за O(m + nsqrt(logC))
- Two Level: систему 2i заменим на систему ki, k выберем равным loglogC, получим O(m + nlogC/loglogC)
- Идея Hot Heap: если в бакете, который мы разгружаем не более t вершин, то построим кучу Фибоначчи и, пока количество вершин не более t, не будем разгружать.
- t = k = 2sqrtlogC, получим O(m+nsqrtlogC)
- Идея на будущее для получения O(m+n(logC)1/3)