Алгоритмы с нуля
Greedy: тест с выбором
Шесть вопросов через весь юнит. Каждый — это решение, которое вы принимаете, когда всерьёз тянетесь за greedy: не определение для пересказа, а суждение о том, доказуемо ли локальный выбор является глобальным, и что делать, когда это не так.
Убедитесь, что вы связываете воедино greedy choice property, exchange argument, выбор ключа сортировки для interval-задач и сигнатуру отказа небезопасного greedy — синтез, к которому вели все четыре урока.
Коллега говорит: greedy прошёл все 40 моих случайных тестов, значит он корректен для этой задачи. Почему это рассуждение несостоятельно и что на самом деле решило бы вопрос?
Нужно выбрать максимум непересекающихся встреч в одной комнате. Коллега сортирует по кратчайшей длительности (короткие встречи плотнее упаковываются). На [0,4], [3,5], [4,8] что получится и почему ключ неверен?
В exchange argument для activity selection вы убираете первую работу X из оптимума O и вставляете greedy-работу G с самым ранним финишем. Какой единственный факт сохраняет расписание допустимым?
Для размена монетами {1, 3, 4} и суммы 6 greedy выдаёт 4+1+1 = 3 монеты, а DP — 3+3 = 2. Что это рассогласование говорит про exchange argument и какой корректный запасной вариант?
По всему юниту: в чём точное различие между greedy и динамическим программированием на одной и той же задаче оптимизации?
В Gas Station коллега возвращает -1 в первый же момент, когда бак уходит в минус на станции i. Почему это неверно и какая логика корректна?
Сквозная линия юнита — одна дисциплина: greedy всегда выполняется и всегда что-то возвращает, поэтому единственный важный вопрос — доказуемо ли его локальный выбор глобален. Exchange argument (или stays-ahead) — то, чем вы доказываете безопасность; отсутствующий swap — как у монет 4 для 6 — сам по себе доказательство провала, а запасной вариант — DP. Для interval-задач сложное — это ключ сортировки: earliest finish для максимизации, start для merging, sweep по стартам и финишам для комнат. А для scan-greedy вроде Gas Station никогда не решайте по локальному провалу — решайте по глобальному инварианту.