Жадность (5 марта 2021)
- [5 минут] Введение
- MST Краскал − мы знаем, какое ребро взять первым! это жадность
- НОП − мы её решаем динамикой, можно решать перебором, жадное решение могло бы выглядеть так : из match(a[0]) и match(b[0]) взять ближайшее
- То, с чем вы сталкиваетесь каждый день: какую задачу делать первой, чтобы успеть ко всем дедлайнам? Ту, у которой дедлайн раньше!
- [5 минут] Непрерывный рюкзак
- Решение 1 = мы знаем, какой элемент взять точно выгодно (элемент с максимальным частным)
- Решение 2 = сортировка по частному (по индукции каждый раз берём макс частное ⇒ берём в порядке сортировки)
- Задачи, решаемые сортировкой
- Выполнить побольше заданий (сортировка по ti) к моменту T.
- Выполнить задания максимальной суммарной стоимости к моменту T − это уже рюкзак, не решается.
- Успеть все задания с дедлайнами (сортируем по дедлайну di). Док-во выбором первого (остальных всё ещё можно выполнить) или последнего (задача стала проще).
- [skipped] Ушло в практику: Сортировка по ti+di (успеть все! дедлайн на время начала).
- [skipped] Ушло в практику: спортсмены si, mi выстраиваются в башню
- Сортировка по feei/ti (штраф = Ti*feei, Ti − время окончания)
- Задача про ленту и файлы, сортировка по sizei/counti (время обращения к файлу − его позиция) (переформулировка предыдущей задачи)
- Компаратор
- Максимизация скалярного произведения. Транснеравенство.
- Идея компаратора: solve(n=2) ⇒ sort-order (если решение − сортировка, то &exists; компаратор, его не обязательно описывать формулой)
- Применяем к feei/ti
- 2 станка
- Применяем тему компаратору к задаче о двух станках. Получаем не верный компаратор. min(ai, bj) < min(aj, bi).
- Почему не работает? Практика: пострессим. Теория он не транзитивный для случая, когда бывают ai=bi.
- Кстати, что будет с sort, если ему передать не антирефлексивный или нетранзитивный компаратор? (не отсортирует)
- Верный компаратор. min(2ai, 2bj+1) < min(2aj, 2bi+1) cf
- Верное решение с составным компаратором.
− Перерыв −
- Общие слова про архиваторы
- Не существует идеального архиватора (что-то обязательно не сожмётся).
- Как можно сжимать данные? Представьте себе bmp-файл, внутри красный квадратик. LRE-сжатие рулит.
- Как можно сжимать данные? Представьте себе литературный текст. Слов мало, можно каждому сопоставить его номер в словаре.
- Как можно сжимать данные? У разных символов разные частоты. Можно разным символам давать разные коды. Можно даже вещественных длин (арифметическое кодирование).
- Хаффман (повторение с дискретки?)
- Принцип сжатия: символам сопоставляем разные коды целой длины. Минимизируем Σ counti leni
- Чтобы можно было однозначно декодировать сделаем коды беспрефиксными (примеры: a=0, b=0; a=0, b=00; a=0, b=1, c=01)
- Кодирование (encode) за O(length). Раскодирование (decode) за O(length) построением дерева кодов (бора строк).
- Алгоритм построение кодов: пока есть хотя бы два символа, сожмём их в 1 мета символ, сведёмся к такой же задаче
- Реализация кучей за O(ΣlogΣ).
- [skipped] Ушла на практику: реализация очередью за O(sort + Σ)
- На выходе получили дерево кодов, обошли его, получили сами коды.
- Что хранить в файле? Логичнее всего массив частот, по которому мы при декодировании тем же самым алгоритмам построим те же самые коды.
- Корректность хаффмана: рассмотрим дерево, в нём нет deg=1, и leni↑ counti↓, минимальные count1 и count2 − обязательно братья.
- Хранение дерева: можно хранить собственно, можно массив count, можно сжать хаффманом
- [10 минут] Гамильтонов путь
- Конь и правило Варнсдорфа. Вариации: рандом или прижиматься к границе; начинать с рандома или с угла/стороны/центра.
- Применение к произвольному графу. Вероятностный алгоритм (среди минимальных случайную), поэтому запустить нужно несколько раз. Можно не 1 ребро брать, а k минимальных.
- [15 минут] Коммивояжёр. Приближённые алгоритмы.
- Общие слова, что такое приближённые алгоритмы.
- Формулировка: есть неравенство треугольника, граф полный
- Жадное 2-приближение через MST
- Жадное 1.5-приближение через MST (Кристофидес: дополняем до эйлерова, добавляя рёбра)
- Локальные оптимизации: перестановка, reverse для пересекающегося
- (bonus) Как быстро искать MST? (а) Вороной. (б) Искать k ближайших точек (или сеточкой, или проекцией на случайную прямую).