SlideShare a Scribd company logo
1 of 23
Download to read offline
Лекция 12:
Динамическое программирование.
Жадные алгоритмы.
Курносов Михаил Георгиевич
к.т.н. доцент Кафедры вычислительных систем
Сибирский государственный университет
телекоммуникаций и информатики
http://www.mkurnosov.net
Контроль
2
1. В чем основная идея метода декомпозиции?
2. Дать оценку трудоемкости алгоритма быстрой
сортировки с использованием обобщённого
рекуррентного уравнения декомпозиции.
Основные методы разработки алгоритмов
33
Метод грубой силы (brute force, исчерпывающий поиск –
полный перебор).
Декомпозиция (decomposition, “разделяй и властвуй”)
Уменьшение размера задачи (“уменьшай и властвуй”)
Преобразование (“преобразуй и властвуй”)
Жадные алгоритмы (greedy algorithms)
Динамическое программирование (dynamic programming)
Поиск с возвратом (backtracking)
Локальный поиск (local search)
Динамическое программирование
44
Динамическое программирование (Dynamic
programming) – метод решения задач (преимущественно
оптимизационных) путем разбиения их на более простые
подзадачи. Решение идет от простых подзадач к сложным,
периодически используя ответы для уже решенных подзадач
(как правило, через рекуррентные соотношения).
Основная идея – запоминать решения встречающихся
подзадач на случай, если та же подзадача встретится
вновь.
Теория динамического программирования разработана
Р. Беллманом в 1940-50-х годах.
Последовательность Фибоначчи
55
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, …
F(n) = F(n – 1) + F(n – 2), при n > 1
F(0) = 0, F(1) = 1
Задача. Вычислить n-й член последовательности
Фибоначчи.
Последовательность Фибоначчи
66
function Fibo(n)
if n <= 1 then
return n
end if
return Fibo(n - 1) + Fibo(n - 2)
end function
Последовательность Фибоначчи
77
Fibo(5)
Fibo(4) Fibo(3)
Fibo(3) Fibo(2) Fibo(2) Fibo(1)
Fibo(1) Fibo(0)Fibo(2) Fibo(1)
Fibo(1) Fibo(0)
Fibo(1) Fibo(0)
Некоторые элементы последовательности
вычисляются повторно несколько раз
Рекурсивные вызовы функции Fibo
В динамическом программировании используются
таблицы, в которых сохраняются решения подзадач
(жертвуем памятью ради времени)
Последовательность Фибоначчи
88
function Fibo(n)
F[0] = 0
F[1] = 1
for i = 2 to n do
F[i] = F[i - 1] + F[i - 2]
end for
return F[n]
end function
“Жадные” алгоритмы
99
“Жадный” алгоритм (Greedy algorithms) – алгоритм,
принимающий на каждом шаге локально-оптимальное
решение, предполагая, что конечное решение окажется
оптимальным.
Примеры “жадных” алгоритмов:
o алгоритм Прима
o алгоритм Курскала
o алгоритм Дейкстры
o алгоритм Хаффмана (кодирования)
Задача о размене (change-making problem)
1010
Задача. Имеется неограниченное количество монет
номиналом (достоинством) a1 < a2 < … < an. Требуется выдать
сумму S наименьшим количеством монет.
Пример. Имеются монеты достоинством 1, 2, 5 и 10 рублей.
Выдать сумму 27 рублей.
“Жадное” решение: 2 по 10, 1 по 5, 1 по 2.
Задача о размене (change-making problem)
1111
Задача. Имеется неограниченное количество монет
номиналом (достоинством) a1 < a2 < … < an. Требуется выдать
сумму S наименьшим количеством монет.
Пример. Имеются монеты достоинством 1, 2, 5 и 10 рублей.
Выдать сумму 27 рублей.
“Жадное” решение: 2 по 10, 1 по 5, 1 по 2.
На каждом шаге берётся наибольшее возможное количество
монет достоинства an.
Задача о размене (change-making problem)
1212
Жадные алгоритмы не всегда дают оптимальные решения.
Пример. Имеются монеты достоинством 1, 5 и 7 рублей.
Выдать сумму 24 рубля.
Решение жадным алгоритмом: 3 по 7, 3 по 1 = 6 монет
Оптимальное решение: 2 по 7, 2 по 5 = 4 монеты
Код Хаффмана
1313
Деревья Хаффмана (Huffman) и коды Хаффмана
используются для сжатия информации путем
кодирования часто встречающихся символов короткими
последовательностями битов.
Предложен Д. А. Хаффманом в 1952 году (США, MIT).
Код Хаффмана
1414
Задано множество символов и известны вероятности их
появления в тексте (сообщении, файле).
A = {a1, a2, …, an} – множество символов (алфавит),
P = {p1, p2, …, pn} – вероятности появления символов.
Требуется каждому символу сопоставить код – битовую
строку (последовательность, codeword).
С(A, P) = {c1, c2, …, cn}
Пример
Символ A B C D _
Код (биты) 11 100 00 01 101
Код Хаффмана
1515
Шаг 1. Создается n одноузловых деревьев.
В каждом узле записан символ алфавита и вероятность
его повеления в тексте.
A
0.35
B
0.1
C
0.2
D
0.2
_
0.15
Код Хаффмана
1616
Шаг 2. Находим два дерева с наименьшими вероятностями
и делаем их левым и правым поддеревьями нового дерева –
создаем родительский узел.
В созданном узле записываем сумму вероятностей
поддеревьев.
Повторяем шаг 2 пока не получим одно дерево.
На каждом шаге осуществляется “жадный выбор”
(два дерева с наименьшими вероятностями)
Код Хаффмана
1717
Символ B _ C D A
Вероятность 0.1 0.15 0.2 0.2 0.35
B _ C D A
0.25
Код Хаффмана
1818
Символ B _ C D A
Вероятность 0.25 0.2 0.2 0.35
B _ C D A
0.25
Код Хаффмана
1919
Символ C D B, _ A
Вероятность 0.4 0.25 0.35
B _C D A
0.4
0.25
Код Хаффмана
2020
Символ C D B, _ A
Вероятность 0.4 0.6
B _
C D
A
0.4 0.6
0.25
Код Хаффмана
2121
B _
C D
A
0.4 0.6
1.0
Дерево Хаффмана
0.25
Код Хаффмана
2222
B _
C D
A
0.4 0.6
1.0
Дерево Хаффмана
1
1
0
0 1 0
10
Символ Код
A 11
B 100
C 00
D 01
_ 101
Задание
2323
Оценить трудоемкость построения дерева Хаффмана.

