Как выбрать размер хэш-таблицы?

Предположим, у меня есть 200.000 слов, и я собираюсь использовать hash*33 + word[i] как хэш-функция, каким должен быть размер таблицы для оптимизации, для минимальной Проблемы памяти / подкачки?

используемая платформа-C (версия c99),

слова английские слова char, значения ASCII

однократная инициализация хэш-таблицы (ведра стиля списка ссылок),

использовать для поиска, как поиск по словарю.

после столкновения , это слово будет добавлен как новый узел в ведро.

1 ответов


хорошее эмпирическое правило состоит в том, чтобы держать коэффициент нагрузки на 75% или меньше (некоторые скажут 70%), чтобы поддерживать (очень близко к) O(1) Поиск. Если у вас есть хорошая хэш-функция.

исходя из этого, вам понадобится минимум около 266,700 ведер (для 75%) или 285,700 ведер для 70%. Это при условии, что не будет столкновений.

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

вы также можете рассмотреть лучшую хэш-функцию, чем hash*33 + word[i]. The Дженкинс хэш и его варианты требуют больше вычислений, но они дают лучшее распределение и, таким образом, обычно приводят к меньшему количеству столкновений и меньшему требуемому размеру таблицы.

вы также можете просто бросить память на проблему. Размер таблицы 500,000 дает вам минимальный коэффициент загрузки 40%, который может компенсировать недостатки вашей хэш-функции. Однако, вы скоро достигните точки убывающей отдачи. То есть, размер таблицы 1 миллион дает вам теоретический коэффициент нагрузки 20%, но почти наверняка вы этого не поймете.

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

существует такая вещь, как минимальный совершенных хэш -. Если вы знаете, каковы ваши входные данные (т. е. они не меняются), вы можете создать хэш-функцию, которая гарантирует O (1) уважать. Это также очень эффективное пространство. Однако я не знаю, насколько сложно было бы создать минимальный идеальный хэш для 200 000 элементов.