Анализ рекурсивных алгоритмов

Содержание

Слайд 2

Рекурсия

Рекурсивный алгоритм – это алгоритм, в описании которого содержится обращение к самому

Рекурсия Рекурсивный алгоритм – это алгоритм, в описании которого содержится обращение к
себе.
Рекурсивная функция – функция, в теле которой присутствует вызов самой себя.
Рекурсия – фундаментальное математическое понятие. Она предполагает пошаговую организацию вычислительного процесса, где вычисления производятся по одному и тому же алгоритму, но каждый раз с меньшим объемом данных. Предыдущий этап не может завершиться, т.к. его результат вычисляется через результат этого же алгоритма, но с меньшим объемом данных.
Такая организация вычислительного процесса предполагает получение результата на последнем шаге. Затем производится возврат к предыдущим шагам до получения окончательного результата.

Слайд 3

Пример рекурсии. Вычисление факториала

static int Factorial(int x)
{
    if (x == 1)
    {
        return 1;
    }
    else
    {
        return x

Пример рекурсии. Вычисление факториала static int Factorial(int x) { if (x ==
* Factorial(x - 1);
    }
}

n! - факториал натурального числа n определяется как произведение всех натуральных  чисел от 1 до n включительно.
Формула: n!= n*(n-1)!
0!=1

Слайд 4

Рекурсивные вызовы

Factorial(3)

return 3 * Factorial(2)

Factorial(3)

return 3 * Factorial(2)

Factorial(3)

Factorial(2)

return 3 * Factorial(2)

Factorial(3)

Factorial(2)

return 2

Рекурсивные вызовы Factorial(3) return 3 * Factorial(2) Factorial(3) return 3 * Factorial(2)
* Factorial(1)

return 3 * Factorial(2)

Factorial(3)

Factorial(2)

return 2 * Factorial(1)

Factorial(1)

return 3 * Factorial(2)

Factorial(3)

Factorial(2)

return 2 * Factorial(1)

Factorial(1)

return 1

2

2

2

1

2

1

Слайд 5

Рекурсивные вызовы

return 3 * Factorial(2)

Factorial(3)

Factorial(2)

return 2 * Factorial(1)

Factorial(1)

return 1

2

1

1

return 3 *

Рекурсивные вызовы return 3 * Factorial(2) Factorial(3) Factorial(2) return 2 * Factorial(1)
Factorial(2)

Factorial(3)

Factorial(2)

return 2

2

2

return 3 * 2

Factorial(3)

6

Слайд 6

Построение оценки для рекурсивного алгоритма

static int Factorial(int x) Т(n)
{
    if (x == 1) 1
    {
        return 1; 1
    }
    else 1
    {
        return

Построение оценки для рекурсивного алгоритма static int Factorial(int x) Т(n) { if
x * Factorial(x - 1); Т(n-1)
    }
}
T(n)=T(n-1)+Ɵ(1)

Слайд 7

Методы решения рекуррентных отношений
Метод итераций
Дерево рекурсии
Основная теорема

Методы решения рекуррентных отношений Метод итераций Дерево рекурсии Основная теорема

Слайд 8

Метод итераций

На основании формулы T(n) записываем формулу для меньшего элемента, находящегося в

Метод итераций На основании формулы T(n) записываем формулу для меньшего элемента, находящегося
правой части формулы, например T(n-1).
Подставляем правую часть полученной формулы в исходную формулу
Выполняем первые два шага, пока не развернем формулу в ряд без функции T(n)
Оценим полученный ряд на основании арифметической или геометрической прогрессии

Слайд 9


Сумма n - первых членов арифметической прогрессии Sn=a1+a2+…+an
может быть найдена по формуле

Сумма n - первых членов арифметической прогрессии Sn=a1+a2+…+an может быть найдена по

где а1 — первый член прогрессии,  аn— член с номером n , n — количество суммируемых членов.
Числовая последовательность, каждый член которой, начиная со второго, равен предыдущему, умноженному на постоянное для этой последовательности число  q , называется геометрической прогрессией. Число q называется знаменателем прогрессии.  Любой член геометрической прогрессии вычисляется по формуле: bn =  b1  q n - 1 .
  Сумма  n  первых членов геометрической прогрессии вычисляется по формуле:
Бесконечно убывающая геометрическая прогрессия. Это геометрическая прогрессия, у которой  | q | < 1 . Сумма членов бесконечно убывающей геометрической прогрессии вычисляется по формуле:

Суммы прогрессий

Слайд 10

Метод итераций. Вычисление Factorial

T(n)=T(n-1)+1,
T(1)=1
T(n)=θ(g(n)), g(n)=?
T(n-1)=T(n-2)+1
T(n-2)=T(n-3)+1
T(n)= T(n-1)+1=
T(n-2)+1+1=
T(n-3)+1+1+1=…
Т(1) +n-1= n
T(n)=θ(n)

Асимптотическая оценка

Метод итераций. Вычисление Factorial T(n)=T(n-1)+1, T(1)=1 T(n)=θ(g(n)), g(n)=? T(n-1)=T(n-2)+1 T(n-2)=T(n-3)+1 T(n)= T(n-1)+1=
алгоритма вычисление факториала
Factorial(n) = θ(n)
Линейная зависимость скорости работы алгоритма от объема входных данных

Слайд 11

Сортировка слиянием (merge sort) – асимптотически оптимальный алгоритм сортировки сравнением, основанный на

Сортировка слиянием (merge sort) – асимптотически оптимальный алгоритм сортировки сравнением, основанный на
методе декомпозиции («разделяй и властвуй», decomposition)
Требуется упорядочить заданный массив A[1..n] по неубыванию (non-decreasing order) так, чтобы
?[1] ≤ ?[2] ≤ ⋯ ≤ ?[?]
Алгоритм включает два этапа
Разделение (partition) – рекурсивное разбиение массива на меньшие подмассивы, их сортировка
Слияние (merge) – объединение упорядоченных массивов в один

Анализ рекурсивных алгоритмов. Сортировка слиянием

Слайд 12

Разбиваем массив на две половины меньшего размера, пока размер массива больше 1
2.

Разбиваем массив на две половины меньшего размера, пока размер массива больше 1
Рекурсивно сортируем каждую половину
3. Сливаем два отсортированных массива

Сортировка слиянием

Слайд 13

void mergeSort (int a[], int l, int r) {
int mid;

void mergeSort (int a[], int l, int r) { int mid; if
if (l < r) {
mid = (l + r)/2;
mergeSort(a, l, mid);
mergeSort(a, mid +1, r);
merge(a, l, mid, r);
}
}

Сортировка слиянием

Слайд 14

Этап разделения

Этап разделения

Слайд 15

Этап слияния

Этап слияния

Слайд 16

Сортировка слиянием

Сортировка слиянием

Слайд 17

A1: 3, 4, 6, 11 A2: 2, 5, 7, 8
A: 2 2<3
A1: 3,

A1: 3, 4, 6, 11 A2: 2, 5, 7, 8 A: 2
4, 6, 11 A2: 5, 7, 8
A: 2, 3 3<5
A1: 4, 6, 11 A2: 5, 7, 8
A: 2, 3, 4 4<5
A1: 6, 11 A2: 5, 7, 8
A: 2, 3, 4, 5 5<6
A1: 6, 11 A2: 7, 8
A: 2, 3, 4, 5, 6 6<7
A1: 11 A2: 7, 8
A: 2, 3, 4, 5, 6, 7 7<11
A1: 11 A2: 8
A: 2, 3, 4, 5, 6, 7, 8 8<11
A: 2, 3, 4, 5, 6, 7, 8, 11

Слияние упорядоченных массивов

Слайд 18

void mergeSort (int a[], int l, int r) { T(n)
int mid; 1

void mergeSort (int a[], int l, int r) { T(n) int mid;
if (l < r) { 1
mid = (l + r)/2; 1
mergeSort(a, l, mid); T(n/2)
mergeSort(a, mid +1, r); T(n/2)
merge(a, l, mid, r); n
}
}

Анализ рекурсивных алгоритмов. Сортировка слиянием

Слайд 19

Рекуррентное соотношение - это соотношение содержащее функцию Т(n) в левой и правой

Рекуррентное соотношение - это соотношение содержащее функцию Т(n) в левой и правой
части выражения

Дерево рекурсии: T(n) = 2*T(n/2) +cn, с –const, c>0

Рекуррентное соотношение

Слайд 20

Дерево рекурсии для
T(n) = 2*T(n/2) + cn

Дерево рекурсии

Дерево рекурсии для T(n) = 2*T(n/2) + cn Дерево рекурсии

Слайд 21

Дерево рекурсии

Дерево рекурсии

Слайд 22

Дерево рекурсии

Дерево рекурсии

Слайд 23

T (n) = Θ(n · log2(n))

Дерево рекурсии

T (n) = Θ(n · log2(n)) Дерево рекурсии

Слайд 24

Сравнение алгоритмов сортировки
Сортировка вставками – Θ(n2)
Сортировка слиянием - Θ(n * log2(n))

Сравнение алгоритмов сортировки Сортировка вставками – Θ(n2) Сортировка слиянием - Θ(n * log2(n))

Слайд 25

Дерево рекурсии

Дерево рекурсии - графический метод, который отображает разворачивание рекуррентного соотношения в

Дерево рекурсии Дерево рекурсии - графический метод, который отображает разворачивание рекуррентного соотношения
систему рекурсивных вызовов
T(n)=2T(n/2)+n2
n2
T(n/2) T(n/2)

Слайд 26

Дерево рекурсии

T(n)=2T(n/2)+n2
n2
(n/2)2 (n/2)2
T(n/4) T(n/4) T(n/4) T(n/4)

Дерево рекурсии T(n)=2T(n/2)+n2 n2 (n/2)2 (n/2)2 T(n/4) T(n/4) T(n/4) T(n/4)

Слайд 27

Дерево рекурсии

T(n)=2T(n/2)+n2
n2 n2
(n/2)2 (n/2)2 log n (1/2)*n2
(n/4)2 (n/4)2 (n/4)2 (n/4)2 (1/4)*n2
T(n)=θ(n2)

Дерево рекурсии T(n)=2T(n/2)+n2 n2 n2 (n/2)2 (n/2)2 log n (1/2)*n2 (n/4)2 (n/4)2 (n/4)2 (n/4)2 (1/4)*n2 T(n)=θ(n2)

Слайд 28

Сумма: по уровням
(1 + 1/2 + 1/4 + . . . +

Сумма: по уровням (1 + 1/2 + 1/4 + . . .
1/2k + . . .)n2 =?
b1=1, q= 1/2
T(n)=θ(n2)

Подсчет оценки

Слайд 29

Дерево рекурсии

Дерево рекурсии

Слайд 30

Дерево рекурсии

Дерево рекурсии

Слайд 31

Сумма: по уровням
(1 + 5/16 + 25/256 + . . . +

Сумма: по уровням (1 + 5/16 + 25/256 + . . .
5k/16k + . . .)n2 =?
b1=1, q= 5/16
T(n)=θ(n2)

Подсчет оценки

Слайд 32

T (n) = aT (n/b) + f (n), a ≥ 1, b

T (n) = aT (n/b) + f (n), a ≥ 1, b
> 1, f (n) − (f (n) > 0, n > n0)

Основная теорема о рекуррентных оценках

Слайд 33

1.
T (n) = 4T (n/2) + n
a=4, b=2, f(n)=n
При ε=1 выполняется условие

1. T (n) = 4T (n/2) + n a=4, b=2, f(n)=n При
для первого случая теоремы
T(n)=θ(n2)

Подсчет оценки

Слайд 34

2.
T (n) = 4T (n/2) + n2
a=4, b=2, f(n)=n2
второй случай теоремы
T(n)=θ(n2*log n)

Подсчет

2. T (n) = 4T (n/2) + n2 a=4, b=2, f(n)=n2 второй
оценки
Имя файла: Анализ-рекурсивных-алгоритмов.pptx
Количество просмотров: 39
Количество скачиваний: 0