1. Практическое занятие 10.
Разделяй и властвуй
1.
2.
3.
4.
Теоретические сведения
Контрольные вопросы
Указания по выполнению заданий
Задания
2. Теоретические сведения
Один из широко используемых подходов к разработке алгоритмов
носит название метода разбиения (или, неформально,
«разделяй и властвуй»). Алгоритмы, разработанные с помощью
этого метода, имеют рекурсивную структуру: для решения
данной задачи они рекурсивно вызывают сами себя один или
несколько раз, чтобы решить вспомогательную задачу,
имеющую непосредственное отношение к поставленной задаче.
Одно из преимуществ таких алгоритмов заключается в том, что
время их работы часто легко определяется с помощью
рекуррентных соотношений.
Парадигма, лежащая в основе метода декомпозиции «разделяй и
властвуй», на каждом уровне рекурсии включает в себя три
этапа.
1. Разделение задачи на несколько подзадач.
2. Покорение — рекурсивное решение этих подзадач. Когда объем
подзадачи достаточно мал, выделенные подзадачи решаются
непосредственно.
3. Комбинирование решения исходной задачи из решений
вспомогательных задач.
3. Теоретические сведения
Если алгоритм рекурсивно обращается к самому себе, время его
работы часто описывается с помощью рекуррентного уравнения,
или рекуррентного соотношения, в котором полное время,
требуемое для решения всей задачи с объемом ввода n,
выражается через время решения вспомогательных подзадач.
Затем данное рекуррентное уравнение решается с помощью
определенных математических методов, и устанавливаются
границы производительности алгоритма.
Обозначим через T(n) время решения задачи, размер которой равен
n. Если размер задачи достаточно мал, скажем, n ≤ c, где c –
некоторая заранее известная константа, то задача решается
непосредственно в течение определенного фиксированного
времени, которое мы обозначим через Θ(1).
Предположим, что наша задача делится на a подзадач, объем
каждой из которых равен 1/b от объема исходной задачи. Если
разбиение задачи на вспомогательные подзадачи происходит в
течение времени D(n), а объединение решений подзадач в
решение исходной задачи – в течение времени C(n), то мы
получим такое рекуррентное соотношение:
(
Θ 1), n ≤ c,
T ( n) =
aT ( n / b) + D ( n) + C ( n), n > c.
4. Теоретические сведения
Пример 1. Алгоритм вычисления факториала целого
числа N. Факториал числа N равен N, умноженному на
факториал числа N – 1.
Factorial(N)
1. if N = l then return 1
2. else
3. smaller ← N – l
4. answer ← Factorial(smaller)
5. return N * answer
рекуррентное соотношение на количество вычислений в
функции Factorial:
0
1
,N ≤,
T ( N ) =
T
1
1 1
1
(N − ) + + , N > .
5. Теоретические сведения
Пример 2. Алгоритм нахождения максимального элемента множества
S = {s1, s2, …, sn}, |S| = n ≥ 2, с применением стратегии «разделяй
и властвуй».
Max(S)
1. if |S| = 2
2. if s1 > s2 then return s1
3. else return s2
4. else
5. Разбить S на два подмножества S1 и S2 (S = S1 ∪ S2, S1 ∩ S2 =
∅)
6. max1 = Max(S1)
7. max2 = Max(S2)
8. if max1 > max2 then return max1
9. else return max2
Рекуррентное соотношение на число сравнений в зависимости от n = |
S| в этом случае определяется следующим образом:
1,
2
n =,
T ( n) =
2
1
2
T ( n / 2) + , n > .
6. Теоретические сведения
Пример 3. Алгоритм умножения n-разрядных двоичных чисел. Пусть x и y
– два n-разрядных двоичных числа (для простоты будем считать, что n
есть степень 2). Разобьем x и y на две равные части x = (a, b), y = (c, d).
Если рассматривать каждую из этих частей как (n/2)-разрядное число,
то можно представить произведение чисел x и y в виде
xy = (a2n/2 + b)(c2n/2 + d) = ac2n + (ad + bc)2n/2 + bd.
Полученное равенство x и y с помощью четырех умножений (n/2)разрядных чисел и нескольких сложений и сдвигов.
Пример 4. Сортировка слиянием. Этот алгоритм также основан на
принципе «разделяй и властвуй». Его выполнение заключается в
выполнении следующих шагов.
1. Разделить неупорядоченную n-элементную входную
последовательность на две неупорядоченные подпоследовательности
по n/2 элементов каждая.
2. Рекурсивно сортировать каждую из двух подпоследовательностей.
Если подпоследовательность содержит только один элемент, то эту
подпоследовательность не нужно рекурсивно сортировать, т.к. один
элемент уже является отсортированным.
3. Объединить две отсортированные последовательности с помощью
слияния их в отсортированный результат.
7. Контрольные вопросы
1.
2.
3.
4.
5.
6.
Принцип «разделяй и властвуй».
Структура алгоритмов, основанных на «разделяй и властвуй».
Разбиение.
Покорение.
Комбинирование.
Рекуррентные соотношения для алгоритмов «разделяй и
властвуй».
7. Рекуррентное соотношение для оценки времени вычисления
факториала целого числа.
8. Рекуррентное соотношение для оценки времени нахождения
максимального элемента множества.
9. Этапы выполнения алгоритма умножения по принципу «разделяй и
властвуй».
10. Рекуррентное соотношение для оценки времени сортировки
слиянием.
8. Указания по выполнению заданий
1.
2.
3.
4.
Получить задание
Получить решение задачи.
Подготовить отчет по выполнению задания.
Отчет должен включать задание и описание
этапов выполнения задания.
Ответить на вопросы по выполнению задания и
контрольные вопросы