SlideShare ist ein Scribd-Unternehmen logo
1 von 32
Downloaden Sie, um offline zu lesen
Лекция 8.
Динамическое
программирование и
жадные алгоритмы.
Мацкевич С. Е.
План лекции «Динамическое
программирование и жадные алгоритмы»
 Динамическое программирование.
 Наибольшая общая подпоследовательность.

 Расстояние Левенштейна.
 Жадные алгоритмы.

 Покрытие отрезками.
 Задача о рюкзаке.

2
Динамическое программирование
Динамическое программирование (ДП) – способ решения
сложных задач путём разбиения их на более простые
подзадачи.
Подход динамического программирования состоит в том, чтобы
решить каждую подзадачу только один раз, сократив тем самым
количество вычислений.
Термин «динамическое программирование» также встречается в теории
управления в смысле «динамической оптимизации». Основным методом ДП
является сведение общей задачи к ряду более простых экстремальных задач.
Лит.: Беллман Р., Динамическое программирование, пер. с англ., М., 1960.

3
Динамическое программирование
Пример. Числа Фибоначчи. 𝐹 𝑛 = 𝐹 𝑛−1 + 𝐹 𝑛−2 . 𝐹1 = 1, 𝐹0 = 1.
Можно вычислять рекурсивно:
𝐹5 = 𝐹4 + 𝐹3 ,
𝐹4 = 𝐹3 + 𝐹2 ,
𝐹3 = 𝐹2 + 𝐹1 ,
Многие значения могут вычисляться
несколько раз.
Решение – сохранять результаты
решения подзадач.
Этот подход называется кэшированием.

4
Динамическое программирование
Пример. Вычисление рекуррентных функций нескольких
аргументов.
𝐹 𝑥, 𝑦 = 3 ⋅ 𝐹 𝑥 − 1, 𝑦 − 2 ⋅ 𝐹 2 𝑥, 𝑦 − 1 ,
𝐹 𝑥, 0 = 𝑥, 𝐹 0, 𝑦 = 0.
Вычисление 𝐹 𝑥, 𝑦 сводится к вычислению двух 𝐹 ⋅,⋅ от меньших
аргументов.
Есть перекрывающиеся подзадачи.
𝐹 𝑥 − 1, 𝑦 − 1 в рекурсивном решении вычисляется дважды.
𝐹 𝑥 − 2, 𝑦 − 1 в рекурсивном решении вычисляется три раза.
𝑛
𝐹 𝑥 − 𝑛, 𝑦 − 𝑚 в рекурсивном решении вычисляется 𝐶 𝑛+𝑚 раз.
Снова будем использовать кэширование – сохранять результаты.
Вычисления будем выполнять от меньших аргументов к большим.
5
Динамическое программирование
// Вычисление рекуррентного выражения от двух переменных.
int F( int x, int y )
{
vector<vector<int>> values( x + 1 );
for( int i = 0; i <= x; ++i ) {
values[i].resize( y + 1 );
values[i][0] = i; // F( x, 0 ) = x;
}
for( int i = 1; i <= y; ++i ) {
values[0][i] = 0; // F( 0, y ) = 0;
}
// Вычисляем по рядам.
for( int i = 0; i <= x; ++i ) {
for( int j = 0; j <= y; ++j ) {
values[i][j] = 3 * values[i – 1][j] –
2 * values[i][j – 1] * values[i][j – 1];
}
}
return value[x][y];
}
6
Динамическое программирование
При вычисление рекуррентной функции 𝐹 𝑥, 𝑦 можно было
не хранить значения на всех рядах.
Для вычисления очередного ряда достаточно иметь значения
предыдущего ряда.
Это оптимизация динамического программирования –
запоминать только те значения, которые будут
использоваться для последующих вычислений.
Для вычисления следующего числа Фибоначчи 𝐹𝑖 также
достаточно хранить лишь два предыдущих значения:
𝐹𝑖−1 и 𝐹𝑖−2 .
7
Динамическое программирование
Принципы ДП:
1. Разбить задачу на подзадачи.

2. Кэшировать результаты решения подзадач.
3. Удалять более неиспользуемые результаты решения
подзадач (опционально).

8
Динамическое программирование
Два подхода динамического программирования:

1. Нисходящее динамическое программирование: задача

2.

разбивается на подзадачи меньшего размера, они решаются и
затем комбинируются для решения исходной задачи.
Используется запоминание для решений часто встречающихся
подзадач.
Восходящее динамическое программирование: все подзадачи,
которые впоследствии понадобятся для решения исходной
задачи просчитываются заранее и затем используются для
построения решения исходной задачи. Этот способ лучше
нисходящего программирования в смысле размера
необходимого стека и количества вызова функций, но иногда
бывает нелегко заранее выяснить, решение каких подзадач
нам потребуется в дальнейшем.
9
Динамическое программирование
Иногда бывает нелегко заранее выяснить, решение каких
подзадач нам потребуется в дальнейшем.

Пример. 𝐹 𝑛 = 𝐹
целочисленное.

𝑛
2

+ 𝐹

2⋅𝑛
3

, 𝐹 0 = 𝐹 1 = 1, деление

Восходящее динамическое программирование применить можно,
но будут вычислены все значения F от 1 до n. Сложно определить,
для каких k требуется вычислять 𝐹 𝑘 .
Нисходящее динамическое программирование позволит вычислить
только те 𝐹 𝑘 , которые требуются, но рекурсивно. Максимальная
глубина рекурсии = log 3 2 𝑛 .
10
Динамическое программирование
// Вычисление рекуррентного выражения методом нисходящего ДП.
int F( int n )
{
map<int, int> values;
values[0] = 1;
values[1] = 1;
return calcF( n, values );
}
// Рекурсивное вычисление с запоминанием.
int calcF( int n, map<int, int>& values )
{
if( values.find( n ) != values.end() )
return values[n];
values[n] = calcF( n / 2, values ) + calcF( 2 * n / 3, values );
return values[n];
}

11
Наибольшая общая
подпоследовательность
Последовательность X является подпоследовательностью Y, если
из Y можно удалить несколько элементов так, что получится
последовательность X.
Задача. Наибольшая общая подпоследовательность (англ.
longest common subsequence, LCS) – задача поиска
последовательности, которая является подпоследовательностью
нескольких последовательностей (обычно двух).
Элементами подпоследовательности могут быть числа, символы…
X = ABCAB,
Y = DCBA,
НОП( X, Y ) = BA, CA, CB.
12
Наибольшая общая
подпоследовательность
Будем решать задачу нахождения наибольшей общей
подпоследовательности с помощью Динамического
программирования.
Сведем задачу к подзадачам меньшего размера:
𝑓 𝑛1 , 𝑛2 – длина наибольшей общей подпоследовательности
строк 𝑠1 0. . 𝑛1 , 𝑠2 0. . 𝑛2 .

13
Наибольшая общая
подпоследовательность

A
0

B

C

A

B

0

0

0

0

0

D

0

←↑ 0 ←↑ 0 ←↑ 0 ←↑ 0 ←↑ 0

C

0

←↑ 0 ←↑ 0

B

0

←↑ 0

A

0

↖1

↖1

↖1

←1

←1

←↑ 1 ←↑ 1

↖2

←↑ 1 ←↑ 1

↖2

←↑ 2

14
Наибольшая общая
подпоследовательность
𝑓 𝑛1 , 𝑛2 – длина НОП.
Как восстановить саму подпоследовательность?