More Related Content

What's hot

Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...
Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...
Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...Mikhail Kurnosov
 
04 динамическое программирование - основные концепции
04 динамическое программирование - основные концепции04 динамическое программирование - основные концепции
04 динамическое программирование - основные концепцииFedor Tsarev
 
05 динамическое программирование
05 динамическое программирование05 динамическое программирование
05 динамическое программированиеFedor Tsarev
 
05 динамическое программирование
05 динамическое программирование05 динамическое программирование
05 динамическое программированиеFedor Tsarev
 
Лекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмыЛекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмыMikhail Kurnosov
 
Лекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмыЛекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмыMikhail Kurnosov
 
чернякова г.в.
чернякова г.в.чернякова г.в.
чернякова г.в.sharikdp
 
Лекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировкаЛекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировкаMikhail Kurnosov
 
Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Mikhail Kurnosov
 
Лекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графеЛекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графеMikhail Kurnosov
 
Лекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графовЛекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графовMikhail Kurnosov
 
Лекция №15. Методы программирования. Предмет "Структуры и алгоритмы обработки...
Лекция №15. Методы программирования. Предмет "Структуры и алгоритмы обработки...Лекция №15. Методы программирования. Предмет "Структуры и алгоритмы обработки...
Лекция №15. Методы программирования. Предмет "Структуры и алгоритмы обработки...Nikolay Grebenshikov
 
Лекция 8: Графы. Обходы графов
Лекция 8: Графы. Обходы графовЛекция 8: Графы. Обходы графов
Лекция 8: Графы. Обходы графовMikhail Kurnosov
 
Лекция №8 "Методы снижения размерности пространства"
Лекция №8 "Методы снижения размерности пространства" Лекция №8 "Методы снижения размерности пространства"
Лекция №8 "Методы снижения размерности пространства" Technosphere1
 
Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Mikhail Kurnosov
 
Продолжаем говорить про арифметику
Продолжаем говорить про арифметикуПродолжаем говорить про арифметику
Продолжаем говорить про арифметикуAndrey Akinshin
 
