4.1 Материалы модуля
4.2 k-перестановки из n элементов
4.3 Урновые схемы и схемы раскладки по ящикам.
4.4 Подсчет отображений конечных множеств
4.5 Рекуррентные соотношения
4.1 Материалы модуля
4.2 k-перестановки из n элементов
4.3 Урновые схемы и схемы раскладки по ящикам.
4.4 Подсчет отображений конечных множеств
4.5 Рекуррентные соотношения
Для чтения не требуется почти никаких предварительных знаний, по крайней мере, ничего выходящего за рамки школьной программы. Исключение составляет только последний раздел.
Точечная оценка. Определение
Пример 1
Свойства точечных оценок
Несмещенность
Пример 2
Состоятельность
Эффективность
Асимптотическая нормальность
Робастность
Для чтения не требуется почти никаких предварительных знаний, по крайней мере, ничего выходящего за рамки школьной программы. Исключение составляет только последний раздел.
Точечная оценка. Определение
Пример 1
Свойства точечных оценок
Несмещенность
Пример 2
Состоятельность
Эффективность
Асимптотическая нормальность
Робастность
Диаграммы Юнга, плоские разбиения и знакочередующиеся матрицыDEVTYPE
Сколько есть способов разбить натуральное число в сумму нескольких слагаемых, если суммы, отличающиеся только порядком слагаемых, считаются одинаковыми? Оказывается, что на этот, казалось бы, элементарный вопрос нет простого ответа. Зато теория, начинающаяся с этого вопроса, оказывается очень интересной, а ее результаты находят применение в самых разных разделах математики и математической физики.
Настоящая брошюра написана по материалам лекций, прочитанных автором на летней школе «Современная математика» в Дубне в июле 2013 года. Она рассчитана на старшеклассников и студентов младших курсов.
Опечатки в слайдах на видео: в псевдокоде алгоритма решения непрерывной задачи о рюкзаке предметы должны сортироваться по убыванию (а не возрастанию) удельной стоимости.
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
Николай Паламарчук "Functional Programming basics for PHP developers"Fwdays
Functional Programming becomes very popular nowadays. What is it? Is it a hype or panacea? Should you deal with it as a PHP programmer? Let's find out!
Рассказывается об основах программирования на ruby: переменные, типы переменных, операции и пр. В конце приводятся блок-схема решения линейного уравнения.
Olexandra Dmytrenko
QA Automating at EPAM Systems
I'll show you how to switch from writing standard code using good old Java7 into writing it using functional way presented in Java8. The training is counted on beginners in the subject who like discovering the new horizons or for those who want to become more firm in using the new lambda features.
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
Лекция 5. MapReduce в Hadoop (алгоритмы)Technopark
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
Лекция 3. Распределённая файловая система HDFSTechnopark
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
Лекция 1. Введение в Big Data и MapReduceTechnopark
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"Technopark
Технопарк Mail.ru Group, МГТУ им. Н.Э. Баумана. Курс "Базы данных".
Лекция №10 "Нереляционное решение в области баз данных — NoSQL". Лектор - Станислав Ступников.
Вводная часть посвящена определению и истории развития концепции NoSQL. Даются характеристики, рассказывается о способах использования. Рассматриваются виды NoSQL БД, теоретические основы NoSQL, а в конце лекции обсуждаются недостатки NoSQL-решений, а также проводится сравнение разных NoSQL-решений.
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9obOz5K695ugYuiOOCBciEi
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...Technopark
Технопарк Mail.ru Group, МГТУ им. Н.Э. Баумана. Курс "Базы данных".
Лекция №10 "Нереляционное решение в области баз данных — NoSQL". Лектор - Станислав Ступников.
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9obOz5K695ugYuiOOCBciEi
Технопарк Mail.ru Group, МГТУ им. Н.Э. Баумана. Курс "Базы данных".
Лекция №9 "Безопасность баз данных". Лектор - Павел Щербинин.
Открывается лекция рассказом о резервном копировании (о логических и физических резервных копиях, о выборе данных для копирования). Затем определяется терминология для обсуждения дальнейших вопросов. После этого рассматриваются основы учётных записей: таблицы доступа, привилегии, виды записей. Обсуждаются SQL-injection, список смежных вершин (Adjacency Set), вложенное множество (Nested Set), материализованный путь (Materialized Path) и комбинированный подход.
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9obOz5K695ugYuiOOCBciEi
СУБД 2013 Лекция №8 "Конфигурирование базы данных"Technopark
Технопарк Mail.ru Group, МГТУ им. Н.Э. Баумана. Курс "Базы данных".
Лекция №8 "Конфигурирование базы данных". Лектор - Павел Щербинин.
Сначала объясняются основы конфигурирования и общие принципы настройки. Далее рассказывается об области видимости, о настройке использования памяти, обсуждается размер блока ключей key_cache_block_size. Рассматривается устройство и использование кэша InnoDB, а также кэшей потоков и таблиц. Затем говорится об особенностях ввода/вывода в InnoDB. Далее рассказывается о табличном пространстве, оптимизации файловой сортировки, переменных состояния. Финальная часть лекции посвящена репликации: настройка, синхронизация, топология, планирование пропускной способности, администрирование и обслуживание, проблемы и их решения.
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9obOz5K695ugYuiOOCBciEi
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"Technopark
Технопарк Mail.ru Group, МГТУ им. Н.Э. Баумана. Курс "Базы данных".
Лекция №7 "Оптимизация запросов и индексирование". Лектор - Павел Щербинин.
Вначале рассказывается об оптимизации доступа к данным, о декомпозиции соединения и состоянии запроса. Далее идёт большой блок, посвящённый оптимизатору запросов (изменение порядка соединения, применение алгебраических правил эквивалентности, оптимизации COUNT(), MIN(), MAX(), вычисление и свертка константных выражений, покрывающие индексы, оптимизация подзапросов, раннее завершение, сравнение по списку IN() и распространение равенства). Затем последовательно рассматриваются такие вещи, как соединение (JOIN) в MySQL, оптимизатор сортировки, коррелированные подзапросы, слияние и непоследовательный просмотр индексов, функции SELECT & UPDATE, COUNT(). После этого рассказывается об оптимизации запросов с помощью JOIN, GROUP BY, DISTINCT и LIMIT со смещением. В конце лекции даётся информация о кэшировании запросов, объединённых таблицах и секционировании.
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9obOz5K695ugYuiOOCBciEi
Технопарк Mail.ru Group, МГТУ им. Н.Э. Баумана. Курс "Базы данных".
Лекция №5 "Определение узких мест". Лектор - Павел Щербинин.
Вначале рассказывается о подсистемах хранения: MyISAM, InnoDB, Memory, о критериях выбора подсистем хранения, приводятся практические примеры. Затем обсуждается тема индексирования (B-tree, хеш-индексы) и EXPLAIN (столбцы id, table, possible_keys, key, key_len).
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9obOz5K695ugYuiOOCBciEi
Технопарк Mail.ru Group, МГТУ им. Н.Э. Баумана. Курс "Базы данных".
Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-запросы". Лектор - Павел Щербинин.
Лекция открывается рассказом о том, что такое профилирование запроса, каковы его этапы выполнения в MySQL. Рассказывается о том, как планировать запрос, как осуществляется протоколирование запросов, как собирается статистика. Объясняются основы индексирования, подробно обсуждаются стратегии индексирования для достижения высокой производительности: изоляция столбца, кластерные индексы (преимущества и недостатки), размещение данных в MyISAM и InnoDB, покрывающие индексы. Далее затрагивается тема нормализации и денормализации, а также таблиц счётчиков. В завершении рассказывается о версионировании схемы БД: о методах инкрементных изменений, идемпотентных изменений, уподобления структуры БД исходному коду.
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9obOz5K695ugYuiOOCBciEi
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...Technopark
Технопарк Mail.ru Group, МГТУ им. Н.Э. Баумана. Курс "Базы данных". Лекция №4 "Расширенные возможности работы с базами данных. Триггеры и хранимые процедуры"
Лектор - Павел Щербинин.
Первая часть лекции посвящена хранимым процедурам (использование, примеры кода, аспекты безопасности при использовании хранимых процедур): LOOP, REPEAT, WHILE, HANDLER, курсоры, EXECUTE. Во второй части рассказывается о триггерах: BEFORE, AFTER, INSTEAD OF, о специальных таблицах inserted, updated и deleted, об использовании триггеров для поддержания целостности и бизнес-логики, о проблемах при использовании триггеров, приводятся примеры кода. В завершающей части лекции обсуждаются вопросы, связанные с транзакциями: концепция A.C.I.D.; уровни изоляции ANSI/ISO (SET TRANSACTION ISOLATION LEVEL); взаимовлияние транзакций и проблемы lost update, dirty read, non-repeatable read и phantom read; технология MVCC (контроль версионирования конкуренции); конкуренция; параллельность и согласованность.
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9obOz5K695ugYuiOOCBciEi
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"Technopark
Технопарк Mail.ru Group, МГТУ им. Н.Э. Баумана. Курс "Базы данных". Лекция №3 "Выборка данных (продолжение). Транзакции"
Лектор - Павел Щербинин.
Лекция начинается с рассказа о добавлении данных и операторе INSERT, о модификации данных и операторе UPDATE, об удалении данных и операторе DELETE. Затем небольшая часть лекции посвящена пользовательским переменным. После этого даётся информация о подзапросах: SUBQUERIES, ROW SUBQUERIES, SUBQUERIES in FROM. Далее говорится об агрегации (UNION), о семействе функций JOIN и соединении таблиц, а в завершение лекции — о понятии VIEW (каковы преимущества, ограничения и особенности, алгоритмы использования и изменение).
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9obOz5K695ugYuiOOCBciEi
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"Technopark
Технопарк Mail.ru Group, МГТУ им. Н.Э. Баумана. Курс "Базы данных". Лекция №2 "Модификация данных. Выборка данных (начало)"
Лектор - Павел Щербинин.
Сначала завершается рассмотрение типа данных MySQL «Дата и время». Затем рассказывается о создании таблиц (CREATE TABLE): create_definition, column_definition, reference_defenition, обновление кортежа в родительском отношении. Далее обсуждается процедура изменения таблицы (ALTER TABLE), выборка данных и оператор SELECT, а также фильтрация (формирование групп, агрегаторы).
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9obOz5K695ugYuiOOCBciEi
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
15. Наибольшая общая
подпоследовательность
𝑓 𝑛1 , 𝑛2 – длина НОП.
Как восстановить саму подпоследовательность?
Можно хранить в каждой ячейке таблицы «направление»
перехода. Переход по диагонали означает, что очередной символ
присутствует в обоих последовательностях.
Начинаем проход от правого нижнего угла.
Идем по стрелкам, на каждый переход по диагонали добавляем
символ в начало строящейся подпоследовательности.
«Направления» можно не хранить, а вычислять по значениям в
таблице.
15
16. Расстояние Левенштейна
Расстояние Левенштейна (также редакционное расстояние или
дистанция редактирования) между двумя строками – это
минимальное количество следующих операций:
вставки одного символа,
удаления одного символа,
замены одного символа на другой,
необходимых для превращения одной строки в другую.
Впервые задачу упомянул в 1965 году советский математик
Владимир Иосифович Левенштейн при изучении
последовательностей 0-1.
16
17. Расстояние Левенштейна
Расстояние Левенштейна и его обобщения активно применяется:
для исправления ошибок в слове (в поисковых системах, базах
данных, при вводе текста, при автоматическом распознавании
отсканированного текста или речи).
для сравнения текстовых файлов утилитой diff и ей подобными.
Здесь роль «символов» играют строки, а роль «строк» —
файлы.
в биоинформатике для сравнения генов, хромосом и белков.
17
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
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