Можно хранить в каждой ячейке таблицы «направление»
перехода. Переход по диагонали означает, что очередной символ
присутствует в обоих последовательностях.
Начинаем проход от правого нижнего угла.
Идем по стрелкам, на каждый переход по диагонали добавляем
символ в начало строящейся подпоследовательности.
«Направления» можно не хранить, а вычислять по значениям в
таблице.

15
Расстояние Левенштейна
Расстояние Левенштейна (также редакционное расстояние или
дистанция редактирования) между двумя строками – это
минимальное количество следующих операций:
 вставки одного символа,
 удаления одного символа,
 замены одного символа на другой,
необходимых для превращения одной строки в другую.
Впервые задачу упомянул в 1965 году советский математик
Владимир Иосифович Левенштейн при изучении
последовательностей 0-1.

16
Расстояние Левенштейна
Расстояние Левенштейна и его обобщения активно применяется:
 для исправления ошибок в слове (в поисковых системах, базах
данных, при вводе текста, при автоматическом распознавании
отсканированного текста или речи).
 для сравнения текстовых файлов утилитой diff и ей подобными.
Здесь роль «символов» играют строки, а роль «строк» —
файлы.
 в биоинформатике для сравнения генов, хромосом и белков.

17
Расстояние Левенштейна
Будем вычислять расстояние Левенштейна с помощью
Динамического программирования.

18
Расстояние Левенштейна
Пример.

19
Расстояние Левенштейна.
Доказательство.
Для начала заметим, что в оптимальной последовательности операций, операции можно
произвольно менять местами. В самом деле, рассмотрим две последовательные операции.
Это могут быть операции вставки, удаления и замены, одного или разных символов:
 Две замены разных символов можно менять местами
 Стирание и вставку разных символов можно менять местами
 Вставка символа и замена другого символа меняются местами
 Стирание символа и замена другого символа меняются местами
 Два стирания или две вставки можно менять местами
 Две замены одного и того же символа — неоптимально (если мы заменили x на y, потом y
на z, выгоднее было сразу заменить x на z)
 Вставка символа с его последующим стиранием — неоптимально (можно их обе отменить)
 Вставка символа с его последующей заменой — неоптимально (излишняя замена)
 Замена символа с его последующим стиранием — неоптимально (излишняя замена)

20
Расстояние Левенштейна.
Доказательство.

Пусть 𝑆1 кончается на символ «a», 𝑆2 кончается на символ «b». Есть три варианта:
1.

Если символ «а», на который кончается 𝑆1 , в какой-то момент был стёрт. Сделаем это стирание
первой операцией. Тогда мы стёрли символ «a», после чего превратили первые i1 символов 𝑆1 в 𝑆2 (на что потребовалось 𝐷 𝑖 − 1, 𝑗 операций), значит, всего
потребовалось 𝐷 𝑖 − 1, 𝑗 + 1 операций.

2.

Символ «b», на который кончается 𝑆2 , в какой-то момент был добавлен. Сделаем это добавление
последней операцией. Мы превратили 𝑆1 в первые j-1 символов 𝑆2 , после чего добавили «b».
Аналогично предыдущему случаю, потребовалось 𝐷 𝑖, 𝑗 − 1 + 1 операций.

3.

Оба предыдущих утверждения неверны. Если мы добавляли символы справа от финального «a», то,
чтобы сделать последним символом «b», мы должны были или в какой-то момент добавить его (но
тогда утверждение 2 было бы верно), либо заменить на него один из этих добавленных символов
(что тоже невозможно, потому что добавление символа с его последующей заменой неоптимально).
Значит, символов справа от финального «a» мы не добавляли. Самого финального «a» мы не
стирали, поскольку утверждение 1 неверно. Значит, единственный способ изменения последнего
символа — его замена. Заменять его 2 или больше раз неоптимально. Значит,


Если 𝑎 = 𝑏, мы последний символ не меняли. Поскольку мы его также не стирали и не приписывали ничего
справа от него, он не влиял на наши действия, и, значит, мы выполнили 𝐷 𝑖 − 1, 𝑗 − 1 операций.



Если 𝑎 ≠ 𝑏, мы последний символ меняли один раз. Сделаем эту замену первой. В дальнейшем, аналогично
предыдущему случаю, мы должны выполнить 𝐷 𝑖 − 1, 𝑗 − 1 операций, значит, всего потребуется 𝐷 𝑖 − 1, 𝑗 −

21
Расстояние Левенштейна
// Вычисление расстояния Левенштейна.
int LevenshteinDistance( const string& s, int sLength, const string& t,
int tLength )
{
// Крайние случаи.
if( sLength == 0 ) return tLength;
if( tLength == 0 ) return sLength;
// Проверим совпадение последних символов.
int cost = s[sLength - 1] == t[tLength - 1] ? 0 : 1;
// Вычисляем минимум.
return min( LevenshteinDistance( s, sLength - 1, t, tLength ) + 1,
LevenshteinDistance( s, sLength, t, tLength – 1 ) + 1,
LevenshteinDistance( s, sLength - 1, t, tLength – 1 ) + cost );
}

22
Расстояние Дамерау-Левенштейна.
Расстояние Дамерау – Левенштейна — это мера разницы двух
строк символов, определяемая как минимальное количество
операций вставки, удаления, замены и транспозиции
(перестановки двух соседних символов), необходимых для
перевода одной строки в другую.
Является модификацией расстояния Левенштейна: к операциям
вставки, удаления и замены символов, определенных в расстоянии
Левенштейна добавлена операция транспозиции (перестановки)
символов.

23
Расстояние Дамерау-Левенштейна.
Расстояние Дамерау-Левенштейна также вычисляется
динамически.

24
Жадные алгоритмы
Жадный алгоритм (англ. Greedy algorithm) – алгоритм,
заключающийся в принятии локально оптимальных решений на
каждом этапе, допуская, что конечное решение также окажется
оптимальным.
Доказательство оптимальности часто следует такой схеме:
1. Доказывается, что жадный выбор на первом шаге не
закрывает пути к оптимальному решению: для всякого
решения есть другое, согласованное с жадным выбором и не
хуже первого.
2. Показывается, что подзадача, возникающая после жадного
выбора на первом шаге, аналогична исходной.
3. Рассуждение завершается по индукции.
25
Жадные алгоритмы
Пример. Размен монет.
Монетная система некоторого государства состоит из монет достоинством 𝑎1 =
1 < 𝑎2 < ⋯ < 𝑎 𝑛 . Требуется выдать сумму S наименьшим возможным
количеством монет.
Жадный алгоритм решения этой задачи:
Берётся наибольшее возможное количество
монет достоинства 𝑎 𝑛 : 𝑥 𝑛 = 𝑆 𝑎 𝑛 . Также
получаем, сколько нужно монет меньшего номинала.
Для данной задачи жадный алгоритм не всегда даёт
оптимальное решение.
Например. Монеты в 1, 5 и 7коп. Сумма 24.
Жадный алгоритм разменивает так:
7к. — 3 шт., 1к. — 3 шт.
Правильное решение:
7к. — 2 шт., 5к. — 2 шт.
Тем не менее, на всех реальных монетных системах жадный алгоритм даёт
правильный ответ.
26
Покрытие отрезками
Задача. Дано множество отрезков 𝑎 𝑖 , 𝑏 𝑖 , покрывающее отрезок
0, 𝑋 . Найти наименьшее подпокрытие, т.е. минимальный набор
отрезков, по-прежнему покрывающий отрезок 0, 𝑋 .
Жадное решение.
Упорядочим набор отрезков по возрастанию левого конца 𝑎 𝑖 .
Шаг 1. Среди отрезков, содержащих 0, найдем такой, у которого
наибольший правый конец 𝑏 𝑖 . Обозначим этот отрезок 𝑎1 , 𝑏1 .
Шаг 2. Среди отрезков, содержащих 𝑏1 , найдем такой, у которого
наибольший правый конец 𝑏 𝑖 . Обозначим этот отрезок 𝑎2 , 𝑏2 .
И так далее.

