Предположим, в таблице рядом записаны
k ключей. Тогда при попытке поиска или записи нужно проделать
O(k) операций. Чем больше кластер, тем менее эффективным будет использование хеш-таблицы.
Гоша: Можно ли как-то с этим бороться?
Тимофей: Да. Но проблема в том, что на каждом шаге при попытке записи мы пойдём в следующую ячейку.
То есть
h(k,i)=h(k)+i — плохая стратегия.
Гоша: А какая хорошая, идти в предыдущую ячейку?
Тимофей: Нет. Вообще последовательность ячеек, куда мы хотим вставить элемент, — это перестановка чисел от 0 до
m−1, где
m — размер таблицы.
Нужно подобрать такую последовательность чисел, которая перебирала бы все значения, но не по порядку. Сделав
m проб, нужно попробовать вставить элемент в каждую из
m ячеек.
Рассмотренный алгоритм можно улучшить.
h(k,i)=h(k)+c⋅i.
То есть будем ходить с некоторым шагом
c.
Гоша: А
c может быть любое?
Тимофей: Не любое,
c и
m должны быть взаимно простые. Иначе будем ходить по одним и тем же ячейкам.
Например, если
c=2 и
m — чётное число, то в ячейки с нечётными номерами мы никогда не попадём.
Рита: Можно, например, брать в качестве m степень двойки, а в качестве
c — простое число.
Варианты, в которых мы делаем единичный шаг и шаг
c, относятся к методам линейного пробирования.