Вопрос проверяет понимание временной сложности операций с хеш-таблицами (словарями) в Python и условий, при которых она деградирует.
Словарь (dict) в Python — это реализация хеш-таблицы. В идеальном случае, когда хеш-функция распределяет ключи равномерно, основные операции (get, set, delete) выполняются за константное время O(1). Однако есть ситуации, когда производительность резко падает.
__hash__ написан плохо и возвращает одинаковые значения для разных объектов.# Пользовательский класс с плохой хеш-функцией
class BadKey:
def __init__(self, value):
self.value = value
def __hash__(self):
return 1 # Все объекты имеют одинаковый хеш!
def __eq__(self, other):
return self.value == other.value
# Создание словаря с такими ключами
bad_dict = {}
for i in range(1000):
key = BadKey(i)
bad_dict[key] = i # Каждая вставка будет вызывать линейный поиск в цепочке коллизий.
# Операции с этим словарём будут иметь сложность O(n).В современных версиях Python (с 3.3+) используется рандомизация хешей для строк и некоторых типов, что затрудняет проведение hashDoS-атак. Также для разрешения коллизий используется открытая адресация (начиная с CPython 3.6), что в целом улучшает производительность.
Вывод: Сложность операций со словарём ухудшается при высоком уровне коллизий хешей, что может быть вызвано плохой хеш-функцией или злонамеренным вводом. Для предотвращения важно использовать в качестве ключей стандартные хешируемые типы (строки, числа, кортежи) и обновлять Python до актуальной версии с защитой от hashDoS.
Уровень
Рейтинг:
3
Сложность:
5
Навыки
JavaScript
Python
Ключевые слова
Подпишись на Python Developer в телеграм