27
Покрытие отрезками
Утверждение. Жадное решение является оптимальным.
Доказательство. От противного. Пусть жадное решение состоит из K
отрезков 𝑎 𝑖 , 𝑏 𝑖 . И пусть существует более оптимальное решение
𝑎 𝑖 , 𝑏 𝑖 , состоящие из менее чем K отрезков.
Упорядочим отрезки в решениях по правому краю. Заметим, что отрезки
также будут упорядочены и по левому краю в оптимальном решении и
в жадном решении.
Найдем первый отрезок, отличающийся в жадном решении от
оптимального. У такого отрезка оптимального решения меньше правый
край и он по-прежнему покрывает правый край предыдущего общего
отрезка. Значит, его можно заменить на отрезок из жадного решения.
Так, заменяя отрезки оптимального решения на отрезки жадного,
получим, что менее K первых отрезков жадного решения являются
оптимальным решением, что невозможно по построению жадного
решения.
28
Задача о рюкзаке
Задача о рюкзаке (англ. Knapsack problem) — одна из NP-полных задач
комбинаторной оптимизации. Название своё получила от
максимизационной задачи укладки как можно большего числа нужных
вещей в рюкзак при условии, что общий объём (или вес) всех предметов,
способных поместиться в рюкзак, ограничен.
Имеется N грузов. Для каждого i-го груза определён вес 𝑤 𝑖 и ценность
𝑐 𝑖 . Нужно упаковать в рюкзак ограниченной грузоподъёмности G те
грузы, при которых суммарная ценность
упакованного была бы максимальной.

29
Задача о рюкзаке
Жадный алгоритм.
Предметы сортируются по убыванию стоимости единицы каждого.
Помещаем в рюкзак то, что помещается, и одновременно самое
дорогое, т.е с максимальным отношением цены к весу.
В оставшееся место помещаем следующий предмет аналогично.

Точное решение можно получить не всегда.

30
Задача о рюкзаке
Пример.
Пусть вместимость рюкзака 90. Предметы уже отсортированы.
Применяем к ним жадный алгоритм.
вес
цена цена/вес
1
20
60
3
2
30
90
3
3
50
100
2
Кладём в рюкзак первый, а за ним второй предметы. Третий предмет в
рюкзак не влезет. Суммарная ценность поместившегося равна 150. Если
бы были взяты второй и третий предметы, то суммарная ценность
составила бы 190. Видно, что жадный алгоритм не обеспечивает
оптимального решения, поэтому относится к приближенным.
31
Вопросы?
Спасибо за внимание!

Weitere ähnliche Inhalte

Was ist angesagt?

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
 
Линейная алгебра - I
Линейная алгебра - IЛинейная алгебра - I
Линейная алгебра - IDEVTYPE
 
Квадратичная математика
Квадратичная математикаКвадратичная математика
Квадратичная математикаDEVTYPE
 
пугач му по матлогике 2015
пугач му по матлогике 2015пугач му по матлогике 2015
пугач му по матлогике 2015LIPugach
 
Основы комбинаторики - I
Основы комбинаторики - IОсновы комбинаторики - I
Основы комбинаторики - IDEVTYPE
 
Основы теории графов - I
Основы теории графов - IОсновы теории графов - I
Основы теории графов - IDEVTYPE
 
Лекция №2. Алгоритмические проблемы. Стандартные схемы программ. Предмет "Тео...
Лекция №2. Алгоритмические проблемы. Стандартные схемы программ. Предмет "Тео...Лекция №2. Алгоритмические проблемы. Стандартные схемы программ. Предмет "Тео...
Лекция №2. Алгоритмические проблемы. Стандартные схемы программ. Предмет "Тео...Nikolay Grebenshikov
 
Линейная алгебра - I. Разбор задач
Линейная алгебра - I. Разбор задачЛинейная алгебра - I. Разбор задач
Линейная алгебра - I. Разбор задачDEVTYPE
 
Линейная алгебра ll. Разбор задач второго модуля
Линейная алгебра ll. Разбор задач второго модуляЛинейная алгебра ll. Разбор задач второго модуля
Линейная алгебра ll. Разбор задач второго модуляDEVTYPE
 
Лекция №1. Введение. Предмет "Теория вычислительных процессов"
Лекция №1. Введение. Предмет "Теория вычислительных процессов"Лекция №1. Введение. Предмет "Теория вычислительных процессов"
Лекция №1. Введение. Предмет "Теория вычислительных процессов"Nikolay Grebenshikov
 
20081116 structuralcomplexitytheory lecture09-10
20081116 structuralcomplexitytheory lecture09-1020081116 structuralcomplexitytheory lecture09-10
20081116 structuralcomplexitytheory lecture09-10Computer Science Club
 
ДОПОЛНИТЕЛЬНЫЕ САМОСТОЯТЕЛЬНЫЕ РАБОТЫ ПО АЛГЕБРЕ
ДОПОЛНИТЕЛЬНЫЕ САМОСТОЯТЕЛЬНЫЕ РАБОТЫ ПО АЛГЕБРЕДОПОЛНИТЕЛЬНЫЕ САМОСТОЯТЕЛЬНЫЕ РАБОТЫ ПО АЛГЕБРЕ
ДОПОЛНИТЕЛЬНЫЕ САМОСТОЯТЕЛЬНЫЕ РАБОТЫ ПО АЛГЕБРЕGarik Yenokyan
 
5.2. курс лекций афу
5.2. курс лекций афу5.2. курс лекций афу
5.2. курс лекций афуGKarina707
 
Лекция №3. Свойства и моделирование стандартных схем программ. Предмет "Теори...
Лекция №3. Свойства и моделирование стандартных схем программ. Предмет "Теори...Лекция №3. Свойства и моделирование стандартных схем программ. Предмет "Теори...
Лекция №3. Свойства и моделирование стандартных схем программ. Предмет "Теори...Nikolay Grebenshikov
 
1.4 Точечные оценки и их свойства
1.4 Точечные оценки и их свойства1.4 Точечные оценки и их свойства
1.4 Точечные оценки и их свойстваDEVTYPE
 
предел последовательности
предел последовательностипредел последовательности
предел последовательностиtomik1044
 

Was ist angesagt? (20)

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
 
Линейная алгебра - I
Линейная алгебра - IЛинейная алгебра - I
Линейная алгебра - I
 
Квадратичная математика
Квадратичная математикаКвадратичная математика
Квадратичная математика
 
пугач му по матлогике 2015
пугач му по матлогике 2015пугач му по матлогике 2015
пугач му по матлогике 2015
 
Funkciya y cos_ee_svojstva_i_grafik
Funkciya y cos_ee_svojstva_i_grafikFunkciya y cos_ee_svojstva_i_grafik
Funkciya y cos_ee_svojstva_i_grafik
 
Основы комбинаторики - I
Основы комбинаторики - IОсновы комбинаторики - I
Основы комбинаторики - I
 
Основы теории графов - I
Основы теории графов - IОсновы теории графов - I
Основы теории графов - I
 