Лекция №12 "Ограниченная машина Больцмана"
Лекция №12 "Ограниченная машина Больцмана" Лекция №12 "Ограниченная машина Больцмана"
Лекция №12 "Ограниченная машина Больцмана" Technosphere1
 
Use of eliptic curves for generating digital signature
Use of eliptic curves for generating digital signatureUse of eliptic curves for generating digital signature
Use of eliptic curves for generating digital signatureAndrei Poliakov
 
Программирование: от сложного к простому
Программирование: от сложного к простомуПрограммирование: от сложного к простому
Программирование: от сложного к простомуNikolay Grebenshikov
 

What's hot (20)

Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...
Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...
Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...
 
04 динамическое программирование - основные концепции
04 динамическое программирование - основные концепции04 динамическое программирование - основные концепции
04 динамическое программирование - основные концепции
 
05 динамическое программирование
05 динамическое программирование05 динамическое программирование
05 динамическое программирование
 
05 динамическое программирование
05 динамическое программирование05 динамическое программирование
05 динамическое программирование
 
Лекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмыЛекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмы
 
Лекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмыЛекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмы
 
чернякова г.в.
чернякова г.в.чернякова г.в.
чернякова г.в.
 
Лекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировкаЛекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировка
 
Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)
 
Лекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графеЛекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графе
 
Лекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графовЛекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графов
 
Лекция №15. Методы программирования. Предмет "Структуры и алгоритмы обработки...
Лекция №15. Методы программирования. Предмет "Структуры и алгоритмы обработки...Лекция №15. Методы программирования. Предмет "Структуры и алгоритмы обработки...
Лекция №15. Методы программирования. Предмет "Структуры и алгоритмы обработки...
 
Лекция 8: Графы. Обходы графов
Лекция 8: Графы. Обходы графовЛекция 8: Графы. Обходы графов
Лекция 8: Графы. Обходы графов
 
Лекция №8 "Методы снижения размерности пространства"
Лекция №8 "Методы снижения размерности пространства" Лекция №8 "Методы снижения размерности пространства"
Лекция №8 "Методы снижения размерности пространства"
 
Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)
 
Продолжаем говорить про арифметику
Продолжаем говорить про арифметикуПродолжаем говорить про арифметику
Продолжаем говорить про арифметику
 
Лекция №12 "Ограниченная машина Больцмана"
Лекция №12 "Ограниченная машина Больцмана" Лекция №12 "Ограниченная машина Больцмана"
Лекция №12 "Ограниченная машина Больцмана"
 
Use of eliptic curves for generating digital signature
Use of eliptic curves for generating digital signatureUse of eliptic curves for generating digital signature
Use of eliptic curves for generating digital signature
 
Основы SciPy
Основы SciPyОсновы SciPy
Основы SciPy
 
Программирование: от сложного к простому
Программирование: от сложного к простомуПрограммирование: от сложного к простому
Программирование: от сложного к простому
 

Similar to Лекция 12: Методы разработки алгоритмов. Динамическое программирование. Жадные алгоритмы.

Алгоритмы на ruby: жадные алгоритмы
Алгоритмы на ruby: жадные алгоритмыАлгоритмы на ruby: жадные алгоритмы
Алгоритмы на ruby: жадные алгоритмыEvgeny Smirnov
 
Hash cse lecture3
Hash cse lecture3Hash cse lecture3
Hash cse lecture3LiloSEA
 
Советский суперкомпьютер К-340А и секретные вычисления
Советский суперкомпьютер К-340А и секретные вычисленияСоветский суперкомпьютер К-340А и секретные вычисления
Советский суперкомпьютер К-340А и секретные вычисленияPositive Hack Days
 
20080217 efficientalgorithms kulikov_lecture13
20080217 efficientalgorithms kulikov_lecture1320080217 efficientalgorithms kulikov_lecture13
20080217 efficientalgorithms kulikov_lecture13Computer Science Club
 
20080217 efficientalgorithms kulikov_lecture13
20080217 efficientalgorithms kulikov_lecture1320080217 efficientalgorithms kulikov_lecture13
20080217 efficientalgorithms kulikov_lecture13Computer Science Club
 
Алгоритмы на ruby: перебор и рекурсия
Алгоритмы на ruby: перебор и рекурсияАлгоритмы на ruby: перебор и рекурсия
Алгоритмы на ruby: перебор и рекурсияEvgeny Smirnov
 
