Как вычисляется длина хеш-таблицы?

400
29 января 2017, 13:23

Уважаемые коллеги, столкнулся с таким вопросом касаемо хэш-таблицы, подскажите пожалуйста:

Понятно что каждая ячейка массива может быть либо связанным списком, либо деревом. А как определяется длинна самого массива? Есть ли какой-то обобщенный принцип что-бы мы могли сказать что-то вроде: "контекст в котором данная таблица будет использована, такой-то такой-то, и поэтому мы считаем длину ее массива по такой-то формуле."

Или какие-нибудь, твердо обосновывающие решение о длине критерии, которыми необходимо руководствоваться, при создании своей таблицы?

Answer 1

А как определяется длинна самого массива?

По-умолчанию, создается массив на 16 элементов (корзин).

У HashMap есть такие атрибуты, как:

  • capacity – вместимость/емкость (текущий размер массива, полем класса не является);
  • size – количество элементов, находящихся в HashMap;
  • loadFactor – коэффициент загрузки;
  • threshold – пороговое значение количества элементов HashMap'а.

При этом threshold рассчитывается как capacity * load factor.

После добавления пары в HashMap происходит проверка:

if (size++ >= threshold)

и, если количество элементов HashMap'а равно или превышает пороговое значение, то создается новый массив, размер которого в два раза больше размера старого массива:

resize(2 * table.length);

при этом все элементы старого массива распределяются в новый массив и изменяется значение capacity и пересчитывается threshold.

Пример:

Создали HashMap с параметрами по-умолчанию:

  • capacity = 16
  • size = 0
  • loadFactor = 0.75
  • threshold = (int)(16 * 0.75f) = 12

Добавили 11 различных пар:

  • capacity = 16
  • size = 11
  • loadFactor = 0.75
  • threshold = 12

После добавления 12-й пары получаем:

  • capacity = 32
  • size = 12
  • loadFactor = 0.75
  • threshold = (int)(32 * 0.75f) = 24

Все вышенаписанное справедливо для JDK 7 и ниже, а вот в JDK 8 расширение таблицы происходит несколько иначе.

Answer 2

Если мы создаем Map hashMap = new Hashmap()

То по умолчанию размер busket-a 16 и коэффициент нагрузки 0,75(load factor). Когда число записей в хэш-таблице превышает коэффициента нагрузки, то она в два раза увеличивает размет busket-a.

Так же можно задать размер busket-a

HashMap(int initialCapacity)
HashMap(int initialCapacity, float loadFactor)

https://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html

READ ALSO
Как преобразовать binary(111010000001110000000000) в integer?

Как преобразовать binary(111010000001110000000000) в integer?

Как преобразовать binary(записано в string 111010000001110000000000) в integer?

307
Кнопка не растягивается на 2 строки

Кнопка не растягивается на 2 строки

Не могу понять по какой причине кнопка с ID totalButton, не расширяется на 2 строки, хотя rowSpan="2" указан

346
Проблема с подключением второй БД

Проблема с подключением второй БД

У меня была одна БД, потом пришлось создать еще одну для других целейПосле создания поменял DATEBASE_VERSION, но все ровно ошибка:

388
Вложенный оператор switch

Вложенный оператор switch

Объясните пожалуйста в чём ошибка

434