Лекция №2. Алгоритмические проблемы. Стандартные схемы программ. Предмет "Тео...
Лекция №2. Алгоритмические проблемы. Стандартные схемы программ. Предмет "Тео...Лекция №2. Алгоритмические проблемы. Стандартные схемы программ. Предмет "Тео...
Лекция №2. Алгоритмические проблемы. Стандартные схемы программ. Предмет "Тео...
 
Линейная алгебра - I. Разбор задач
Линейная алгебра - I. Разбор задачЛинейная алгебра - I. Разбор задач
Линейная алгебра - I. Разбор задач
 
Линейная алгебра ll. Разбор задач второго модуля
Линейная алгебра ll. Разбор задач второго модуляЛинейная алгебра ll. Разбор задач второго модуля
Линейная алгебра ll. Разбор задач второго модуля
 
Integral1
Integral1Integral1
Integral1
 
23
2323
23
 
10474
1047410474
10474
 
Лекция №1. Введение. Предмет "Теория вычислительных процессов"
Лекция №1. Введение. Предмет "Теория вычислительных процессов"Лекция №1. Введение. Предмет "Теория вычислительных процессов"
Лекция №1. Введение. Предмет "Теория вычислительных процессов"
 
20081116 structuralcomplexitytheory lecture09-10
20081116 structuralcomplexitytheory lecture09-1020081116 structuralcomplexitytheory lecture09-10
20081116 structuralcomplexitytheory lecture09-10
 
ДОПОЛНИТЕЛЬНЫЕ САМОСТОЯТЕЛЬНЫЕ РАБОТЫ ПО АЛГЕБРЕ
ДОПОЛНИТЕЛЬНЫЕ САМОСТОЯТЕЛЬНЫЕ РАБОТЫ ПО АЛГЕБРЕДОПОЛНИТЕЛЬНЫЕ САМОСТОЯТЕЛЬНЫЕ РАБОТЫ ПО АЛГЕБРЕ
ДОПОЛНИТЕЛЬНЫЕ САМОСТОЯТЕЛЬНЫЕ РАБОТЫ ПО АЛГЕБРЕ
 
5.2. курс лекций афу
5.2. курс лекций афу5.2. курс лекций афу
5.2. курс лекций афу
 
Лекция №3. Свойства и моделирование стандартных схем программ. Предмет "Теори...
Лекция №3. Свойства и моделирование стандартных схем программ. Предмет "Теори...Лекция №3. Свойства и моделирование стандартных схем программ. Предмет "Теори...
Лекция №3. Свойства и моделирование стандартных схем программ. Предмет "Теори...
 
1.4 Точечные оценки и их свойства
1.4 Точечные оценки и их свойства1.4 Точечные оценки и их свойства
1.4 Точечные оценки и их свойства
 
предел последовательности
предел последовательностипредел последовательности
предел последовательности
 

Andere mochten auch

Лекция 7: Бинарные кучи (пирамиды)
Лекция 7: Бинарные кучи (пирамиды)Лекция 7: Бинарные кучи (пирамиды)
Лекция 7: Бинарные кучи (пирамиды)Mikhail Kurnosov
 
D-кучи и их применение
D-кучи и их применениеD-кучи и их применение
D-кучи и их применениеDEVTYPE
 
Continuity and Uniform Continuity
Continuity and Uniform ContinuityContinuity and Uniform Continuity
Continuity and Uniform ContinuityDEVTYPE
 
Диаграммы Юнга, плоские разбиения и знакочередующиеся матрицы
Диаграммы Юнга, плоские разбиения и знакочередующиеся матрицыДиаграммы Юнга, плоские разбиения и знакочередующиеся матрицы
Диаграммы Юнга, плоские разбиения и знакочередующиеся матрицыDEVTYPE
 
Зачем изучать алгоритмы?
Зачем изучать алгоритмы?Зачем изучать алгоритмы?
Зачем изучать алгоритмы?DEVTYPE
 
ЖАДНЫЕ АЛГОРИТМЫ
ЖАДНЫЕ АЛГОРИТМЫ ЖАДНЫЕ АЛГОРИТМЫ
ЖАДНЫЕ АЛГОРИТМЫ DEVTYPE
 
Жадные алгоритмы: введение
Жадные алгоритмы: введениеЖадные алгоритмы: введение
Жадные алгоритмы: введениеDEVTYPE
 
Разбор задач по дискретной вероятности
Разбор задач по дискретной вероятностиРазбор задач по дискретной вероятности
Разбор задач по дискретной вероятностиDEVTYPE
 
Asymptotic Growth of Functions
Asymptotic Growth of FunctionsAsymptotic Growth of Functions
Asymptotic Growth of FunctionsDEVTYPE
 
Разбор задач модуля "Теория графов ll"
Разбор задач модуля "Теория графов ll"Разбор задач модуля "Теория графов ll"
Разбор задач модуля "Теория графов ll"DEVTYPE
 
Алгоритмы и структуры данных весна 2014 лекция 2
Алгоритмы и структуры данных весна 2014 лекция 2Алгоритмы и структуры данных весна 2014 лекция 2
Алгоритмы и структуры данных весна 2014 лекция 2Technopark
 
Лекция 11. Вычислительная модель Pregel
Лекция 11. Вычислительная модель PregelЛекция 11. Вычислительная модель Pregel
Лекция 11. Вычислительная модель PregelTechnopark
 
Java осень 2013 лекция 1-1
Java осень 2013 лекция 1-1Java осень 2013 лекция 1-1
Java осень 2013 лекция 1-1Technopark
 
Java осень 2013 лекция 8
Java осень 2013 лекция 8Java осень 2013 лекция 8
Java осень 2013 лекция 8Technopark
 
Тестирование весна 2014 смешанное занятие 3
Тестирование весна 2014 смешанное занятие 3Тестирование весна 2014 смешанное занятие 3
Тестирование весна 2014 смешанное занятие 3Technopark
 
Лекция 13. YARN
Лекция 13. YARNЛекция 13. YARN
Лекция 13. YARNTechnopark
 
Лекция 14. Hadoop в Поиске Mail.Ru
Лекция 14. Hadoop в Поиске Mail.RuЛекция 14. Hadoop в Поиске Mail.Ru
Лекция 14. Hadoop в Поиске Mail.RuTechnopark
 
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)Mikhail Kurnosov
 
Алгоритмы и структуры данных осень 2013 лекция 4
Алгоритмы и структуры данных осень 2013 лекция 4Алгоритмы и структуры данных осень 2013 лекция 4
Алгоритмы и структуры данных осень 2013 лекция 4Technopark
 
Алгоритмы и структуры данных осень 2013 лекция 3
Алгоритмы и структуры данных осень 2013 лекция 3Алгоритмы и структуры данных осень 2013 лекция 3
Алгоритмы и структуры данных осень 2013 лекция 3Technopark
 

Andere mochten auch (20)

Лекция 7: Бинарные кучи (пирамиды)
Лекция 7: Бинарные кучи (пирамиды)Лекция 7: Бинарные кучи (пирамиды)
Лекция 7: Бинарные кучи (пирамиды)
 
D-кучи и их применение
D-кучи и их применениеD-кучи и их применение
D-кучи и их применение
 
Continuity and Uniform Continuity
Continuity and Uniform ContinuityContinuity and Uniform Continuity
Continuity and Uniform Continuity
 
