Ответ
Хеш-таблица (в Go — map
) — это структура данных, которая реализует интерфейс ассоциативного массива и позволяет хранить пары «ключ-значение».
Принцип работы:
- Хеш-функция: Ключ преобразуется в числовое значение (хеш).
- Бакеты (buckets): Хеш используется для определения индекса в базовом массиве (массиве бакетов), куда будет помещено значение.
- Коллизии: Если два разных ключа дают одинаковый хеш, возникает коллизия. В Go коллизии разрешаются методом цепочек — в одном бакете хранится небольшой массив ключей и значений.
Сложность операций (в среднем):
- Вставка: O(1)
- Поиск: O(1)
- Удаление: O(1)
В худшем случае (при большом количестве коллизий) сложность может деградировать до O(n).
Реализация и использование в Go:
В Go хеш-таблица представлена встроенным типом map
.
// Объявление и инициализация
m := make(map[string]int)
// Вставка / Обновление элемента
m["alpha"] = 1
// Получение элемента
value, exists := m["alpha"] // exists будет true
// Удаление элемента
delete(m, "alpha")
Ключевые особенности map
в Go:
- Неупорядоченность: Порядок итерации по элементам
map
не гарантирован и может меняться. - Не потокобезопасность: Для конкурентного доступа из нескольких горутин требуется внешняя синхронизация (например,
sync.RWMutex
) или использованиеsync.Map
. - Динамическое расширение: При заполнении
map
до определенного уровня (load factor) происходит её расширение и рехеширование всех элементов, что может вызывать кратковременные задержки. - Ссылочный тип:
map
является ссылочным типом. При передаче в функцию копияmap
по-прежнему указывает на ту же базовую структуру данных.