1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6

# конспект · шаг 6 из 6

Конспект: схема и её стоимость

выжимка - её можно унести в заметки

Понятия

Разделяй и властвуй - три шага: разделить задачу на a подзадач размера n/b, решить их рекурсивно, объединить ответы.

цена:  T(n) = a·T(n/b) + f(n)
       a    - сколько подзадач
       b    - во сколько раз каждая меньше
       f(n) - ВСЯ работа вне рекурсии: деление плюс объединение

Порог - размер куска, ниже которого выгоднее простой алгоритм без рекурсии (в библиотеках 16-64 элемента). Снизу вверх - развёртка рекурсии в цикл по удваивающимся кускам.

Что унести

Главная теорема читает формулу одним сравнением n^(log_b a) с f(n):

режим условие ответ где лежит время
листья тяжелее f(n) растёт медленнее Θ(n^(log_b a)) внизу, в мелких подзадачах
поровну f(n) = Θ(n^(log_b a)) Θ(n^(log_b a)·log n) ровно по уровням
корень тяжелее f(n) растёт быстрее Θ(f(n)) на верхнем уровне
2·T(n/2) + n    → Θ(n·log n)     сортировка слиянием, максимальный подотрезок
1·T(n/2) + 1    → Θ(log n)       двоичный поиск
1·T(n/2) + n    → Θ(n)           сумма n + n/2 + n/4 + ... < 2n
4·T(n/2) + n    → Θ(n²)          наивное умножение матриц
3·T(n/2) + n    → Θ(n^1.585)     Карацуба: одно умножение сэкономлено
2·T(n/2) + n²   → Θ(n²)          деление не дало ничего

Выигрыш даёт дешёвое объединение, а не деление само по себе. Убивают его три вещи: дорогое объединение, слишком много подзадач и слишком мелкое дробление. Первые две видны в асимптотике, третья - только в замере.

Схема требует НЕЗАВИСИМЫХ подзадач. Перекрываются - получится экспонента: F(n) = F(n−1) + F(n−2) честным делением считается за 1.618^n, хотя ответ линеен. Это признак динамического программирования.

Приёмы поверх схемы: развернуть рекурсию в цикл снизу вверх (нет стека и вызовов, но на размерах не кратных степени двойки нужен min по границе); завести ОДИН буфер снаружи рекурсии; считать независимые половины параллельно (потолок ускорения ставит последовательное объединение); делить на неравные части можно, но тогда цену считают деревом, а не теоремой.

Тихие ошибки: mid = (lo + hi) // 2 переполняется в языках с фиксированными целыми; рекурсия до одного элемента вместо порога; буфер внутри рекурсии; забытый базовый случай; главная теорема, применённая к частям разного размера.

Куда это ведёт

Следующая глава - умножение: Карацуба и Штрассен. Там видно, как экономия ОДНОГО умножения меняет a в формуле и вместе с ним порядок роста - n² превращается в n^1.585.

Комментарии

Пока нет комментариев. Будь первым!

Оставить комментарий

Комментарий появится после проверки. Email не публикуется. Войти, чтобы не вводить имя каждый раз.