Диаграммы Юнга, плоские разбиения и знакочередующиеся матрицы
Диаграммы Юнга, плоские разбиения и знакочередующиеся матрицыДиаграммы Юнга, плоские разбиения и знакочередующиеся матрицы
Диаграммы Юнга, плоские разбиения и знакочередующиеся матрицы
 
Зачем изучать алгоритмы?
Зачем изучать алгоритмы?Зачем изучать алгоритмы?
Зачем изучать алгоритмы?
 
ЖАДНЫЕ АЛГОРИТМЫ
ЖАДНЫЕ АЛГОРИТМЫ ЖАДНЫЕ АЛГОРИТМЫ
ЖАДНЫЕ АЛГОРИТМЫ
 
Жадные алгоритмы: введение
Жадные алгоритмы: введениеЖадные алгоритмы: введение
Жадные алгоритмы: введение
 
Разбор задач по дискретной вероятности
Разбор задач по дискретной вероятностиРазбор задач по дискретной вероятности
Разбор задач по дискретной вероятности
 
Asymptotic Growth of Functions
Asymptotic Growth of FunctionsAsymptotic Growth of Functions
Asymptotic Growth of Functions
 
Разбор задач модуля "Теория графов ll"
Разбор задач модуля "Теория графов ll"Разбор задач модуля "Теория графов ll"
Разбор задач модуля "Теория графов ll"
 
Алгоритмы и структуры данных весна 2014 лекция 2
Алгоритмы и структуры данных весна 2014 лекция 2Алгоритмы и структуры данных весна 2014 лекция 2
Алгоритмы и структуры данных весна 2014 лекция 2
 
Лекция 11. Вычислительная модель Pregel
Лекция 11. Вычислительная модель PregelЛекция 11. Вычислительная модель Pregel
Лекция 11. Вычислительная модель Pregel
 
Java осень 2013 лекция 1-1
Java осень 2013 лекция 1-1Java осень 2013 лекция 1-1
Java осень 2013 лекция 1-1
 
Java осень 2013 лекция 8
Java осень 2013 лекция 8Java осень 2013 лекция 8
Java осень 2013 лекция 8
 
Тестирование весна 2014 смешанное занятие 3
Тестирование весна 2014 смешанное занятие 3Тестирование весна 2014 смешанное занятие 3
Тестирование весна 2014 смешанное занятие 3
 
Лекция 13. YARN
Лекция 13. YARNЛекция 13. YARN
Лекция 13. YARN
 
Лекция 14. Hadoop в Поиске Mail.Ru
Лекция 14. Hadoop в Поиске Mail.RuЛекция 14. Hadoop в Поиске Mail.Ru
Лекция 14. Hadoop в Поиске Mail.Ru
 
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
 
Алгоритмы и структуры данных осень 2013 лекция 4
Алгоритмы и структуры данных осень 2013 лекция 4Алгоритмы и структуры данных осень 2013 лекция 4
Алгоритмы и структуры данных осень 2013 лекция 4
 
Алгоритмы и структуры данных осень 2013 лекция 3
Алгоритмы и структуры данных осень 2013 лекция 3Алгоритмы и структуры данных осень 2013 лекция 3
Алгоритмы и структуры данных осень 2013 лекция 3
 

Ähnlich wie Алгоритмы и структуры данных осень 2013 лекция 8

Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1Technopark
 
04 динамическое программирование - основные концепции
04 динамическое программирование - основные концепции04 динамическое программирование - основные концепции
04 динамическое программирование - основные концепцииFedor Tsarev
 
Николай Паламарчук "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
 
Лекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовЛекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовMikhail Kurnosov
 
Динамическое программирование на ruby
Динамическое программирование на rubyДинамическое программирование на ruby
Динамическое программирование на rubyEvgeny Smirnov
 
Алгоритмы решения задачи о булевой выполнимости (SAT) и их применение в крипт...
Алгоритмы решения задачи о булевой выполнимости (SAT) и их применение в крипт...Алгоритмы решения задачи о булевой выполнимости (SAT) и их применение в крипт...
Алгоритмы решения задачи о булевой выполнимости (SAT) и их применение в крипт...Positive Hack Days
 
Лекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмовЛекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмовMikhail Kurnosov
 
чернякова г.в.
чернякова г.в.чернякова г.в.
чернякова г.в.sharikdp
 
Основы программирования на ruby
Основы программирования на rubyОсновы программирования на ruby
Основы программирования на rubyEvgeny Smirnov
 
02 сортировка и поиск
02 сортировка и поиск02 сортировка и поиск
02 сортировка и поискFedor Tsarev
 
Discovering Lambdas in Java 8
Discovering Lambdas in Java 8Discovering Lambdas in Java 8
Discovering Lambdas in Java 8Stfalcon Meetups
 
Лекция 11 Приближенные алгоритмы
Лекция 11 Приближенные алгоритмыЛекция 11 Приближенные алгоритмы
Лекция 11 Приближенные алгоритмыsimple_people
 
тема множество для загрузки 2013
тема множество для загрузки 2013тема множество для загрузки 2013
тема множество для загрузки 2013AliyaAringazinova
 
Лекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмыЛекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмыMikhail Kurnosov
 
лекция1
лекция1лекция1
лекция1shagore
 
Запись алгоритмов на языках программирования
Запись алгоритмов на языках программированияЗапись алгоритмов на языках программирования
Запись алгоритмов на языках программированияssusere39acb
 

Ähnlich wie Алгоритмы и структуры данных осень 2013 лекция 8 (20)

Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1
 
04 динамическое программирование - основные концепции
04 динамическое программирование - основные концепции04 динамическое программирование - основные концепции
04 динамическое программирование - основные концепции
 
Урок 8. Введение в редукцию графов
Урок 8. Введение в редукцию графовУрок 8. Введение в редукцию графов
Урок 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"
 
Лекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовЛекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмов
 
Динамическое программирование на ruby
Динамическое программирование на rubyДинамическое программирование на ruby
Динамическое программирование на ruby
 
Алгоритмы решения задачи о булевой выполнимости (SAT) и их применение в крипт...
Алгоритмы решения задачи о булевой выполнимости (SAT) и их применение в крипт...Алгоритмы решения задачи о булевой выполнимости (SAT) и их применение в крипт...
Алгоритмы решения задачи о булевой выполнимости (SAT) и их применение в крипт...
 
Лекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмовЛекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмов
 
чернякова г.в.
чернякова г.в.чернякова г.в.
чернякова г.в.
 
Основы программирования на ruby
Основы программирования на rubyОсновы программирования на ruby
Основы программирования на ruby
 
Diskretn analiz
Diskretn analizDiskretn analiz
Diskretn analiz
 
Урок 1. Что такое функциональное программирование
Урок 1. Что такое функциональное программированиеУрок 1. Что такое функциональное программирование
Урок 1. Что такое функциональное программирование
 
02 сортировка и поиск
02 сортировка и поиск02 сортировка и поиск
02 сортировка и поиск
 
Discovering Lambdas in Java 8
Discovering Lambdas in Java 8Discovering Lambdas in Java 8
Discovering Lambdas in Java 8
 
Лекция 11 Приближенные алгоритмы
Лекция 11 Приближенные алгоритмыЛекция 11 Приближенные алгоритмы
Лекция 11 Приближенные алгоритмы
 
тема множество для загрузки 2013
тема множество для загрузки 2013тема множество для загрузки 2013
тема множество для загрузки 2013
 
Лекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмыЛекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмы
 
лекция1
лекция1лекция1
лекция1
 
Запись алгоритмов на языках программирования
Запись алгоритмов на языках программированияЗапись алгоритмов на языках программирования
Запись алгоритмов на языках программирования
 
