Как работает хэш-таблица?

«Как работает хэш-таблица?» — вопрос из категории Алгоритмы и структуры данных, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Хэш-таблица (или хэш-мапа) — это структура данных, реализующая интерфейс ассоциативного массива (ключ → значение). Её работа основана на трёх основных компонентах:

  1. Хэш-функция: Преобразует ключ в целочисленный индекс (хэш-код). Идеальная функция равномерно распределяет ключи по доступному диапазону.

    # Пример простой хэш-функции для строк (упрощённо)
    def naive_hash(key, table_size):
        return sum(ord(c) for c in key) % table_size
  2. Массив бакетов (buckets): Полученный хэш-код используется как индекс в массиве, где хранится значение или ссылка на него.

  3. Механизм разрешения коллизий: Когда разные ключи дают одинаковый хэш (коллизия), используются стратегии:

    • Метод цепочек (Separate Chaining): Каждая ячейка массива содержит связный список (или другую структуру) пар ключ-значение.
    • Открытая адресация (Open Addressing): При коллизии алгоритм ищет следующую свободную ячейку в самом массиве (линейное/квадратичное пробирование, двойное хэширование).

Временная сложность (в среднем случае):

  • Вставка (Insert): O(1)
  • Поиск (Lookup): O(1)
  • Удаление (Delete): O(1)

Ключевые моменты для реализации:

  • Качество хэш-функции критически влияет на производительность.
  • При высокой заполненности (высокий load factor) производительность деградирует до O(n). Решение — рехэширование (rehashing): создание нового массива большего размера и пересчёт хэшей для всех элементов.
  • В языках вроде C# (Dictionary<TKey, TValue>) или Java (HashMap) эта логика инкапсулирована, но понимание принципов помогает предсказывать поведение и выбирать хорошие ключи (например, использовать иммутабельные типы).