1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7

# конспект · шаг 7 из 7

Конспект: как читать задачу и как её переформулировать

выжимка - её можно унести в заметки

Понятия

Вид ответа - есть ли / сколько / все / лучший. Одна фраза при разных видах - разные задачи; у «всех» размер ответа - нижняя граница времени.

Бюджет - время на ответ, умноженное на скорость простых операций машины.

Перебор по определению - программа, которая перебирает всех кандидатов и проверяет каждого буквально по условию. Медленная, но без идей - значит, без ошибок в идеях. Это исполняемая спецификация.

Край - вход на границе допустимого: пусто, один элемент, все равны, касание, повторы, наибольший размер.

Переформулировка - назвать объект, который ищется (перестановка, подмножество, дерево, граф, точки, многоугольник, строка), и ограничения на него.

Интервальный граф - вершины-отрезки на прямой, рёбра - пересечения. Жадная раскраска по началу точна: число цветов = наибольшее число одновременно идущих отрезков.

Что унести

ПЯТЬ ВОПРОСОВ К ПРОСЬБЕ
из чего вход: объекты, повторы, порядок, гарантии
вид ответа: есть ли / сколько / все / лучший
что значит «лучше»: критерий, равенство, нужен ли точный оптимум
размер: 10, 10³, 10⁶, больше
края: пусто, один, все равны, касание, равные времена
нет ответа на вопрос -> спросить; некого спросить -> выбрать явно
БЮДЖЕТ (CPython 3.12 на этой машине)
сложение в цикле 15 млн/с, запись в dict 6 млн/с, sorted 3 млн/с
рабочая цифра: Python 10⁷ в секунду, компилируемый 10⁸-10⁹
предел n при бюджете 10⁷ | 10⁹:
  n 10⁷ | 10⁹   n log n 5,3·10⁵ | 4·10⁷   n² 3162 | 31 622
  n³ 215 | 1000   2ⁿ·n 19 | 25   n! 10 | 12
не хватает в тысячи раз -> другой класс; в разы -> константа, замер
sorted против слияния на Python: 47 мс и 940 мс, оба n log n
РУКАМИ, ПЕРЕБОР, КРАЯ, ПОТОМ БЫСТРЫЙ
наибольшая сумма подотрезка [-2, -3, -1]: 0 с пустым, -1 без
Кадане max(0, ...) = «пустой можно»; без пустого - max(x, ...)
переговорки 8-10, 9-10, 10-11: [нач, кон) - 2, [нач, кон] - 3
касание = порядок событий с равным временем: конец раньше начала
СЛОВА -> ОБЪЕКТ
порядок, маршрут, расстановка   -> перестановка
группа, команда, пакет          -> подмножество
иерархия, подчинение            -> дерево
связи, зависимости, конфликты   -> граф
где, ближайший, внутри          -> точки, многоугольники
текст, шаблон, похожесть        -> строки
зависимости модулей -> топологическая сортировка, цикл виден сам
экзамены (любые конфликты) -> раскраска, NP-трудна
встречи (интервалы) -> жадно по началу, n log n, точно

Ловушки джокера

Оптимизировать не ту задачу. Неделя на быстрый подсчёт, а нужен был список - или наоборот.

Ответ не помещается. «Все пары похожих» на миллионе - до 5 · 10¹¹ пар; это видно одной строкой арифметики до кода.

Квадрат «на всякий случай». n = 2 · 10⁵ - это 2 · 10¹⁰ проверок, полчаса вместо двух секунд.

Пропущенное разрешение на перебор. n ≤ 20 в условии - не опечатка, а подсказка: 2ⁿ допустим.

Толкование края выбрано молча. Быстрый алгоритм всегда что-то решает про пустой вход и касание; без перебора не видно, что именно.

«Наша задача особенная». Почти всегда у неё есть название; иногда - структура, которая делает её лёгкой (интервалы вместо произвольного графа).

Комментарии

Пока нет комментариев. Будь первым!

Оставить комментарий

Комментарий появится после проверки. Email не публикуется. Войти, чтобы не вводить имя каждый раз.