#hash
#хэш
Вопрос:
У меня есть массив с размером m = 11
, и моя хеш-функция — это метод деления : h(k) = k mod m
у меня есть целое число k = 10
и 10 mod 11 is -1
итак, куда мне поместить этот ключ в массив? Я должен поместить этот ключ в слот, индекс которого равен 10? пожалуйста, помогите мне, спасибо
ОТРЕДАКТИРОВАНО: для правильного получения моего ответа, например, у меня есть целые числа, такие как k = 10,22,31,4,15,28,17,88,59
массив был бы таким?Спасибо
10 9 8 7 6 5 4 3 2 1 0 index
10 31 59 17 28 4 15 88 22 keys
Комментарии:
1. en.wikipedia.org/wiki/Open_addressing
2. спасибо за ваш сайт, но я хочу привести несколько примеров, которые также не являются моим домашним заданием.в любом случае спасибо
Ответ №1:
Как это обычно делается, 10 mod 11 равно 10, так что да, обычно вы используете индекс 10.
Редактировать: Для обобщения: по крайней мере, как это обычно определяется, при двух положительных входных данных модуль всегда будет давать положительный результат. Таким образом, ваши вопросы о том, что делать с отрицательными результатами, на самом деле не имеют смысла в отношении обычного определения.
Если у вас действительно есть возможность получить отрицательный результат, моей немедленной реакцией было бы переключиться на какой-нибудь язык, который даст разумный результат. Если вы не можете этого сделать, то, вероятно, захотите переместить значение в правильный диапазон, добавив m
к отрицательному числу, пока не получите число в диапазоне [0..m), чтобы оно соответствовало обычному определению mod
, затем используйте это в качестве своего индекса.
Комментарии:
1. итак, например, если у меня k = 4, то 11 mode 4 = -6, поэтому я должен поместить ключ в слот с индексом = 5?
2. также я отредактировал свой пример, это правильно? Я также использую вашу версию в своем ответе 🙂
3. @matin1234: Мне это кажется не совсем правильным. 4 mod 11 должно быть 4, так что в конечном итоге будет иметь индекс 4. Тогда 15 mod 11 также равно 4, так что (при использовании линейного зондирования) это приведет к индексу 5.