Подтвердить что ты не робот

Хэш-таблица: почему размер должен быть простым?

Возможный дубликат:
Почему хеш-функции используют модуль простых чисел?

Почему необходимо, чтобы размер хэш-таблицы (структуры данных) был простым?

Из того, что я понимаю, он обеспечивает более равномерное распределение, но есть ли другая причина?

4b9b3361

Ответ 1

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

из http://srinvis.blogspot.com/2006/07/hash-table-lengths-and-prime-numbers.html

Если предположим, что ваша функция hashCode приводит к следующим хэш-кодам среди других {x, 2x, 3x, 4x, 5x, 6x...}, то все они собираются в виде всего m кол-во ведер, где m = table_length/GreatestCommonFactor (table_length, x). (Тривиально проверить/вывести это). Теперь вы можете сделать одно из следующих действий, чтобы избежать кластеризации

  • Убедитесь, что вы не генерируете слишком много хэш-кодов, которые являются кратными другому хэш-коду, например, в {x, 2x, 3x, 4x, 5x, 6x...}. Но это может быть довольно сложно, если ваш hashTable должен иметь миллионы записей.

  • Или просто сделайте m равным table_length, сделав GreatestCommonFactor (table_length, x) равным 1, т.е. сделав table_length взаимно просты с x. И если x может быть почти любым числом, тогда убедитесь, что table_length является простым числом.

Ответ 2

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

return hashVal% tableSize

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