⛓️30. Хеш-таблицы. Коллизии. Способы разрешения коллизий. Метод цепочек.
Хэш-таблица - структура данных, в которой все элементы хранятся в виде пары "ключ-значение". По-другому, это ассоциативный массив. Самый частный пример хэш-таблицы - словарь.
data_1["BMSTU"] = "МГТУ"
DATA_2[3.14] = "Pi"
Хэширование - процесс преобразования ключа в некоторый индекс с помощью некоторой функции, которую также называют хэш-функцией.
h("a") -> 1
h("b") -> 2
h("c") -> 3
//пример реализации хэш-функции
long hash_function(char* str) {
long i = 0;
for (int j = 0; str[j]; j++)
i += str[j];
return i % CAPACITY;
}
//пример структуры хэш-таблицы
typedef struct Ht_item Ht_item;
struct Ht_item {
char* key;
char* value;
};
Преимущества хэш-таблиц:
Сложность алгоритма: О(n)
Быстрый поиск
Равномерное распределение в памяти
Недостатки хэш-таблиц:
Зачастую возникают проблемы в связи с ограниченностью размера типа данных "значений". Количество ключей и количество значений может не совпадать, из-за этого возникает коллизия хэш-функций.
Коллизия хэш-функции - получение одинакового индекса для разных ключей.
Существует 2 основных типа борьбы с коллизиями:
Метод цепочек
Открытая адресация ~ линейное зондирование(пробирование) ~ квадратичное зондирование(пробирование) ~ двойное хэширование
Метод цепочек
Проще понять этот метод на примере реализации при разрешении коллизий:
на ключ 002 претендуют два значения, которые организуются в линейный список.
Каждая ячейка массива является указателем на связный список (цепочку) пар ключ-значение, соответствующих одному и тому же хэш-значению ключа. Коллизии просто приводят к тому, что появляются цепочки длиной более одного элемента.
Простыми словами: в хэш-таблице вместо ключа хранится массив ключей.
Такой метод используется в большинстве современных языков программирования(Python, Java и т.д.).
Last updated