2016-09-22 3 views
2

При определении конструктора для HashSetПочему коэффициент заполнения по умолчанию для HashSet Constructor 0.75?

HashSet<Integer> hs = new HashSet<Integer>(10,(double)0.50);

Второй аргумент называется «Fill Ratio» имеет значение по умолчанию 0,75.

Я хотел знать, есть ли логическая причина, по которой он не выполняет свои обязательства до 0,75.

+0

Читайте документ 'hashset'. – passion

+1

Hashtables страдают от _hash collisions_ и более высокого коэффициента нагрузки (более общий термин, чем «коэффициент заполнения») означает больше столкновений. Это уменьшает производительность ввода и поиска. Любой выбранный вами фактор даст вам некоторый компромисс между пространством и временем, а 0.75 - эмпирически выбранное значение. Это хорошо для дизайна «отдельной цепочки» хэш-таблицы; дизайн _open-address_ гораздо более чувствителен к коллизиям и требует более низкого коэффициента нагрузки (0,70 - максимальное полезное значение). –

ответ

1

HashSet подкреплен HashMap, так что вы можете обратиться к HashMap's javadoc за обоснование выбора 0.75 в качестве значения по умолчанию:

Как правило, коэффициент нагрузки по умолчанию (.75) предложения хороший компромисс между затратами времени и пространства. Более высокие значения уменьшают объем служебных данных, но увеличивают стоимость поиска (отражается в большинстве операций класса HashMap, включая get и put).

2

Существует действительно логическое обоснование выбора. Если мы понимаем HashSet подкреплен HashMap и признать конструктор в вашем посте вызывает HashMap конструктора:

public HashSet(int initialCapacity, float loadFactor) { 
    map = new HashMap<>(initialCapacity, loadFactor); 
} 

, а затем перейти к соответствующим HashMapdocumentation мы можем увидеть логическое рассуждение позади важных выбора.

Как правило, коэффициент загрузки по умолчанию (.75) дает хорошее соотношение между затратами времени и пространства. Более высокие значения уменьшают накладные расходы , но увеличивают стоимость поиска (отраженные в большинстве операций класса HashMap, включая получение и пометку). Ожидаемое количество записей на карте и коэффициент ее загрузки должны быть учтены в учетной записи при настройке начальной емкости, чтобы свести к минимуму число операций повторной обработки. Если начальная емкость больше , максимальное количество записей, деленное на коэффициент нагрузки, не будет переработано .