Вы находитесь на странице: 1из 14

Алгоритмы и структуры

данных
Лекция 5
29.09.2023
Метод «Разделяй и властвуй»
• Разделение задачи на несколько подзадач, которые
представляют собой меньшие экземпляры той же задачи
• Властвование над задачами путем их рекурсивного решения.
Если размеры задачи малы, они могут решаться непосредственно
• Комбинирование решений подзадач в решение исходной задачи
Основной метод (master method)
• Расматриваем функции вида T(n)=aT(n/b)+f(n)
Доказательство теоремы
Рассмотрим дерево рекурсии данного соотношения. Всего в нем будет log 𝑏 𝑛 уровней.
На каждом таком уровне, количество детей в дереве будет умножаться на 𝑎, так на уровне 𝑖 будет 𝑎𝑖 детей. Также известно, что каждый ребенок
𝑖 𝑖 𝑛 𝑐
на уровне 𝑖 размера 𝑛/𝑏 . Ребенок размера (𝑛/𝑏 ) требует 𝑂( 𝑖 ) дополнительных затрат, поэтому общее количество совершенных действий
𝑏
𝑛 𝑐 𝑎 𝑖
на уровне 𝑖 ∶ 𝑂(𝑎𝑖 𝑖 ) = 𝑂(𝑛𝑐 (𝑎𝑖 /𝑏𝑖𝑐 )) = 𝑂(𝑛𝑐 𝑐 )
𝑏 𝑏
𝑎 𝑖
Заметим, что количество операций увеличивается, уменьшается и остается константой, если увеличивается, уменьшается или остается
𝑏𝑐
константой соответственно.
Поэтому решение разбивается на три случая, когда 𝑎/𝑏𝑐 больше 1, равна 1 или меньше 1. 𝑎𝑏𝑐 = 1 ⇔ 𝑎 = 𝑏𝑐 ⇔ log 𝑏 𝑎 = 𝑐 log 𝑏 𝑏 ⇔ log 𝑏 𝑎 = 𝑐.

log 𝑛 𝑎 𝑖 log 𝑛 𝑎 𝑖
Распишем всю работу в течение рекурсивного спуска: 𝑇(𝑛) = σ𝑖=0𝑏 𝑂( 𝑛𝑐 ⋅ ) + 𝑂(1) = 𝑂(𝑛𝑐 ⋅ σ𝑖=0𝑏 )
𝑏𝑐 𝑏𝑐

Откуда получаем:

• 𝑐 > log 𝑏 𝑎 ⇒ 𝑇(𝑛) = 𝑂(𝑛𝑐 ) (так как


𝑎 𝑖
𝑏𝑐
убывающая геометрическая прогрессия)

• log 𝑛
𝑐 = log 𝑏 𝑎 ⇒ 𝑇 𝑛 = σ𝑖=0𝑏 𝑛𝑐
𝑎 𝑖
𝑏𝑐
= 𝑛𝑐 ⋅ σ𝑖=0𝑏
log 𝑛𝑎 𝑖
𝑏𝑐
log 𝑛
= 𝑛𝑐 ⋅ σ𝑖=0𝑏 1 = 𝑛𝑐 + 𝑛𝑐 log 𝑏 𝑛 = 𝑂(𝑛𝑐 log 𝑛)

• log𝑏 𝑎
log 𝑛
𝑐 < log 𝑏 𝑎 ⇒ 𝑇 𝑛 = σ𝑖=0𝑏 𝑛𝑐
𝑎 𝑖
𝑏𝑐
=
log 𝑛 𝑎 𝑖
𝑛𝑐 ⋅ σ𝑖=0𝑏 𝑏𝑐 = 𝑂 𝑛𝑐 ⋅
𝑎 log𝑏 𝑛
𝑏𝑐
, но = 𝑛𝑐
𝑎 log𝑏 𝑛
𝑏𝑐
= 𝑛𝑐
𝑎log𝑏 𝑛
𝑏log𝑏 𝑛
= 𝑛𝑐
𝑛log𝑏 𝑎
𝑛log𝑏 𝑐
=
𝑛
Quick sort
• Выбор осевого элемента
• Слева- все меньшие, справа – все большие
• Порядок не важен!
QuickSort(list, first, last)
if first < last:
pivot = PivotList(list, first, last)
QuickSort(list, first, pivot - 1)
QuickSOrt(list, pivot, last)
Сортировка подсчетом
• Линейное время – уход от сравнений
QuickSort
• Выбор Pivot – слабое место
• Сложность в худшем случае – O(n2)
• Сложность в среднем – O(nlog n)
Медиана за линейное время
Медиана за линейное время
Медиана за линейное время
Медиана за линейное время
• Количество элементов, не превышающих Х:

• К шестому шагу остается


Линейная оценка
Поиск максимального подмассива
• В данном произвольном массиве требуется найти непрерывный
подмассив с максимальной суммой
• Наивный перебор: n(n-1)/2
Разделяю и властвую
• Разделяй: подмассив располагается в левой, правой или
средней(!) частях
• Средняя часть: поиск максимальных подмассивов А[i..mid] и
A[mid+1..j], склеивание, линейное время!
• Властвуй: рекурсия работает
• Время работы: T(n) = 2T(n/2)+O(n)
• Неоптимальный алгоритм, CLRS 4.1.5

Вам также может понравиться