В каком случае получение значения из словаря Python имеет сложность O(n)?

Ответ

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

Почему это происходит? Словари в Python реализованы как хэш-таблицы. Когда несколько ключей имеют одинаковый хэш-код или попадают в один и тот же "бакет" (ячейку) хэш-таблицы, возникает коллизия. В таких случаях элементы в бакете хранятся в виде списка, и поиск нужного значения требует линейного перебора этого списка.

Условия для O(n) (худший случай):

  • Множественные коллизии хэш-функций: Если большое количество ключей хэшируются в один и тот же бакет.
  • Злонамеренные входные данные: Специально подобранные ключи, разработанные для вызова максимального количества коллизий (например, атаки типа "hash collision attack").
  • Неудачная реализация __hash__: Для пользовательских объектов, если метод __hash__ реализован таким образом, что всегда возвращает одно и то же значение для разных объектов.

Важно: На практике, благодаря оптимизациям CPython (таким как изменение размера хэш-таблицы и рандомизация хэшей для строк и байтов, начиная с Python 3.3), вероятность возникновения худшего случая O(n) крайне мала для обычных сценариев использования. Средняя производительность остается O(1).