word2vec (part 1)
word2vec (part 1)word2vec (part 1)
word2vec (part 1)Denis Dus
 
Динамическое программирование на ruby
Динамическое программирование на rubyДинамическое программирование на ruby
Динамическое программирование на rubyEvgeny Smirnov
 
лабораторная работа 2
лабораторная работа 2лабораторная работа 2
лабораторная работа 2Gulnaz Shakirova
 
20131022 зобнин
20131022 зобнин20131022 зобнин
20131022 зобнинYandex
 
Алгоритмы и структуры данных осень 2013 лекция 8
Алгоритмы и структуры данных осень 2013 лекция 8Алгоритмы и структуры данных осень 2013 лекция 8
Алгоритмы и структуры данных осень 2013 лекция 8Technopark
 
Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"Fwdays
 
генераторы псевдослучайных последовательностей и шифрование методом гаммирования
генераторы псевдослучайных последовательностей и шифрование методом гаммированиягенераторы псевдослучайных последовательностей и шифрование методом гаммирования
генераторы псевдослучайных последовательностей и шифрование методом гаммированияhmyrhik nikita
 
лекция1
лекция1лекция1
лекция1shagore
 
Лекция 9 Жадные алгоритмы
Лекция 9 Жадные алгоритмыЛекция 9 Жадные алгоритмы
Лекция 9 Жадные алгоритмыsimple_people
 
Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1Technopark
 
20091025 algorithmsfornphardproblems kulikov_lecture04
20091025 algorithmsfornphardproblems kulikov_lecture0420091025 algorithmsfornphardproblems kulikov_lecture04
20091025 algorithmsfornphardproblems kulikov_lecture04Computer Science Club
 
CSEDays. Александр Семенов
CSEDays. Александр СеменовCSEDays. Александр Семенов
CSEDays. Александр СеменовLiloSEA
 

Similar to Лекция 12: Методы разработки алгоритмов. Динамическое программирование. Жадные алгоритмы. (20)

Алгоритмы на ruby: жадные алгоритмы
Алгоритмы на ruby: жадные алгоритмыАлгоритмы на ruby: жадные алгоритмы
Алгоритмы на ruby: жадные алгоритмы
 
Hash cse lecture3
Hash cse lecture3Hash cse lecture3
Hash cse lecture3
 
Советский суперкомпьютер К-340А и секретные вычисления
Советский суперкомпьютер К-340А и секретные вычисленияСоветский суперкомпьютер К-340А и секретные вычисления
Советский суперкомпьютер К-340А и секретные вычисления
 
20080217 efficientalgorithms kulikov_lecture13
20080217 efficientalgorithms kulikov_lecture1320080217 efficientalgorithms kulikov_lecture13
20080217 efficientalgorithms kulikov_lecture13
 
20080217 efficientalgorithms kulikov_lecture13
20080217 efficientalgorithms kulikov_lecture1320080217 efficientalgorithms kulikov_lecture13
20080217 efficientalgorithms kulikov_lecture13
 
лекция 14
лекция 14лекция 14
лекция 14
 
лекция 14
лекция 14лекция 14
лекция 14
 
Алгоритмы на ruby: перебор и рекурсия
Алгоритмы на ruby: перебор и рекурсияАлгоритмы на ruby: перебор и рекурсия
Алгоритмы на ruby: перебор и рекурсия
 
word2vec (part 1)
word2vec (part 1)word2vec (part 1)
word2vec (part 1)
 
Динамическое программирование на ruby
Динамическое программирование на rubyДинамическое программирование на ruby
Динамическое программирование на ruby
 
лабораторная работа 2
лабораторная работа 2лабораторная работа 2
лабораторная работа 2
 
20131022 зобнин
20131022 зобнин20131022 зобнин
20131022 зобнин
 
Алгоритмы и структуры данных осень 2013 лекция 8
Алгоритмы и структуры данных осень 2013 лекция 8Алгоритмы и структуры данных осень 2013 лекция 8
Алгоритмы и структуры данных осень 2013 лекция 8
 
Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"
 
генераторы псевдослучайных последовательностей и шифрование методом гаммирования
генераторы псевдослучайных последовательностей и шифрование методом гаммированиягенераторы псевдослучайных последовательностей и шифрование методом гаммирования
генераторы псевдослучайных последовательностей и шифрование методом гаммирования
 
лекция1
лекция1лекция1
лекция1
 
