Я понимаю, что если в хеш-таблице происходит столкновение, у вас есть несколько вариантов сохранения данных. Вы можете использовать некоторое простое число для линейного обхода массива, пока не найдете свободное место. Вы также можете перефразировать всю таблицу в больший массив. Я уверен, что есть и другие способы. Чего я не понимаю, так это того, что если произойдет столкновение, то как вы узнаете, какая строка данных является той, которую вы искали? Могу ли я просто не разрешить использование дубликатов ключей?
Путаница с поиском информации в хеш-таблице при возникновении коллизии
Ответы (1)
Между хешем и ключом есть большая разница (хотя иногда они могут совпадать).
Ключ может быть очень большим числом, сложным объектом, состоящим из множества полей или чем-то еще.
Вы применяете свою хэш-функцию к этому ключу, чтобы получить хэш.
Таким образом, даже если вы запретите дублирование ключей, у вас все равно могут быть дубликаты хэшей.
Вы часто не можете использовать свой ключ как хеш напрямую, потому что индексы массива представляют собой последовательные целые числа, начинающиеся с 0, поэтому он не будет работать, если ваш ключ слишком большой, отрицательный или не является целым числом, и вам придется применить какой-то вид хеш-функции.
Если вы хотите хранить числа от 1 до 10000, вы бы позволили ключу быть самим числом и могли бы сделать хэш остатком от числа, деленного на 1000 (и, таким образом, у вас будет массив размером 1000 для хэш-таблицы) .
Вставка 1001 поместит его в индекс 1. Если вы попытаетесь вставить 2001, он также попытается перейти в индекс 1, и у вас будет коллизия.
* Ключ может быть либо всем значением, которое вы хотите сохранить, либо только его идентификатором.