Техника, на которую вы ссылаетесь, является одной из реализаций хеш-таблиц в целом.Это называется линейным зондированием, которое является формой общей техники, называемой открытой адресацией.Если вы вычислили индекс слова на основе hashCode() % array.length
и обнаружили конфликт (непустой элемент или не тот элемент, который вы ищете);тогда у вас есть три способа разрешения конфликта:
Линейный поиск
Это делается путем увеличения позиции и проверки, если она пуста или содержит искомый элемент.То есть ваша вторая позиция будет (hashCode(input) + 2) % array.length
, а затем (hashCode(input) + 3) % array.length
и так далее.Проблема этого подхода заключается в том, что ваша производительность вставки или поиска снизится до линейного O (n), если массив близок к полностью заполненному.
Квадратичный поиск
Это всего лишь оптимизация длявыше техника, прыгая в квадрате, если вы найдете столкновение.Итак, ваш второй индекс будет (hashCode(input) + 2*2) % array.length
, а затем (hashCode(input) + 3*3) % array.length
и т. Д., Что поможет быстрее добраться до нужного места.
Двойное хеширование
Это еще более эффективный подход для обработкиразрешите, введя другую функцию хеширования hashCode2()
, которую вы используете в сочетании с первой.В этом случае ваш следующий индекс поиска будет (hashCode(input) + 2*hashCode2(input)) % array.length
, а затем (hashCode(input) + 3*hashCode2(input)) % array.length
и т. Д.
Чем более случайно распределены ваши переходы, тем выше производительность по сравнению с большими хеш-таблицами
Надеюсь это поможет.