Лекция 9 Жадные алгоритмы
Лекция 9 Жадные алгоритмыЛекция 9 Жадные алгоритмы
Лекция 9 Жадные алгоритмы
 
Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1
 
20091025 algorithmsfornphardproblems kulikov_lecture04
20091025 algorithmsfornphardproblems kulikov_lecture0420091025 algorithmsfornphardproblems kulikov_lecture04
20091025 algorithmsfornphardproblems kulikov_lecture04
 
CSEDays. Александр Семенов
CSEDays. Александр СеменовCSEDays. Александр Семенов
CSEDays. Александр Семенов
 

More from Mikhail Kurnosov

Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Mikhail Kurnosov
 
Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Mikhail Kurnosov
 
Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Mikhail Kurnosov
 
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Mikhail Kurnosov
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPMikhail Kurnosov
 
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...Mikhail Kurnosov
 
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Mikhail Kurnosov
 
Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 5. B-деревья (B-trees, k-way merge sort)Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 5. B-деревья (B-trees, k-way merge sort)Mikhail Kurnosov
 
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)Mikhail Kurnosov
 
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...Mikhail Kurnosov
 
Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Mikhail Kurnosov
 
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Mikhail Kurnosov
 
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Mikhail Kurnosov
 
Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Mikhail Kurnosov
 
Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Mikhail Kurnosov
 
Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)Mikhail Kurnosov
 
Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)Mikhail Kurnosov
 
Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)Mikhail Kurnosov
 
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)Mikhail Kurnosov
 
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)Mikhail Kurnosov
 

More from Mikhail Kurnosov (20)

Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Векторизация кода (семинар 2)
Векторизация кода (семинар 2)
 
Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Векторизация кода (семинар 3)
Векторизация кода (семинар 3)
 
Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Векторизация кода (семинар 1)
Векторизация кода (семинар 1)
 
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMP
 
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
 
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
 
Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 5. B-деревья (B-trees, k-way merge sort)Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 5. B-деревья (B-trees, k-way merge sort)
 
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
 
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
 
Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)
 
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
 
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
 
Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)
 
Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)
 
Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)
 
Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)
 
Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)
 
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
 
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
 

