Веду на сто
Конспект

Программирование: строки, числа и стандартные алгоритмы

Схемы обработки строк, делителей, сортировки и больших наборов данных.

На экзамене

Задания 24, 25 и 26. Нужно выбрать алгоритм для строки, целых чисел или большого набора записей и соблюсти ограничения входа.

Формулы и факты

ФормулировкаСхемаЧто хранить
Максимальная допустимая серияОдин проход со сбросомТекущую и максимальную длину
Не более k нарушенийСкользящее окноЛевую границу и число нарушений
Вхождения образцаОкно или список позицийПозиции и границы фрагмента
Частоты значенийСловарьКоличество для каждого значения
Упорядочивание записейСортировкаГлавный и дополнительные ключи
  • Окон длины m в последовательности длины n: n - m + 1.
  • Последний начальный индекс подстроки длины m: n - m при нумерации с 0.
  • Делители числа n достаточно искать парами до \lfloor\sqrt{n}\rfloor.
  • Для полного квадрата парные делители совпадают и добавляются один раз.
АлгоритмТипичная сложность
Один проходO(n)
Делители одного числаO(sqrt(n))
СортировкаO(n log n)

Алгоритм

  1. Определи кандидата: символ, подстрока, число, пара или набор записей.
  2. Запиши точное условие допустимости и требуемый результат.
  3. Выбери схему по таблице; для чисел сначала применяй дешевые проверки.
  4. Выведи границы цикла из размера кандидата, не подбирай их на глаз.
  5. Для сортировки задай правило равенства ключей; жадный выбор используй только с обоснованием.
  6. Проверь начало, конец, пустой результат, полный квадрат и равные ключи.
  7. Сверь оптимизированное решение с полным перебором на маленьком наборе.

Ловушки

  • Путают: завершенную серию и серию в конце строки. Сверь: обновляй максимум в проходе или после цикла.
  • Путают: пересекающиеся и непересекающиеся вхождения. Сверь: не пропускай пересечения без требования условия.
  • Путают: два парных делителя полного квадрата. Сверь: добавь корень один раз.
  • Путают: главный ключ и полный порядок сортировки. Сверь: задай дополнительные ключи.
  • Путают: локально удобный и доказанно жадный выбор. Сверь: найди контрпример полным перебором.