Загрузил rodzher.zet

Практика по алгоритмам Жадные алгоритмы

Реклама
Первый курс, весенний семестр 2019/20
Практика по алгоритмам #8
Жадные алгоритмы
6 марта
Собрано 8 марта 2020 г. в 17:08
Содержание
1. Жадные алгоритмы
1
2. Разбор задач практики
2
3. Домашнее задание
3.1. Обязательная часть . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.2. Дополнительная часть . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
5
5
4. Разбор домашнего задания
4.1. Обязательная часть . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.2. Дополнительная часть . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
6
8
Алгоритмы, весна 2019/20
Практика #8. Жадные алгоритмы.
Жадные алгоритмы
1. 2-приближение Vertex Cover
Найдите вершинное покрытие не более, чем вдвое превышающее оптимальное. 𝒪(𝑉 + 𝐸).
2. Неприближаемость коммивояжера
Покажите, что нельзя за полином найти приближение задачи о коммивояжере без нер-ва △.
3. Хаффман
a) Постройте код Хаффмана за 𝒪(𝑛), если даны частоты букв в отсортированном порядке.
b) Докажите, что если частоты всех символов < 1/3, то нет символа с длиной кода 1.
c) Какова максимальная длина кода над алфавитом размера 𝑚? Приведите пример частот.
4. Сбалансированное разбиение
Удалить из дерева размера 𝑛 вершину, чтобы оставшиеся компоненты были размера 6 21 𝑛.
5. Белоснежка и 𝑛 гномов
Даны 𝑛 гномов. Если 𝑖-го гнома укладывать спать 𝑎𝑖 минут, он потом спит 𝑏𝑖 минут.
Можно ли сделать так, чтобы в какой-то момент все гномы спали?
6. Башня из стойких спортсменов
Есть 𝑛 спортсменов. 𝑖-й спортсмен имеет массу 𝑚𝑖 и может держать на своих плечах суммарную массу 𝑠𝑖 . Какое максимальное число спортсменов могут выстроиться в башню? 𝒪(𝑛2 ).
7. Вылезти из ямы
Однажды на РОИ 𝑛 школьников упали в яму глубины 𝑆.
Каждый школьник имеет рост (от ног до плеч) ℎ𝑖 и длину рук 𝑙𝑖 .
Школьники могут вставать друг другу на плечи, верхний школьник может вытянуть руки.
a) Могут ли выбраться все школьники?
b) Какое максимальное число школьников может выбраться?
8. Задача о жадном выборе заявок
Ученые хотят прочесть доклады, 𝑖-й запланировал свой доклад на время [𝑎𝑖 , 𝑏𝑖 ].
a) Какое максимальное число докладов можно прочитать, если есть только одна аудитория?
b) Найти минимальное число аудиторий, чтобы прочитать все доклады (два решения).
c) Найти максимальное число докладов, если есть 𝑘 аудиторий (два решения).
9. Разбиение на подпоследовательности
a) Разбить массив на минимальное число возрастающих подпоследовательностей.
b) (*) Выбрать из массива 𝑘 возрастающих непересекающихся подпоследовательности максимальной суммарной длины. Найти только длину за 𝒪(𝑘𝑛
√ log 𝑛).
c) (*) Найти и длину, и сами последовательности за 𝒪(𝑛 𝑛).
1/8
Алгоритмы, весна 2019/20
Практика #8. Жадные алгоритмы.
Разбор задач практики
1. 2-приближение Vertex Cover
Жадно наберем паросочетание, пока набирается: проходим по всем ребрам, если у какого-то
ребра не помечен ни один конец, помечаем оба.
Если нашли 𝑘 ребер, у которых не пересекаются концы, то в ответе > 𝑘 вершин, а мы взяли
2𝑘.
2. Неприближаемость коммивояжера
Пусть 𝐶-приближение коммивояжера. Тогда решим гамильтонов цикл в неорграфе: берем
граф, делаем вес его ребер 1, а между всеми парами вершин, где нет ребра, проводим ребро
веса 𝐶𝑛 + 1.
Если гамильтонов цикл был, то в новом графе есть путь коммивояжера веса 𝑛, и приближение даст ответ 6 𝐶𝑛.
Если не было, то коммивояжер должен пройти по новому ребру и имеет вес > 𝐶𝑛.
3. Хаффман
a) Построение за 𝒪(𝑛).
Две очереди: для старых символов и для новых.
Частоты новых символов всегда возрастают ⇒ очередь новых символов будет всегда в
возрастающем порядке.
Так что можно находить минимальный символ за 𝒪(1), это минимум из первых элементов
обеих очередей.
b) У редких символов длинные коды.
Пусть есть символ с кодом длины 1, кончается в вершине 𝑥. Его частота < 1/3, ⇒ на
последнем шаге он объединился с вершиной 𝑦 частотой > 2/3.
Исходные символы редкие ⇒ 𝑦 получилась слиянием каких-то 𝑎 и 𝑏.
Пусть 𝑎 более частый. Частота 𝑦 > 2/3 ⇒ у 𝑎 частота > 1/3.
Тогда перед слиянием 𝑎 и 𝑏 в 𝑦 минимальные частоты были у 𝑥 и 𝑏, противоречие.
c) Max длина кода.
Если частоты 1, 1, 2, 4, . . . , 2𝑚−2 , то есть код длины 𝑚 − 1.
Больше в полном двоичном дереве с 𝑚 листьями не бывает.
4. Сбалансированное разбиение
Пойдем сверху вниз по дереву. Пока существует ребенок с поддеревом размера > 𝑛2 , идем в
него. Остановились в вершине 𝑣, ее и надо удалить. Раз остановились, все дети 6 𝑛2 . Раз не
остановились раньше, ее поддерево > 𝑛2 ⇒ выше нее осталось 6 𝑛2 .
5. Белоснежка и 𝑛 гномов ∑︀
∑︀
У первого уложенного 𝑏𝑖 >
𝑎𝑗 ⇔ 𝑎𝑖 + 𝑏 𝑖 > 𝑎𝑗 .
𝑗̸=𝑖
Отсюда мысль – сортируем по убыванию 𝑎𝑖 + 𝑏𝑖 .
Действительно, если у двух подряд уложенных гномов 𝑎𝑖 + 𝑏𝑖 < 𝑎𝑖+1 + 𝑏𝑖+1 , то их можно
поменять
∑︀ местами:∑︀
𝑏𝑖 >
𝑎𝑗 ⇒ 𝑏 𝑖 >
𝑎𝑗 (можно 𝑖 передвинуть вперед, вообще если гнома можно положить
𝑗>𝑖
𝑗>𝑖+1
перед каким-то множеством, то перед меньшим тем более можно),
2/8
Алгоритмы, весна 2019/20
𝑎𝑖 + 𝑏 𝑖 >
∑︀
𝑗>𝑖
𝑎𝑗 ⇒ 𝑎𝑖+1 + 𝑏𝑖+1 >
Практика #8. Жадные алгоритмы.
∑︀
𝑎𝑗 (можно передвинуть (𝑖 + 1) назад, вообще если можно
𝑗>𝑖
гнома положить перед каким-то множеством, то гнома с большей суммой тем более можно).
6. Башня из стойких спортсменов
Мы знаем, в каком порядке можно поставить тех спортсменов, которые войдут в башню: в
порядке убывания 𝑠𝑖 + 𝑚𝑖 (с наименьшей сверху). Отсортируем в таком порядке.
Будем строить башню сверху вниз. Динамика 𝑓𝑛,𝑘 – минимальный вес башни, если из первых
𝑛 спортсменов взяли в башню 𝑘.
𝑓𝑛,𝑘 = min(𝑓𝑛−1,𝑘 , 𝑓𝑛−1,𝑘−1 + 𝑚𝑛 ).
Второй переход возможен только при 𝑠𝑛 > 𝑓𝑛−1,𝑘−1 .
7. Вылезти из ямы
a) Школьник, вылезающий последним, должен уметь в одиночку выбираться из ямы, для
остальных глубина ямы меньше за счет стоящих ниже. Отсюда мысль – сортируем по
возрастанию ℎ𝑖 + 𝑙𝑖 .
Действительно, если ℎ𝑖 + 𝑙𝑖 > ℎ𝑖+1 + 𝑙𝑖+1 , то можно обменять местами.
Раз второй выбирался из более глубокой ямы, выберется и из менее глубокой.
Раз второй выбирался из более глубокой ямы, выберется и первый.
b) Сортируем школьников по возрастанию ℎ𝑖 + 𝑙𝑖 . Те, кто не вылезет, будут помогать вылезать, за счет из ростов можно считать яму менее глубокой.
Будем идти по школьникам от последних вылезающих к первым.
∑︀ 𝑓𝑛,𝑘 – минимальная
глубина, если из 𝑛 школьников выпускаем 𝑘. Глубина равна 𝑆 − ℎ𝑗 , где сумма по невыпущенным школьникам.
𝑓𝑛,𝑘 = min(𝑓𝑛−1,𝑘 − ℎ𝑛 , 𝑓𝑛−1,𝑘−1 ).
Второй переход возможен только при ℎ𝑛 + 𝑙𝑛 > 𝑓𝑛−1,𝑘−1 .
8. Задача о жадном выборе заявок
a) Одна аудитория: max число непересекающихся отрезков. Сортировка по правому концу.
b) min число аудиторий.
Способ 1. Сортируем события «начало отрезка», «конец отрезка». Находим точку, покрытую max числом отрезков.
Способ 2. Идем по докладам по возрастанию правого конца.
Храним set правых концов последних докладов каждой аудитории.
Пришел новый доклад [𝑙, 𝑟], добавим его в такую аудиторию 𝑆, что он подойдет, и доклад
перед ним кончается максимально поздно. Т.е. к set.lower_bound(𝑙).
Если в оптимуме в 𝑆 добавили [𝑎, 𝑏], а [𝑙, 𝑟] добавили в другую аудиторию 𝑇 , то можно
поменять местами хвосты 𝑆 и 𝑇 .
c) 𝑘 аудиторий: почти так же, как для 𝑘 = 1. Сортируем по возрастанию 𝑟𝑖 .
Храним правые концы всех взятых отрезков в vector<int> v.
Берем в ответ ⟨𝑙𝑖 , 𝑟𝑖 ⟩, если (v.size() < k || v[v.size() - k] < 𝑙𝑖 ).
Корректность. Смотрим на первый отрезок в порядке возрастания 𝑟, который у нас не
как в оптимальном ответе. Пусть мы взяли 𝑖, а оптимальный 𝑗.
Если 𝑗 < 𝑖, то 𝑗 не противоречит предыдущим отрезкам, и мы бы его взяли.
Если 𝑖 < 𝑗, заменим в оптимальном ответе 𝑗 на 𝑖, он остался корректным.
9. Разбиение на подпоследовательности
a) Храним set концов набранных последовательностей.
3/8
Алгоритмы, весна 2019/20
Практика #8. Жадные алгоритмы.
Пришел новый элемент 𝑥, добавим его к такой последовательности 𝑆, что он подойдет, и
элемент перед ним максимален. Т.е. к set.lower_bound(𝑥).
Если в оптимуме в 𝑆 добавили 𝑦, а 𝑥 добавили в какую-то 𝑇 , то можно поменять местами
хвосты 𝑆 и 𝑇 .
b) (*) Вспомним, как мы решаем задачу за 𝒪(𝑛 log 𝑛) для 𝑘 = 1. Динамика
𝑡𝑒𝑛𝑑[len] – минимальный конец последовательности длины 𝑙𝑒𝑛.
Теперь храним 𝑘 последовательностей end𝑖 [len] для 𝑖 = 1..𝑘.
Причём последовательности упорядочены по длине, 𝑒𝑛𝑑1 – самая длинная.
Приходит новый элемент 𝑎𝑖 . Найдём бинпоиском его позицию 𝑝 в end1 : end1 [𝑝 − 1] < 𝑎𝑖 6
end1 [𝑝].
Заменяем end1 [𝑝] на 𝑎𝑖 . Получается, мы как бы вытолкнули из end1 элемент end1 [𝑝]. Добавим его таким же образом в end2 . И так далее...
В итоге мы получим не последовательности, а какой-то мусор. Зато суммарная длина
этого мусора в точности равна ответу на задачу. Без доказательства.
√
c) (*) Найти и длину, и сами последовательности за 𝒪(𝑛 𝑛).
4/8
Алгоритмы, весна 2019/20
Практика #8. Жадные алгоритмы.
Домашнее задание
3.1. Обязательная часть
1. (2) Задания и дедлайны
Вы – студент, у вас есть куча дзшек. У каждого задания есть 𝑡𝑖 – сколько часов его нужно
делать. Чтобы 𝑖-е задание зачли, его нужно начать делать не позже дедлайна 𝑑𝑖 . После того,
как вы начали делать задание, его обязательно довести до конца.
a) (1) Можно ли выполнить все задания в срок?
b) (1) Сколько максимум заданий можно выполнить в срок (можно за 𝒪(𝑛2 ))?
2. (2) Хаффман: у частых символов короткие коды
Доказать, что если есть символ частоты > 52 , то есть символ с длиной кода один.
3. (2) Хаффман и длины кодов
Если длина текста 𝑛, какова максимальная длина кода одного символа?
4. (2) Сбалансированное разделение
Под «поддеревом» в данной задаче мы понимаем связный подграф дерева. Дано дерево,
разбить все его рёбра на два поддерева, пересекающиеся по одной вершине. Размеры поддеревьев должны отличаться не более чем в 2 раза.
5. (3) Авторитеты
Есть 𝑛 человек. Человек 𝑖 готов примкнуть к нашей коалиции, если наш авторитет хотя бы
𝑎𝑖 , при этом он изменит (+=) наш авторитет на 𝑏𝑖 . Наш изначальный авторитет равен 𝐴.
a) (2) Можем ли завербовать всех людей?
b) (1) Какое максимальное число людей мы можем завербовать? 𝒪(𝑛2 ).
6. (2) Составь свою ППСП!
Даны 𝑛 строк, состоящих из круглых скобок. Строка 𝑠 называется ППСП (почти правильная
скобочная последовательность), если в конец 𝑠 можно дописать несколько закрывающих
скобок, чтобы 𝑠 стала правильной. Данные строки можно склеивать в произвольном порядке.
Суммарную длину строк обозначим 𝐿.
a) (1) Можно ли построить ППСП, используя все строки? 𝒪(𝐿 + 𝑛 log 𝑛)
b) (1) Выберите строки max суммарной длины, чтобы получилась ППСП. 𝒪(𝐿+𝑛2 ).
c) (+1) Выберите максимальное число строк, чтобы получилась ППСП. 𝒪(𝐿 + 𝑛 log 𝑛).
d) (+2) Выберите строки максимальной суммарной длины. 𝒪(𝐿 log 𝑛).
3.2. Дополнительная часть
1. (3) Жадность между зависимыми задачами
Дано корневое дерево зависимостей между задачами. Время выполнение 𝑖-й задачи = 𝑡𝑖 .
Ориентация дерева: изначально можно выполнить только корень.
Штраф за задачу = 𝑇𝑖 ·𝑓 𝑒𝑒𝑖 , где 𝑓 𝑒𝑒𝑖 > 0 даны, 𝑇𝑖 – момент начало выполнения.
Нужно выполнить задачи, минимизируя суммарный штраф. 𝒪(𝑛 log 𝑛).
2. (3) Школьники, глубокая яма и 𝒪(𝑛 log 𝑛)
Какое максимальное число школьников сможет выбраться из ямы? Решите за 𝒪(𝑛 log 𝑛).
5/8
Алгоритмы, весна 2019/20
Практика #8. Жадные алгоритмы.
Разбор домашнего задания
4.1. Обязательная часть
1. Задания и дедлайны
∑︀
a) Если можем выполнить в порядке 𝑖1 , . . . , 𝑖𝑛 , то 𝑘 𝑡𝑖𝑗 6 𝑑𝑖𝑘 +𝑡𝑖𝑘 . Сортируем по возрастанию
𝑑𝑖 + 𝑡𝑖 .
Действительно, если 𝑑𝑖𝑘 + 𝑡𝑖𝑘 > 𝑑𝑖𝑘+1 + 𝑡𝑖𝑘+1 , то их можно поменять местами.
𝑖∑︀
только раньше, успеем.
𝑘+1 начнем выполнять∑︀
𝑘+1
𝑡𝑖𝑗 + 𝑡𝑖𝑘+1 + 𝑡𝑖𝑘 = 𝑘+1 𝑡𝑖𝑗 6 𝑑𝑖𝑘+1 + 𝑡𝑖𝑘+1 < 𝑑𝑖𝑘 + 𝑡𝑖𝑘 , то есть 𝑖𝑘 тоже успеем.
b) Тех, кого успеем, успеем в порядке возрастания 𝑑𝑖 + 𝑡𝑖 .
Отсортируем в таком порядке. Будем набирать задания слева направо. Динамика 𝑓𝑛,𝑘 –
минимальное время выполнения, если из первых 𝑛 заданий взяли 𝑘.
𝑓𝑛,𝑘 = min(𝑓𝑛−1,𝑘 , 𝑓𝑛−1,𝑘−1 + 𝑡𝑛 ).
Второй переход возможен только при 𝑑𝑛 > 𝑓𝑛−1,𝑘−1 .
2. Хаффман: у частых символов короткие коды
Обозначим 𝑓 (𝑡) частоту вершины 𝑡. Пусть все длины > 1. Есть вершина 𝑣1 на глубине 2 с
𝑓 (𝑣1 ) > 52 . Ее брат 𝑣2 , отец 𝑢1 . Брат отца 𝑢2 , его дети 𝑣3 , 𝑣4 .
Раз 𝑣1 объединилась с 𝑣2 , а не 𝑢2 или ее потомками, то 𝑓 (𝑢2 ) > 𝑓 (𝑣1 ) > 52 .
𝑓 (𝑣1 ) + 𝑓 (𝑣2 ) + 𝑓 (𝑢2 ) = 1 ⇒ 𝑓 (𝑣2 ) < 15 .
Раз 𝑣3 и 𝑣4 не объединялись с 𝑣2 , то 𝑓 (𝑣3 ) 6 𝑓 (𝑣2 ), 𝑓 (𝑣4 ) 6 𝑓 (𝑣2 ) ⇒ 𝑓 (𝑢2 ) = 𝑓 (𝑣3 ) + 𝑓 (𝑣4 ) < 52 ,
противоречие.
3. Хаффман и длины кодов
Частота любого внука корня 6 12 . Иначе его брат и дядя имеют частоту <
объединиться раньше.
Аналогично у любой вершины относительная частота любого внука 6 21 .
Итого глубина 6 2 log2 𝑛.
1
2
и должны
4. Сбалансированное разделение
С практики умеем искать вершину 𝑣, все поддеревья которой 6 𝑛2 6 2𝑛
(по числу вершин
3
без 𝑣 = числу ребер).
]. Тогда и 𝑟 = 𝑛 − 𝑙 ∈
Разобьем эти поддеревья на две кучки размеров 𝑙 и 𝑟, чтобы 𝑙 ∈ [ 𝑛3 , 2𝑛
3
[ 𝑛3 , 2𝑛
],
и
разница
не
более,
чем
в
два
раза.
3
Пусть существует поддерево размера > 𝑛3 , тогда оно сойдет за левую кучку.
Иначе все < 𝑛3 . Будем набирать поддеревья в левую кучку, пока она не станет > 𝑛3 . На
предпоследнем шаге она была < 𝑛3 , мы добавили поддерево < 𝑛3 , получилась кучка < 2𝑛
.
3
5. Авторитеты
a) Сначала рассмотрим тех, у кого 𝑏𝑖 > 0. Их жадно набираем в порядке возрастания 𝑎𝑖 .
Если не можем взять кого-то, то не могли и раньше, и всех с большим 𝑎𝑖 не можем и
никогда не могли.
Теперь остались отрицательные∑︀
𝑏𝑖 , сейчас у нас накоплен
∑︀ авторитет 𝐴.
Для последнего верно 𝑎𝑖 6 𝐴 +
𝑏 𝑗 ⇔ 𝑎𝑖 + 𝑏 𝑖 6 𝐴 + 𝑏 𝑗 .
𝑗̸=𝑖
Набираем в порядке убывания 𝑎𝑖 + 𝑏𝑖 .
6/8
Алгоритмы, весна 2019/20
Практика #8. Жадные алгоритмы.
Действительно, если 𝑎𝑖 + 𝑏𝑖 < 𝑎𝑖+1 + 𝑏𝑖+1 , то можно обменять местами.
Второго при обмене будем пытаться взять с еще большим авторитетом.
∑︀
Первого можно поставить на место второго, ибо 𝑎𝑖 + 𝑏𝑖 < 𝑎𝑖+1 + 𝑏𝑖+1 6 𝐴 +
𝑏𝑗 .
𝑗6𝑖+1
b) Тех, у кого 𝑏𝑖 > 0, набираем жадно в порядке возрастания 𝑎𝑖 . Остальных проходим в
порядке убывания 𝑎𝑖 + 𝑏𝑖 динамикой 𝑓𝑛,𝑘 – максимальный авторитет.
6. Составь свою ППСП!
ab) У 𝑖-й скобочной последовательности есть минимальный баланс на префиксах 𝑎𝑖 (𝑎𝑖 6 0),
баланс всей строки 𝑏𝑖 .
Получили в явном виде задачу про авторитеты, где начальный авторитет 𝐴 = 0, требуемый авторитет −𝑎𝑖 , изменение авторитета 𝑏𝑖 .
a) (+1) Выберите максимально число строк, чтобы получилась ППСП. 𝒪(𝑛 log 𝑛).
b) (+2) Выберите строки максимальной суммарной длины. 𝒪(𝑛 log 𝑛).
7/8
Алгоритмы, весна 2019/20
Практика #8. Жадные алгоритмы.
4.2. Дополнительная часть
1. ?
8/8
Скачать