Хеш-таблица (словарь) в Python: принцип работы, сложность O(1), решение задач. Научитесь использовать словари эффективно уже сейчас!
Хеш-таблица — это структура данных, которая хранит пары «ключ-значение» и обеспечивает доступ к элементам в среднем за O(1). В Python она реализована в виде словаря (dict) — одного из самых мощных инструментов языка. Если вы решаете задачи на LeetCode или пишете реальные проекты, без словарей не обойтись. В этой статье разберём, как работает хеш-таблица, какие операции с ней выполнять и как применять её в алгоритмах.
Основная идея — использовать хеш-функцию для преобразования ключа в индекс массива (бакета). Например, при выполнении mp["apple"] = 50 происходит следующее:
"apple" передаётся в хеш-функцию.В Python словарь автоматически управляет хешированием и коллизиями, поэтому вам не нужно реализовывать это вручную.
Словарь создаётся фигурными скобками или через функцию dict():
# Пустой словарь
mp = {}
# Словарь с начальными значениями
marks = {"Иван": 90, "Мария": 85, "Пётр": 75}
# Альтернативный способ
marks2 = dict(Иван=90, Мария=85, Пётр=75)Присваивание по ключу добавляет новую пару или обновляет существующую:
mp = {}
mp["apple"] = 10 # добавление
mp["apple"] = 20 # обновление
print(mp) # {'apple': 20}Используйте квадратные скобки или метод get():
print(mp["apple"]) # 20
# Безопасный доступ: если ключа нет, вернёт None или значение по умолчанию
print(mp.get("banana")) # None
print(mp.get("banana", 0)) # 0Важно: если использовать mp["banana"], а ключа нет, возникнет ошибка KeyError.
Оператор in — самый простой способ:
if "apple" in mp:
print("Ключ есть")
else:
print("Ключа нет")Метод del или pop():
del mp["apple"] # удалить ключ
value = mp.pop("banana", None) # удалить и вернуть значение (если нет, None)print(len(mp)) # количество пар
print(bool(mp)) # False, если словарь пустПеребирайте ключи, значения или пары:
for key in mp:
print(key, mp[key])
for key, value in mp.items():
print(key, value)
for value in mp.values():
print(value)Хеш-функция преобразует ключ в целое число. В Python для строк и чисел хеш вычисляется встроенной функцией hash().
print(hash("apple")) # 123456789 (пример)
print(hash(42)) # 42Коллизия — когда два разных ключа получают одинаковый хеш. Python использует метод открытой адресации: при коллизии ищет следующий свободный слот. Это обеспечивает среднюю сложность O(1).
В отличие от списка, где поиск занимает O(n), словарь даёт мгновенный доступ. Но словарь потребляет больше памяти и не гарантирует порядок (до Python 3.7). С версии 3.7 порядок вставки сохраняется.
s = "banana"
freq = {}
for ch in s:
freq[ch] = freq.get(ch, 0) + 1
print(freq) # {'b': 1, 'a': 3, 'n': 2}def has_duplicates(arr):
seen = set()
for x in arr:
if x in seen:
return True
seen.add(x)
return Falsedef two_sum(nums, target):
seen = {}
for i, num in enumerate(nums):
complement = target - num
if complement in seen:
return [seen[complement], i]
seen[num] = i
return []def first_unique(s):
freq = {}
for ch in s:
freq[ch] = freq.get(ch, 0) + 1
for ch in s:
if freq[ch] == 1:
return ch
return Noneget() для безопасного доступа.collections.Counter.defaultdict из модуля collections.from collections import Counter, defaultdict
freq = Counter("banana")
print(freq) # Counter({'a': 3, 'b': 1, 'n': 2})
groups = defaultdict(list)
groups["a"].append(1)
groups["a"].append(2)
print(groups) # {'a': [1, 2]}Хеш-таблица — фундаментальная структура, которую нужно знать каждому разработчику. В Python словарь — это мощный и гибкий инструмент, который ускорит ваши алгоритмы и упростит код. Практикуйтесь на задачах с LeetCode, и вы быстро освоите все приёмы.
Что делать прямо сейчас: возьмите любую задачу на подсчёт частот или поиск дубликатов и решите её с помощью словаря. Затем попробуйте реализовать собственную хеш-таблицу на Python для закрепления понимания.
Хочешь закрепить знания на практике?
Решай задачи на Algolit — интерактивная платформа для обучения
Начать бесплатно →