Согласно различным источникам, таким как Википедия и различные веб-сайты .edu, найденные Google, наиболее распространенными способами хеш-таблицы для разрешения коллизий являются линейное или квадратичное зондирование и связывание. Рандомизированное зондирование кратко упоминается, но не уделяется много внимания. Я реализовал хеш-таблицу, которая использует рандомизированное зондирование для разрешения коллизий. Предполагая, что есть столкновение, разрешение работает следующим образом:
- Полный (32-битный) хэш объекта используется для заполнения линейного конгруэнтного генератора случайных чисел.
- Генератор генерирует 32-битные числа, и модуль используется для определения того, где в хеш-таблице будет выполняться поиск.
Это имеет очень приятное свойство, которое, независимо от того, сколько хеш-коллизий существует в пространстве модулей, ожидается, что время поиска и вставки будет равно O (1), если в полном 32-битном хеш-пространстве мало коллизий. Поскольку последовательность зондов является псевдослучайной, в результате столкновений с модульным пространством поведение кластеризации не возникает в отличие от линейного зондирования. Поскольку вся система имеет открытый адрес и нигде не использует связанные списки, вам не нужно выделять память для каждой вставки, в отличие от цепочки.
Кроме того, поскольку размер хеша обычно равен размеру адресного пространства (32 бита на 32-разрядных машинах), просто невозможно разместить достаточно элементов в адресном пространстве, чтобы вызвать большое количество коллизий хеша в полном объеме. -битное хеш-пространство при хорошей схеме хеширования.
Почему же тогда рандомизированное исследование такой непопулярной стратегии разрешения столкновений?