Лекция 12: Методы разработки алгоритмов. Динамическое программирование. Жадные алгоритмы.

  • 1. Лекция 12: Динамическое программирование. Жадные алгоритмы. Курносов Михаил Георгиевич к.т.н. доцент Кафедры вычислительных систем Сибирский государственный университет телекоммуникаций и информатики http://www.mkurnosov.net
  • 2. Контроль 2 1. В чем основная идея метода декомпозиции? 2. Дать оценку трудоемкости алгоритма быстрой сортировки с использованием обобщённого рекуррентного уравнения декомпозиции.
  • 3. Основные методы разработки алгоритмов 33 Метод грубой силы (brute force, исчерпывающий поиск – полный перебор). Декомпозиция (decomposition, “разделяй и властвуй”) Уменьшение размера задачи (“уменьшай и властвуй”) Преобразование (“преобразуй и властвуй”) Жадные алгоритмы (greedy algorithms) Динамическое программирование (dynamic programming) Поиск с возвратом (backtracking) Локальный поиск (local search)
  • 4. Динамическое программирование 44 Динамическое программирование (Dynamic programming) – метод решения задач (преимущественно оптимизационных) путем разбиения их на более простые подзадачи. Решение идет от простых подзадач к сложным, периодически используя ответы для уже решенных подзадач (как правило, через рекуррентные соотношения). Основная идея – запоминать решения встречающихся подзадач на случай, если та же подзадача встретится вновь. Теория динамического программирования разработана Р. Беллманом в 1940-50-х годах.
  • 5. Последовательность Фибоначчи 55 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, … F(n) = F(n – 1) + F(n – 2), при n > 1 F(0) = 0, F(1) = 1 Задача. Вычислить n-й член последовательности Фибоначчи.
  • 6. Последовательность Фибоначчи 66 function Fibo(n) if n <= 1 then return n end if return Fibo(n - 1) + Fibo(n - 2) end function
  • 7. Последовательность Фибоначчи 77 Fibo(5) Fibo(4) Fibo(3) Fibo(3) Fibo(2) Fibo(2) Fibo(1) Fibo(1) Fibo(0)Fibo(2) Fibo(1) Fibo(1) Fibo(0) Fibo(1) Fibo(0) Некоторые элементы последовательности вычисляются повторно несколько раз Рекурсивные вызовы функции Fibo
  • 8. В динамическом программировании используются таблицы, в которых сохраняются решения подзадач (жертвуем памятью ради времени) Последовательность Фибоначчи 88 function Fibo(n) F[0] = 0 F[1] = 1 for i = 2 to n do F[i] = F[i - 1] + F[i - 2] end for return F[n] end function
  • 9. “Жадные” алгоритмы 99 “Жадный” алгоритм (Greedy algorithms) – алгоритм, принимающий на каждом шаге локально-оптимальное решение, предполагая, что конечное решение окажется оптимальным. Примеры “жадных” алгоритмов: o алгоритм Прима o алгоритм Курскала o алгоритм Дейкстры o алгоритм Хаффмана (кодирования)
  • 10. Задача о размене (change-making problem) 1010 Задача. Имеется неограниченное количество монет номиналом (достоинством) a1 < a2 < … < an. Требуется выдать сумму S наименьшим количеством монет. Пример. Имеются монеты достоинством 1, 2, 5 и 10 рублей. Выдать сумму 27 рублей. “Жадное” решение: 2 по 10, 1 по 5, 1 по 2.
  • 11. Задача о размене (change-making problem) 1111 Задача. Имеется неограниченное количество монет номиналом (достоинством) a1 < a2 < … < an. Требуется выдать сумму S наименьшим количеством монет. Пример. Имеются монеты достоинством 1, 2, 5 и 10 рублей. Выдать сумму 27 рублей. “Жадное” решение: 2 по 10, 1 по 5, 1 по 2. На каждом шаге берётся наибольшее возможное количество монет достоинства an.
  • 12. Задача о размене (change-making problem) 1212 Жадные алгоритмы не всегда дают оптимальные решения. Пример. Имеются монеты достоинством 1, 5 и 7 рублей. Выдать сумму 24 рубля. Решение жадным алгоритмом: 3 по 7, 3 по 1 = 6 монет Оптимальное решение: 2 по 7, 2 по 5 = 4 монеты
  • 13. Код Хаффмана 1313 Деревья Хаффмана (Huffman) и коды Хаффмана используются для сжатия информации путем кодирования часто встречающихся символов короткими последовательностями битов. Предложен Д. А. Хаффманом в 1952 году (США, MIT).
  • 14. Код Хаффмана 1414 Задано множество символов и известны вероятности их появления в тексте (сообщении, файле). A = {a1, a2, …, an} – множество символов (алфавит), P = {p1, p2, …, pn} – вероятности появления символов. Требуется каждому символу сопоставить код – битовую строку (последовательность, codeword). С(A, P) = {c1, c2, …, cn} Пример Символ A B C D _ Код (биты) 11 100 00 01 101
  • 15. Код Хаффмана 1515 Шаг 1. Создается n одноузловых деревьев. В каждом узле записан символ алфавита и вероятность его повеления в тексте. A 0.35 B 0.1 C 0.2 D 0.2 _ 0.15
  • 16. Код Хаффмана 1616 Шаг 2. Находим два дерева с наименьшими вероятностями и делаем их левым и правым поддеревьями нового дерева – создаем родительский узел. В созданном узле записываем сумму вероятностей поддеревьев. Повторяем шаг 2 пока не получим одно дерево. На каждом шаге осуществляется “жадный выбор” (два дерева с наименьшими вероятностями)
  • 17. Код Хаффмана 1717 Символ B _ C D A Вероятность 0.1 0.15 0.2 0.2 0.35 B _ C D A
  • 18. 0.25 Код Хаффмана 1818 Символ B _ C D A Вероятность 0.25 0.2 0.2 0.35 B _ C D A
  • 19. 0.25 Код Хаффмана 1919 Символ C D B, _ A Вероятность 0.4 0.25 0.35 B _C D A 0.4
  • 20. 0.25 Код Хаффмана 2020 Символ C D B, _ A Вероятность 0.4 0.6 B _ C D A 0.4 0.6
  • 21. 0.25 Код Хаффмана 2121 B _ C D A 0.4 0.6 1.0 Дерево Хаффмана
  • 22. 0.25 Код Хаффмана 2222 B _ C D A 0.4 0.6 1.0 Дерево Хаффмана 1 1 0 0 1 0 10 Символ Код A 11 B 100 C 00 D 01 _ 101