HashMaps - неясно о хэш-функции и двойном хешировании

Меня попросили реализовать хэш-карту с использованием массива. Мне нужно вставить следующие ключи:

15, 7, 26, 39, 11, 9, 27, 5, 18, 2, 54, 22, 4

в массив размером 19 с использованием хэш-функции:

(3x + 7) % 19

Используя линейное зондирование, я ожидаю получить следующий массив (поправьте меня, если я ошибаюсь):

Index:    0    1    2    3    4    5    6    7    8    9    10   11   12   13   14   15   16   17   18
Key:      4         11   5    18                       7    26   39   27   2    15   9    22   54

где 26 имел столкновение с 7 по индексу 9, и поэтому был вставлен по индексу 10, а 39 затем столкнулся с 26 по индексу 10 и поэтому был вставлен по индексу 11.

Сейчас я пытаюсь вставить те же элементы в реализацию массива HashMap, используя двойное хеширование вместо линейного зондирования. 2-я хеш-функция мне дана:

11 - (x % 11)

У меня есть два вопроса:

Значит ли это, что мой массив будет размером 11 или все же 19?

Использовать ли изначально исходную хеш-функцию и, если заданный индекс свободен, вставить туда элемент, в противном случае, если есть коллизия, использовать 2-ю хэш-функцию и вставить туда элемент?

1 ответ

Решение

Согласно Википедии вторичная хеш-функция используется косвенно в функции зондирования:

h(0, x) = (3x + 7) % 19
h(j, x) =  ((3x + 7) + j(11 - (x % 11))) % 19

Где j - счетчик столкновений.

Другие вопросы по тегам