Для двойного хеширования, если есть коллизия с первой хеш-функцией, вы должны использовать вторую хеш-функцию, но что, если коллизия все еще есть? Например, предположим, что хеш-таблица имеет размер 15, хэш-функция — (key + 3) % 15
, а вторая хэш-функция — ((key % 8) / 3) + 2
. Допустим, "insert 59" идет по индексу 2 по первой хеш-функции, но там уже есть ключ. Вторая хэш-функция довела бы его до 3, но, допустим, там уже есть значение. Где будет вставлено 59 в хэш-таблицу и почему? Спасибо
Я специально хочу использовать двойное хеширование, а не цепное хеширование или линейное зондирование.
2 ответа
Это не тот способ, которым мы вычисляем вторую хеш-функцию, поскольку для каждого зонда (недоступности слота) вам нужна новая хэш-функция, а это невозможно.
Общая вторая хэш-функция будет иметь тип
H1(x) - первая хеш-функция, H2(x) - вторая хеш-функция
Первый раз пробуем следующий слот - H1(x),
Следующим зондом будет - H1(x)+H2(x),
Следующий зонд H1(x)+2*H2(x) ........ H1(x)+n*H2(x)
Это зависит от реализации, но обычно вы используете связанный список или другую гибкую структуру данных для управления конфликтующими данными.
Из java.util.HashMap javadoc:
Он использует подход хеш-ведра; то есть коллизии хешей обрабатываются путем связывания нового узла с уже существующим узлом (или списком узлы). Таким образом, такие методы, как линейное зондирование (которое может вызвать первичную кластеризацию) и перефразирование (что не очень подходит хорошо с методом предварительного вычисления хеш-кодов Java) избегаются. В идеальных условиях (без коллизий) HashMap предлагает O (1) производительность большинства операций (
containsValue()
есть, конечно, O(n)). В худшем случае (все ключи сопоставляются с одним и тем же хеш-код -- очень маловероятно), большинство операций - O(n).
Похожие вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.