01 вводная
01 вводная01 вводная
01 вводная
 

Mehr von Technopark

Лекция 12. Spark
Лекция 12. SparkЛекция 12. Spark
Лекция 12. SparkTechnopark
 
Лекция 10. Apache Mahout
Лекция 10. Apache MahoutЛекция 10. Apache Mahout
Лекция 10. Apache MahoutTechnopark
 
Лекция 9. ZooKeeper
Лекция 9. ZooKeeperЛекция 9. ZooKeeper
Лекция 9. ZooKeeperTechnopark
 
Лекция 7. Введение в Pig и Hive
Лекция 7. Введение в Pig и HiveЛекция 7. Введение в Pig и Hive
Лекция 7. Введение в Pig и HiveTechnopark
 
Лекция 6. MapReduce в Hadoop (графы)
Лекция 6. MapReduce в Hadoop (графы)Лекция 6. MapReduce в Hadoop (графы)
Лекция 6. MapReduce в Hadoop (графы)Technopark
 
Лекция 5. MapReduce в Hadoop (алгоритмы)
Лекция 5. MapReduce в Hadoop (алгоритмы)Лекция 5. MapReduce в Hadoop (алгоритмы)
Лекция 5. MapReduce в Hadoop (алгоритмы)Technopark
 
Лекция 4. MapReduce в Hadoop (введение)
Лекция 4. MapReduce в Hadoop (введение)Лекция 4. MapReduce в Hadoop (введение)
Лекция 4. MapReduce в Hadoop (введение)Technopark
 
Лекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFSЛекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFSTechnopark
 
Лекция 2. Основы Hadoop
Лекция 2. Основы HadoopЛекция 2. Основы Hadoop
Лекция 2. Основы HadoopTechnopark
 
Лекция 1. Введение в Big Data и MapReduce
Лекция 1. Введение в Big Data и MapReduceЛекция 1. Введение в Big Data и MapReduce
Лекция 1. Введение в Big Data и MapReduceTechnopark
 
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"Technopark
 
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...Technopark
 
СУБД 2013 Лекция №9 "Безопасность баз данных"
СУБД 2013 Лекция №9 "Безопасность баз данных"СУБД 2013 Лекция №9 "Безопасность баз данных"
СУБД 2013 Лекция №9 "Безопасность баз данных"Technopark
 
СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"Technopark
 
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"Technopark
 
СУБД 2013 Лекция №5 "Определение узких мест"
СУБД 2013 Лекция №5 "Определение узких мест"СУБД 2013 Лекция №5 "Определение узких мест"
СУБД 2013 Лекция №5 "Определение узких мест"Technopark
 
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...Technopark
 
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...Technopark
 
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"Technopark
 
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"Technopark
 

Mehr von Technopark (20)

Лекция 12. Spark
Лекция 12. SparkЛекция 12. Spark
Лекция 12. Spark
 
Лекция 10. Apache Mahout
Лекция 10. Apache MahoutЛекция 10. Apache Mahout
Лекция 10. Apache Mahout
 
Лекция 9. ZooKeeper
Лекция 9. ZooKeeperЛекция 9. ZooKeeper
Лекция 9. ZooKeeper
 
Лекция 7. Введение в Pig и Hive
Лекция 7. Введение в Pig и HiveЛекция 7. Введение в Pig и Hive
Лекция 7. Введение в Pig и Hive
 
Лекция 6. MapReduce в Hadoop (графы)
Лекция 6. MapReduce в Hadoop (графы)Лекция 6. MapReduce в Hadoop (графы)
Лекция 6. MapReduce в Hadoop (графы)
 
Лекция 5. MapReduce в Hadoop (алгоритмы)
Лекция 5. MapReduce в Hadoop (алгоритмы)Лекция 5. MapReduce в Hadoop (алгоритмы)
Лекция 5. MapReduce в Hadoop (алгоритмы)
 
Лекция 4. MapReduce в Hadoop (введение)
Лекция 4. MapReduce в Hadoop (введение)Лекция 4. MapReduce в Hadoop (введение)
Лекция 4. MapReduce в Hadoop (введение)
 
Лекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFSЛекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFS
 
Лекция 2. Основы Hadoop
Лекция 2. Основы HadoopЛекция 2. Основы Hadoop
Лекция 2. Основы Hadoop
 
Лекция 1. Введение в Big Data и MapReduce
Лекция 1. Введение в Big Data и MapReduceЛекция 1. Введение в Big Data и MapReduce
Лекция 1. Введение в Big Data и MapReduce
 
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
 
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
 
СУБД 2013 Лекция №9 "Безопасность баз данных"
СУБД 2013 Лекция №9 "Безопасность баз данных"СУБД 2013 Лекция №9 "Безопасность баз данных"
СУБД 2013 Лекция №9 "Безопасность баз данных"
 
СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"
 
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
 
СУБД 2013 Лекция №5 "Определение узких мест"
СУБД 2013 Лекция №5 "Определение узких мест"СУБД 2013 Лекция №5 "Определение узких мест"
СУБД 2013 Лекция №5 "Определение узких мест"
 
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
 
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...
 
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"
 
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
 

