2016-12-11 3 views
0

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

Итак, что такое «количество желаний» для этой хеш-таблицы? Общее количество ключей или общее количество индексов, которые занимают эти ключи.

Потому что, если это общее количество ключей, какой смысл перефразировать? Это просто потеряло пространство и время.
И если это общее количество занятых только индексов, то коэффициент нагрузки будет 2/5 = 0,4?

enter image description here

+0

Число записей - это количество ключей, да, поскольку каждая клавиша имеет одно и только одно связанное значение, а запись - это пара ключей/значений. Точка f, перефразирующая такую ​​карту, заключается в том, чтобы избежать этого длинного связанного списка, который вредит производительности карты и лучше распределяет записи между ведрами. Идеальное распределение - это когда каждый ковш имеет только 0 или 1 запись. –

+0

Но когда такие столкновения происходят, перефразирование не поможет, не так ли? Только изменение hashFunction будет работать? – Nicky

+0

Нет. Давайте рассмотрим простой пример, где карта имеет 3 ковши, а простой код хеш-кода используется для выбора ведра.Допустим, у вас на карте есть 0, 3 и 6. Все они будут в ведре 0, потому что 0% 3 == 0, 3% 3 == 0 и 6% 3 == 0. Теперь давайте перефразируем и вместо этого используем 7 ковшей. Теперь 0% 7 == 0, поэтому первый ключ переходит в ведро 0. 3% 7 == 3, поэтому 3 заканчивается в ковше 3. 6% 7 == 6, поэтому ключ 6 переходит в ведро 6 И ключи теперь идеально распределены между ведрами. –

ответ

0

Количество записей является количество ключ-значение отображения в карте, возвращенное https://docs.oracle.com/javase/8/docs/api/java/util/Map.html#size-- или в качестве альтернативы, количество элементов в Set возвращенного https://docs.oracle.com/javase/8/docs/api/java/util/Map.html#entrySet--

Это соответствует наша интуиция о том, что такое карта, набор пар ключ-значение, поэтому каждая пара является одной записью.

По количеству https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html количество записей сравнивается с продуктом коэффициента загрузки fac, произвольным параметром и мощностью cap, текущее количество ковшей.

Вы думаете о «когда коэффициент нагрузки достигает», но это неверно. Коэффициент загрузки не изменяется после строительства. По умолчанию это 0.75, достаточный для почти всех видов использования.

Подумайте вместо threshold продукт threshold = fac * cap;. Порог изменяется только тогда, когда изменяется cap, потому что fac нет.

Что изменилось все время nentries, количество записей на карте.

(я просто составление имен переменных, чтобы упростить этот ответ. Они не имеют ничего общего с фактическим исходным кодом Java API.)

Ваша диаграмма показывает пять ведер, так threshold = (int)(0.75 * 5) или 3.

Решение перефразировать - if (nentries >= threshold). У вас есть десять записей на вашем снимке, так что да, эта карта нуждается в перестройке. Фактически, он бы перефразировал на третьей записи, увеличив cap примерно до десяти записей в зависимости от реализации. На восьмой позиции емкость увеличится до двадцати, поэтому десять записей будут меньше, чем новый порог, threshold = 0.75 * 20, или 16.

+0

Это немного запутанно! Так как согласно другим статьям, коэффициент нагрузки = количество записей/количество слотов. В этом конкретном примере это было бы 2, не было бы? – Nicky

Смежные вопросы