← Вернуться к карте тем
Alterna · глава 41 · страница 41.2

Алгоритмические инструменты

Быстрая программа начинается не с модуля, а с операции: что нужно часто добавлять, считать, выбирать или искать?

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

структуры данных10-11 классЕГЭ: идеи алгоритмов
01

collections: данные по смыслу

Counter(iterable)

Частотный словарь: считает появление значений.

Похоже на dict, но выражает намерение.
deque()

Очередь с быстрым appendleft и popleft.

Не удаляй начало обычного списка много раз.
defaultdict(list)

Создает значение по умолчанию для нового ключа.

Удобно при группировке, но обычный dict.get иногда проще.
namedtuple / dataclass

Дают именованные поля записи.

Для учебной пары часто достаточно обычного кортежа.
02

Поток, выбор и поиск

ИнструментЗадачаНе использовать вместо
itertools.combinationsПеребрать все пары или наборы малого размера.Линейного алгоритма на больших данных.
functools.lru_cacheЗапомнить результаты чистой рекурсивной функции.Объяснения рекурсии, если кеш скрывает важное состояние.
heapqМногократно брать минимум или хранить top-k.Полной сортировки, если нужен весь порядок один раз.
bisectНайти позицию в уже отсортированном списке.Поиска в неотсортированных данных.
Инвариант кучи

heapq гарантирует минимум в позиции 0. Остальной список не отсортирован полностью: не обращайся с кучей как с готовым отсортированным массивом.

03

Пример: три лучших результата

Если требуется только несколько максимальных значений, heapq.nlargest точно описывает задачу. Когда нужен полностью отсортированный результат, выбирай sorted.

import heapq
    
04

Быстрая проверка

Какой контейнер уместнее для многократного извлечения элементов с начала очереди?