Введение
Коализированный хэшинг, также называемый коализированным связыванием, — это стратегия разрешения коллизий в хэш-таблице, представляющая собой гибрид раздельного цеплением и открытой адресации.
Coalesced hashing, also called coalesced chaining, is a strategy of collision resolution in a hash table that forms a hybrid of separate chaining and open addressing.
Отдельная цепная хэш-таблица
В отдельной цепочной хэш-таблице элементы, которые попадают в один и тот же адрес при хэшировании, помещаются в список (или "цепочку") по этому адресу. Эта техника может приводить к значительным потерям памяти, поскольку сама таблица должна быть достаточно большой для поддержания коэффициента загрузки, обеспечивающего хорошую производительность (обычно в два раза превышающего ожидаемое количество элементов), и дополнительная память требуется для всех элементов в цепочке, кроме первого (если не используются заголовки списков, в этом случае дополнительная память требуется для всех элементов в цепочке).
В подвале .
Важная оптимизация для уменьшения эффекта коалесценции заключается в ограничении адресного пространства хеш-функции лишь подмножеством таблицы. Например, если таблица имеет размер M с ячейками, пронумерованными от 0 до M − 1, мы можем ограничить адресное пространство так, чтобы хеш-функция присваивала адреса только первым N ячейкам в таблице. Оставшиеся M − N ячеек, называемые резервом, используются исключительно для хранения элементов, возникающих при коллизиях во время вставки. Коалесценция не может произойти, пока резерв не будет заполнен. Оптимальный выбор N относительно M зависит от коэффициента заполнения (или полноты) таблицы. Тщательный анализ показывает, что значение N = 0,86 × M обеспечивает почти оптимальную производительность для большинства коэффициентов заполнения.
Варианты
Другие варианты вставки также возможны, позволяющие улучшить время поиска. Разработаны алгоритмы удаления, сохраняющие случайность, благодаря чему анализ среднего времени поиска остаётся справедливым и после выполнения операций удаления. Коалированное связывание позволяет избежать эффектов первичной и вторичной кластеризации и, как следствие, использовать эффективный алгоритм поиска, применяемый для раздельного связывания. Если цепочки короткие, эта стратегия оказывается очень эффективной и позволяет значительно экономить память. Как и в случае открытой адресации, удаление элементов из коалированной хеш-таблицы является сложной и потенциально дорогостоящей операцией, а изменение размера таблицы – чрезвычайно дорогостоящим и должно выполняться редко или вообще не выполняться.