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

15.

Теорема для решения рекуррентных


соотношений - Master-theorem.
Рекуррентными называются такие зависимости, в которых последующие значения
могут быть вычислены на основании предыдущих значений.
Примеры рекуррентных соотношений - рекурсивные функции(это функции,
которые вызывают сами себя) , последовательность Фибоначчи(первые слагаемые
этой последовательности 0 и 1 , а каждое последующее слагаемое представляет
собой сумму двух предыдущих), факториал.
Два способа рекуррентных вычислений: • Итерация – обход в циклах • Рекурсия – рекурсивные
вызовы метода.
Основная теорема о рекуррентных соотношениях – Master-theorem. Master-theorem
используется в анализе алгоритмов для получения асимптотической оценки рекурсивных
соотношений , часто возникающих при анализе алгоритмов типа «разделяй и властвуй»),
например, при оценке времени их выполнения.
16.Алгоритм «Разделяй и властвуй»
Разделяй и властвуй (англ. divide and conquer) – алгоритм, заключающийся
в рекурсивном разбиении решаемой задачи на две или более подзадачи того же
типа, но меньшего размера, и комбинировании их решений для получения ответа
к исходной задаче; разбиения выполняются до тех пор, пока все подзадачи не
окажутся элементарными.

В этом определении следует пояснить понятие рекурсии. Самый простой


вариант увидеть рекурсию – это навести Web-камеру на экран монитора
компьютера, естественно, предварительно её включив. Таким образом, камера
будет записывать изображение экрана компьютера, и выводить его же на этот
экран, получится что-то вроде замкнутого цикла. В итоге мы будем наблюдать
нечто похожее на тоннель.

Рекурсия – это определение объекта через самого себя, т.е. если мы


рекурсивно определяем функцию, то она вызывает саму себя, непосредственно (в
своём теле) или косвенно (через другую функцию).

Типичным является применение парадигмы «разделяй и властвуй» в


алгоритмах сортировки . Например, алгоритм сортировки слиянием. Чтобы
отсортировать массив чисел по возрастанию, он разбивается на две равные
части, каждая сортируется, затем отсортированные части сливаются в одну. Эта
процедура применяется к каждой из частей до тех пор, пока сортируемая часть
массива содержит хотя бы два элемента (чтобы можно было её разбить на две
части). Время работы этого алгоритма составляет Θ(nlogn) операций, тогда как
более простые алгоритмы требуют Θ(n2) времени, где — размер исходного
массива.

Другие примеры важных алгоритмов, в которых применяется парадигма


«разделяй и властвуй»:

 двоичный поиск;
 метод бисекции;
 быстрая сортировка;
 быстрое преобразование Фурье;
 алгоритм Карацубы .

17.Жадные алгоритмы
Жадный алгоритм .В жадном алгоритме всегда делается выбор, который
кажется самым лучшим в данный момент - т.е. производится локально
оптимальный выбор в надежде, что он приведет к оптимальному решению
глобальной задачи. Жадные алгоритмы не всегда приводят к оптимальному
решению, но во многих задачах они дают нужный результат. Жадный алгоритм
обладает достаточной мощью и хорошо подходит для широкого класса задач.
Алгоритмы поиска минимальных остовных деревьев являются классическим
примером применения жадного метода.

Признаки того, что задачу возможно решить при помощи жадного


алгоритма:

1. задачу можно разбить на подзадачи;


2. величины, рассматриваемые в задаче, можно дробить так же на подзадачи;
3. сумма оптимальных решений для двух подзадач даст оптимальное решения для
всей задачи.

Среди известных алгоритмов, в которых применяется жадная стратегия


выделим :

 Алгоритм Хаффмана (адаптивный алгоритм оптимального


префиксного кодирования алфавита с минимальной избыточностью).
 Алгоритм Краскала (поиск остовного леса минимального веса в
графе).
 Алгоритм Прима (поиск остовного дерева минимального веса в
связном графе).
 Обобщением жадных алгоритмов является алгоритм Радо –
Эдмондса.
18.Минимальное остовное дерево.
Алгоритм Крускала
Остовным деревом графа называется дерево, которое можно получить из него
путём удаления некоторых рёбер. У графа может существовать несколько остовных
деревьев, и чаще всех их достаточно много.

Для взвешенных графов существует понятие веса остовного дерева, которое


определено как сумма весов всех рёбер, входящих в остовное дерево. Из него
натурально вытекает понятие минимального остовного дерева - остовного
дерева с минимальным возможным весом.

Для нахождения минимального остовного дерева графа существуют два основных


алгоритма: алгоритм Прима и алгоритм Крускала.

Алгоритм Крускала - это алгоритм минимального остовного дерева, что принимает граф в
качестве входных данных и находит подмножество ребер этого графа, который формирует
дерево, включающее в себя каждую вершину, а также имеет минимальную сумму весов среди
всех деревьев, которые могут быть сформированы из графа. Они оба имеют
сложность O(MlogN)O(Mlog⁡N), поэтому выбор одного из них зависит от ваших личных
предпочтений.

Как работает алгоритм Крускала


Он подпадает под класс алгоритмов, называемых «жадными» алгоритмами , которые
находят локальный оптимум в надежде найти глобальный оптимум.

Мы начинаем с ребер с наименьшим весом и продолжаем добавлять ребра, пока не


достигнем нашей цели.

Шаги для реализации алгоритма Крускала следующие:

1. Сортировать все ребра от малого веса до высокого.


2. Возьмите ребро с наименьшим весом и добавьте его в остовное дерево. Если
добавление ребра создало цикл, то отклоните это ребро.
3. Продолжайте добавлять ребра, пока не достигнете всех вершин.
19. Алгоритм Прима
Алгоритм Прима - это алгоритм минимального остовного дерева, что принимает граф в
качестве входных данных и находит подмножество ребер этого графа, который формирует
дерево, включающее в себя каждую вершину, а также имеет минимальную сумму весов среди
всех деревьев, которые могут быть сформированы из графа.

Как работает алгоритм Прима


Он подпадает под класс алгоритмов, называемых «жадными» алгоритмами , которые
находят локальный оптимум в надежде найти глобальный оптимум.

Мы начинаем с одной вершины и продолжаем добавлять ребра с наименьшим весом, пока не


достигнем нашей цели.

Шаги для реализации алгоритма Прима следующие:

1. Инициализируйте минимальное остовное дерево с произвольно выбранной вершиной.


2. Найдите все ребра, которые соединяют дерево с новыми вершинами, найдите
минимум и добавьте его в дерево.
3. Продолжайте повторять шаг 2, пока не получите минимальное остовное дерево.

Пример алгоритма Прима