Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Python: dictionary, complexity

В каких случаях доступ к словарю может деградировать до O(n)?

Вопрос проверяет знание средней и худшей сложности операций со словарём и причин деградации производительности.

Короткий ответ

Обычно доступ к словарю близок к O(1), потому что используется хеш-таблица. Но в худшем случае может получиться O(n), если возникает много коллизий и словарю приходится проверять много кандидатов при поиске. Такое бывает при “плохих” хешах, намеренно подобранных ключах или при патологии пользовательских __hash__/__eq__. Тогда поиск превращается почти в линейный проход.

Длинный ответ

Словарь рассчитывает hash(key) и идёт по цепочке/последовательности проверок, пока не найдёт нужный ключ или пустую позицию.

Определение: коллизия (collision) — ситуация, когда разные ключи дают одинаковый хеш или попадают в одну и ту же область размещения, из-за чего требуется дополнительная проверка ключей.

Когда появляется O(n)

Доступ может деградировать до O(n), когда растёт число проверок при поиске:

  1. Много коллизий по ключам

    • много разных ключей дают одинаковый hash(...) или постоянно конфликтуют по размещению;

    • словарь вынужден сравнивать ключи один за другим.

  2. Некорректная реализация __hash__ у пользовательских ключей

    • например, __hash__ возвращает одну и ту же константу для всех объектов.

  3. Дорогой или “плохой” __eq__ у ключей

    • даже если хеши разные, при коллизиях и проверках сравнения могут быть затратными;

    • если __eq__ тяжёлый, фактическое время поиска заметно растёт.

  4. Враждебные (adversarial) входные данные

    • когда ключи специально подобраны, чтобы вызывать коллизии и заставлять словарь делать много шагов.

Маленький пример “плохого” ключа

class BadKey:
    def __init__(self, x): self.x = x
    def __hash__(self): return 1          # все ключи в одну "кучу"
    def __eq__(self, other): return self.x == other.x

d = {BadKey(i): i for i in range(10_000)}
print(d[BadKey(9999)])  # работать будет, но может быть заметно медленнее

Важная оговорка про O(n)

Оценка O(n) — это про худший случай. В обычной практике словарь спроектирован так, чтобы давать близкое к O(1) поведение на типичных данных, но “сломать” это можно плохими ключами и коллизиями.

Вывод

Деградация до O(n) появляется, когда из-за коллизий и/или плохих __hash__/__eq__ словарю приходится проверять большое число кандидатов вместо нескольких шагов.

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    7

Навыки

  • Python

    Python

Ключевые слова

#dictionary

#complexity

Подпишись на Python Developer в телеграм

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.