Таблица с вычисляемым входом (хеш-таблица) – это таблица, элементы которой располагаются в соответствии с некоторой функцией расстановки (хеш-функцией)
Функция расстановки f (ключ) вычисляет для каждого элемента таблицы по его ключу номер (позицию) элемента в массиве.
0…N–1
или 1…N
Организация прямого доступа в рассмотренном виде приводит к неэффективному использованию памяти - требуется больше памяти (М >> 1) - количество используемых ключей, как правило, существенно меньше теоретически возможного набора
Размер памяти для представления таблицы значительно меньше возможного количества имен (M << N), и, как результат, получаемые по ключам числовые значения необходимо преобразовывать к диапазону номеров (адресов) строк памяти
Функция (хеширования, перемешивания, рассеивания) расстановки (hash - мешанина, путаница) - функция преобразования значения ключа к номеру (адресу) строки памяти для хранения записи H : K -> L (L = (0, ..., M - 1))
Таблицы с вычислимыми адресами (хеш-таблицы, перемешиваемые таблицы) - таблицы, представление которых организуется при использовании функции расстановки
Метод цепочек
Замечания к открытому перемешиванию как способу размешения коллизий:
Широко используемый подход для разрешения коллизий - метод цепочек, когда все записи, для которых функция хеширования определяет одно и тоже значение,представляются в виде линейного списка.
Открытое перемешивание еще называют закрытым хэшированием, метод цепочек - открытое хэширование.
Каждая ячейка массива является указателем на связный список (цепочку) пар ключ-значение, соответствующих одному и тому же хеш-значению ключа. Коллизии просто приводят к тому, что появляются цепочки длиной более одного элемента. Операции поиска или удаления элемента требуют просмотра всех элементов соответствующей ему цепочки, чтобы найти в ней элемент с заданным ключом. Для добавления элемента нужно добавить элемент в конец или начало соответствующего списка, и, в случае, если коэффициент заполнения станет слишком велик, увеличить размер массива и перестроить таблицу.
Плекс может рассматриваться как структура представления для выражений самого общего вида (линия – операция, точки - операнды).
Пример: Арифметическое выражение (a * b + c) * (d - e / f)
: