Выбор подходящего размера таблицы для хэша

Если у меня есть набор ключей из 1000, какой размер подходит для моей хеш-таблицы и как это определяется?


person kylex    schedule 13.11.2008    source источник
comment
Подойдет простое число больше 1000X2.   -  person Suhail Mumtaz Awan    schedule 29.03.2018


Ответы (6)


Это зависит от коэффициента загрузки (точки «процента заполнения», когда таблица увеличит свой размер и перераспределит свои элементы). Если вы знаете, что у вас ровно 1000 записей, и это число никогда не изменится, вы можете просто установить коэффициент загрузки на 1,0 и начальный размер на 1000 для максимальной эффективности. Если вы не уверены в точном размере, вы можете оставить коэффициент загрузки по умолчанию 0,75 и установить начальный размер 1334 (ожидаемый размер/LF) для действительно хорошей производительности по цене дополнительной памяти.

Вы можете использовать следующий конструктор для установки коэффициента загрузки:

Hashtable(int initialCapacity, float loadFactor) 
person Bill the Lizard    schedule 13.11.2008
comment
Предполагая, что хэш-функция хорошо работает с набором ожидаемых ключей. Самодельная хеш-функция может плохо работать в таблице минимального размера. Для домашней функции вам придется провести эксперименты. - person S.Lott; 13.11.2008
comment
Если хэш-функция работает некорректно, конфликтующие элементы будут храниться в одном сегменте (в LinkedList). Минимальный размер таблицы никак не повлияет на производительность. - person Bill the Lizard; 13.11.2008

Вы также должны учитывать хэш-функцию.

одно эмпирическое правило предлагает сделать размер таблицы примерно вдвое, чтобы было место для расширения, и, надеюсь, сохранить небольшое количество столкновений.

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

Какие вещи вы хешируете? Более подробная информация должна давать лучший совет.

person EvilTeach    schedule 13.11.2008

Эти факторы обсуждаются в документации для Hashtable

person sblundy    schedule 13.11.2008
comment
Это больше комментарий, чем ответ. - person tomasyany; 19.07.2016

Пусть растут. При таком размере автомат работает нормально. В остальном 2 x размер + 1 — это простая формула. Простые числа тоже хороши, но как только ваш набор данных достигает определенного размера, реализация хеширования может решить перефразировать и увеличить таблицу.

Ваши ключи определяют эффективность и, надеюсь, достаточно различимы.

Итог: задавайте вопрос о размере, когда у вас есть проблемы, такие как размер или низкая производительность, кроме этого: не волнуйтесь!

person ReneS    schedule 13.11.2008
comment
Не беспокойтесь об этом, если производительность в этой области станет проблемой. Если вы попытаетесь справиться с этим заранее, вы, скорее всего, вставите ошибку или просто получите излишне сложный код, который может вызвать проблемы с обслуживанием. - person Michael Rutherfurd; 13.11.2008
comment
Я согласен. Сначала поставьте проблему, а потом ищите решение. - person ReneS; 10.03.2009

Дважды хорошо.

У тебя нет большого набора ключей. Не беспокойтесь о сложных дискуссиях о вашей реализации HashTable и выбирайте 2000.

person fulmicoton    schedule 13.11.2008
comment
2000 не подходит, потому что это не простое число. 2001 год был бы хорош, он не премьер, но по крайней мере даже не. Будет намного лучше распределять ключи в таблице. Хорошая хеш-таблица позаботится о хорошей хэш-функции, но в большинстве случаев используется размер. - person ReneS; 14.11.2008
comment
Это интересный вопрос. Ваше утверждение верно, если вы используете хеш-ключ типа: H(s) = s[0] + b*s[1] + b^2s[2] + ... [N] Я думаю, что сегодняшний отраслевой стандарт таков: используйте 2 ^ k в качестве размера и лучшие хэш-функции, такие как Jenkins. Однако в прошлый раз, когда я проверял, std работал с праймом. - person fulmicoton; 18.11.2008

Я хотел бы повторить то, что https://stackoverflow.com/users/33229/wwwflickrcomphotosrene-germany сказано выше . 1000 не кажется мне очень большим хэшем. Я использовал много хеш-таблиц такого размера в java, не видя особых проблем с производительностью. И я почти никогда не заморачиваюсь с размером или коэффициентом загрузки.

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

В конце концов, в большинстве кодов проблема производительности не там, где вы думаете. Я стараюсь не предвидеть.

person Terry Lacy    schedule 13.11.2008