Алгоритмы и структуры данных осень 2013 лекция 8

  • 2. План лекции «Динамическое программирование и жадные алгоритмы»  Динамическое программирование.  Наибольшая общая подпоследовательность.  Расстояние Левенштейна.  Жадные алгоритмы.  Покрытие отрезками.  Задача о рюкзаке. 2
  • 3. Динамическое программирование Динамическое программирование (ДП) – способ решения сложных задач путём разбиения их на более простые подзадачи. Подход динамического программирования состоит в том, чтобы решить каждую подзадачу только один раз, сократив тем самым количество вычислений. Термин «динамическое программирование» также встречается в теории управления в смысле «динамической оптимизации». Основным методом ДП является сведение общей задачи к ряду более простых экстремальных задач. Лит.: Беллман Р., Динамическое программирование, пер. с англ., М., 1960. 3
  • 4. Динамическое программирование Пример. Числа Фибоначчи. 𝐹 𝑛 = 𝐹 𝑛−1 + 𝐹 𝑛−2 . 𝐹1 = 1, 𝐹0 = 1. Можно вычислять рекурсивно: 𝐹5 = 𝐹4 + 𝐹3 , 𝐹4 = 𝐹3 + 𝐹2 , 𝐹3 = 𝐹2 + 𝐹1 , Многие значения могут вычисляться несколько раз. Решение – сохранять результаты решения подзадач. Этот подход называется кэшированием. 4
  • 5. Динамическое программирование Пример. Вычисление рекуррентных функций нескольких аргументов. 𝐹 𝑥, 𝑦 = 3 ⋅ 𝐹 𝑥 − 1, 𝑦 − 2 ⋅ 𝐹 2 𝑥, 𝑦 − 1 , 𝐹 𝑥, 0 = 𝑥, 𝐹 0, 𝑦 = 0. Вычисление 𝐹 𝑥, 𝑦 сводится к вычислению двух 𝐹 ⋅,⋅ от меньших аргументов. Есть перекрывающиеся подзадачи. 𝐹 𝑥 − 1, 𝑦 − 1 в рекурсивном решении вычисляется дважды. 𝐹 𝑥 − 2, 𝑦 − 1 в рекурсивном решении вычисляется три раза. 𝑛 𝐹 𝑥 − 𝑛, 𝑦 − 𝑚 в рекурсивном решении вычисляется 𝐶 𝑛+𝑚 раз. Снова будем использовать кэширование – сохранять результаты. Вычисления будем выполнять от меньших аргументов к большим. 5
  • 6. Динамическое программирование // Вычисление рекуррентного выражения от двух переменных. int F( int x, int y ) { vector<vector<int>> values( x + 1 ); for( int i = 0; i <= x; ++i ) { values[i].resize( y + 1 ); values[i][0] = i; // F( x, 0 ) = x; } for( int i = 1; i <= y; ++i ) { values[0][i] = 0; // F( 0, y ) = 0; } // Вычисляем по рядам. for( int i = 0; i <= x; ++i ) { for( int j = 0; j <= y; ++j ) { values[i][j] = 3 * values[i – 1][j] – 2 * values[i][j – 1] * values[i][j – 1]; } } return value[x][y]; } 6
  • 7. Динамическое программирование При вычисление рекуррентной функции 𝐹 𝑥, 𝑦 можно было не хранить значения на всех рядах. Для вычисления очередного ряда достаточно иметь значения предыдущего ряда. Это оптимизация динамического программирования – запоминать только те значения, которые будут использоваться для последующих вычислений. Для вычисления следующего числа Фибоначчи 𝐹𝑖 также достаточно хранить лишь два предыдущих значения: 𝐹𝑖−1 и 𝐹𝑖−2 . 7
  • 8. Динамическое программирование Принципы ДП: 1. Разбить задачу на подзадачи. 2. Кэшировать результаты решения подзадач. 3. Удалять более неиспользуемые результаты решения подзадач (опционально). 8
  • 9. Динамическое программирование Два подхода динамического программирования: 1. Нисходящее динамическое программирование: задача 2. разбивается на подзадачи меньшего размера, они решаются и затем комбинируются для решения исходной задачи. Используется запоминание для решений часто встречающихся подзадач. Восходящее динамическое программирование: все подзадачи, которые впоследствии понадобятся для решения исходной задачи просчитываются заранее и затем используются для построения решения исходной задачи. Этот способ лучше нисходящего программирования в смысле размера необходимого стека и количества вызова функций, но иногда бывает нелегко заранее выяснить, решение каких подзадач нам потребуется в дальнейшем. 9
  • 10. Динамическое программирование Иногда бывает нелегко заранее выяснить, решение каких подзадач нам потребуется в дальнейшем. Пример. 𝐹 𝑛 = 𝐹 целочисленное. 𝑛 2 + 𝐹 2⋅𝑛 3 , 𝐹 0 = 𝐹 1 = 1, деление Восходящее динамическое программирование применить можно, но будут вычислены все значения F от 1 до n. Сложно определить, для каких k требуется вычислять 𝐹 𝑘 . Нисходящее динамическое программирование позволит вычислить только те 𝐹 𝑘 , которые требуются, но рекурсивно. Максимальная глубина рекурсии = log 3 2 𝑛 . 10
  • 11. Динамическое программирование // Вычисление рекуррентного выражения методом нисходящего ДП. int F( int n ) { map<int, int> values; values[0] = 1; values[1] = 1; return calcF( n, values ); } // Рекурсивное вычисление с запоминанием. int calcF( int n, map<int, int>& values ) { if( values.find( n ) != values.end() ) return values[n]; values[n] = calcF( n / 2, values ) + calcF( 2 * n / 3, values ); return values[n]; } 11
  • 12. Наибольшая общая подпоследовательность Последовательность X является подпоследовательностью Y, если из Y можно удалить несколько элементов так, что получится последовательность X. Задача. Наибольшая общая подпоследовательность (англ. longest common subsequence, LCS) – задача поиска последовательности, которая является подпоследовательностью нескольких последовательностей (обычно двух). Элементами подпоследовательности могут быть числа, символы… X = ABCAB, Y = DCBA, НОП( X, Y ) = BA, CA, CB. 12
  • 13. Наибольшая общая подпоследовательность Будем решать задачу нахождения наибольшей общей подпоследовательности с помощью Динамического программирования. Сведем задачу к подзадачам меньшего размера: 𝑓 𝑛1 , 𝑛2 – длина наибольшей общей подпоследовательности строк 𝑠1 0. . 𝑛1 , 𝑠2 0. . 𝑛2 . 13
  • 14. Наибольшая общая подпоследовательность A 0 B C A B 0 0 0 0 0 D 0 ←↑ 0 ←↑ 0 ←↑ 0 ←↑ 0 ←↑ 0 C 0 ←↑ 0 ←↑ 0 B 0 ←↑ 0 A 0 ↖1 ↖1 ↖1 ←1 ←1 ←↑ 1 ←↑ 1 ↖2 ←↑ 1 ←↑ 1 ↖2 ←↑ 2 14
  • 15. Наибольшая общая подпоследовательность 𝑓 𝑛1 , 𝑛2 – длина НОП. Как восстановить саму подпоследовательность? Можно хранить в каждой ячейке таблицы «направление» перехода. Переход по диагонали означает, что очередной символ присутствует в обоих последовательностях. Начинаем проход от правого нижнего угла. Идем по стрелкам, на каждый переход по диагонали добавляем символ в начало строящейся подпоследовательности. «Направления» можно не хранить, а вычислять по значениям в таблице. 15
  • 16. Расстояние Левенштейна Расстояние Левенштейна (также редакционное расстояние или дистанция редактирования) между двумя строками – это минимальное количество следующих операций:  вставки одного символа,  удаления одного символа,  замены одного символа на другой, необходимых для превращения одной строки в другую. Впервые задачу упомянул в 1965 году советский математик Владимир Иосифович Левенштейн при изучении последовательностей 0-1. 16
  • 17. Расстояние Левенштейна Расстояние Левенштейна и его обобщения активно применяется:  для исправления ошибок в слове (в поисковых системах, базах данных, при вводе текста, при автоматическом распознавании отсканированного текста или речи).  для сравнения текстовых файлов утилитой diff и ей подобными. Здесь роль «символов» играют строки, а роль «строк» — файлы.  в биоинформатике для сравнения генов, хромосом и белков. 17
  • 18. Расстояние Левенштейна Будем вычислять расстояние Левенштейна с помощью Динамического программирования. 18
  • 20. Расстояние Левенштейна. Доказательство. Для начала заметим, что в оптимальной последовательности операций, операции можно произвольно менять местами. В самом деле, рассмотрим две последовательные операции. Это могут быть операции вставки, удаления и замены, одного или разных символов:  Две замены разных символов можно менять местами  Стирание и вставку разных символов можно менять местами  Вставка символа и замена другого символа меняются местами  Стирание символа и замена другого символа меняются местами  Два стирания или две вставки можно менять местами  Две замены одного и того же символа — неоптимально (если мы заменили x на y, потом y на z, выгоднее было сразу заменить x на z)  Вставка символа с его последующим стиранием — неоптимально (можно их обе отменить)  Вставка символа с его последующей заменой — неоптимально (излишняя замена)  Замена символа с его последующим стиранием — неоптимально (излишняя замена) 20
  • 21. Расстояние Левенштейна. Доказательство. Пусть 𝑆1 кончается на символ «a», 𝑆2 кончается на символ «b». Есть три варианта: 1. Если символ «а», на который кончается 𝑆1 , в какой-то момент был стёрт. Сделаем это стирание первой операцией. Тогда мы стёрли символ «a», после чего превратили первые i1 символов 𝑆1 в 𝑆2 (на что потребовалось 𝐷 𝑖 − 1, 𝑗 операций), значит, всего потребовалось 𝐷 𝑖 − 1, 𝑗 + 1 операций. 2. Символ «b», на который кончается 𝑆2 , в какой-то момент был добавлен. Сделаем это добавление последней операцией. Мы превратили 𝑆1 в первые j-1 символов 𝑆2 , после чего добавили «b». Аналогично предыдущему случаю, потребовалось 𝐷 𝑖, 𝑗 − 1 + 1 операций. 3. Оба предыдущих утверждения неверны. Если мы добавляли символы справа от финального «a», то, чтобы сделать последним символом «b», мы должны были или в какой-то момент добавить его (но тогда утверждение 2 было бы верно), либо заменить на него один из этих добавленных символов (что тоже невозможно, потому что добавление символа с его последующей заменой неоптимально). Значит, символов справа от финального «a» мы не добавляли. Самого финального «a» мы не стирали, поскольку утверждение 1 неверно. Значит, единственный способ изменения последнего символа — его замена. Заменять его 2 или больше раз неоптимально. Значит,  Если 𝑎 = 𝑏, мы последний символ не меняли. Поскольку мы его также не стирали и не приписывали ничего справа от него, он не влиял на наши действия, и, значит, мы выполнили 𝐷 𝑖 − 1, 𝑗 − 1 операций.  Если 𝑎 ≠ 𝑏, мы последний символ меняли один раз. Сделаем эту замену первой. В дальнейшем, аналогично предыдущему случаю, мы должны выполнить 𝐷 𝑖 − 1, 𝑗 − 1 операций, значит, всего потребуется 𝐷 𝑖 − 1, 𝑗 − 21
  • 22. Расстояние Левенштейна // Вычисление расстояния Левенштейна. int LevenshteinDistance( const string& s, int sLength, const string& t, int tLength ) { // Крайние случаи. if( sLength == 0 ) return tLength; if( tLength == 0 ) return sLength; // Проверим совпадение последних символов. int cost = s[sLength - 1] == t[tLength - 1] ? 0 : 1; // Вычисляем минимум. return min( LevenshteinDistance( s, sLength - 1, t, tLength ) + 1, LevenshteinDistance( s, sLength, t, tLength – 1 ) + 1, LevenshteinDistance( s, sLength - 1, t, tLength – 1 ) + cost ); } 22
  • 23. Расстояние Дамерау-Левенштейна. Расстояние Дамерау – Левенштейна — это мера разницы двух строк символов, определяемая как минимальное количество операций вставки, удаления, замены и транспозиции (перестановки двух соседних символов), необходимых для перевода одной строки в другую. Является модификацией расстояния Левенштейна: к операциям вставки, удаления и замены символов, определенных в расстоянии Левенштейна добавлена операция транспозиции (перестановки) символов. 23
  • 25. Жадные алгоритмы Жадный алгоритм (англ. Greedy algorithm) – алгоритм, заключающийся в принятии локально оптимальных решений на каждом этапе, допуская, что конечное решение также окажется оптимальным. Доказательство оптимальности часто следует такой схеме: 1. Доказывается, что жадный выбор на первом шаге не закрывает пути к оптимальному решению: для всякого решения есть другое, согласованное с жадным выбором и не хуже первого. 2. Показывается, что подзадача, возникающая после жадного выбора на первом шаге, аналогична исходной. 3. Рассуждение завершается по индукции. 25
  • 26. Жадные алгоритмы Пример. Размен монет. Монетная система некоторого государства состоит из монет достоинством 𝑎1 = 1 < 𝑎2 < ⋯ < 𝑎 𝑛 . Требуется выдать сумму S наименьшим возможным количеством монет. Жадный алгоритм решения этой задачи: Берётся наибольшее возможное количество монет достоинства 𝑎 𝑛 : 𝑥 𝑛 = 𝑆 𝑎 𝑛 . Также получаем, сколько нужно монет меньшего номинала. Для данной задачи жадный алгоритм не всегда даёт оптимальное решение. Например. Монеты в 1, 5 и 7коп. Сумма 24. Жадный алгоритм разменивает так: 7к. — 3 шт., 1к. — 3 шт. Правильное решение: 7к. — 2 шт., 5к. — 2 шт. Тем не менее, на всех реальных монетных системах жадный алгоритм даёт правильный ответ. 26
  • 27. Покрытие отрезками Задача. Дано множество отрезков 𝑎 𝑖 , 𝑏 𝑖 , покрывающее отрезок 0, 𝑋 . Найти наименьшее подпокрытие, т.е. минимальный набор отрезков, по-прежнему покрывающий отрезок 0, 𝑋 . Жадное решение. Упорядочим набор отрезков по возрастанию левого конца 𝑎 𝑖 . Шаг 1. Среди отрезков, содержащих 0, найдем такой, у которого наибольший правый конец 𝑏 𝑖 . Обозначим этот отрезок 𝑎1 , 𝑏1 . Шаг 2. Среди отрезков, содержащих 𝑏1 , найдем такой, у которого наибольший правый конец 𝑏 𝑖 . Обозначим этот отрезок 𝑎2 , 𝑏2 . И так далее. 27
  • 28. Покрытие отрезками Утверждение. Жадное решение является оптимальным. Доказательство. От противного. Пусть жадное решение состоит из K отрезков 𝑎 𝑖 , 𝑏 𝑖 . И пусть существует более оптимальное решение 𝑎 𝑖 , 𝑏 𝑖 , состоящие из менее чем K отрезков. Упорядочим отрезки в решениях по правому краю. Заметим, что отрезки также будут упорядочены и по левому краю в оптимальном решении и в жадном решении. Найдем первый отрезок, отличающийся в жадном решении от оптимального. У такого отрезка оптимального решения меньше правый край и он по-прежнему покрывает правый край предыдущего общего отрезка. Значит, его можно заменить на отрезок из жадного решения. Так, заменяя отрезки оптимального решения на отрезки жадного, получим, что менее K первых отрезков жадного решения являются оптимальным решением, что невозможно по построению жадного решения. 28
  • 29. Задача о рюкзаке Задача о рюкзаке (англ. Knapsack problem) — одна из NP-полных задач комбинаторной оптимизации. Название своё получила от максимизационной задачи укладки как можно большего числа нужных вещей в рюкзак при условии, что общий объём (или вес) всех предметов, способных поместиться в рюкзак, ограничен. Имеется N грузов. Для каждого i-го груза определён вес 𝑤 𝑖 и ценность 𝑐 𝑖 . Нужно упаковать в рюкзак ограниченной грузоподъёмности G те грузы, при которых суммарная ценность упакованного была бы максимальной. 29
  • 30. Задача о рюкзаке Жадный алгоритм. Предметы сортируются по убыванию стоимости единицы каждого. Помещаем в рюкзак то, что помещается, и одновременно самое дорогое, т.е с максимальным отношением цены к весу. В оставшееся место помещаем следующий предмет аналогично. Точное решение можно получить не всегда. 30
  • 31. Задача о рюкзаке Пример. Пусть вместимость рюкзака 90. Предметы уже отсортированы. Применяем к ним жадный алгоритм. вес цена цена/вес 1 20 60 3 2 30 90 3 3 50 100 2 Кладём в рюкзак первый, а за ним второй предметы. Третий предмет в рюкзак не влезет. Суммарная ценность поместившегося равна 150. Если бы были взяты второй и третий предметы, то суммарная ценность составила бы 190. Видно, что жадный алгоритм не обеспечивает оптимального решения, поэтому относится к приближенным. 31