Есть ли смысл изменить размер хеш-таблица вниз? И когда?

StackOverflow https://stackoverflow.com/questions/2625684

Вопрос

Моя реализация HASH Table имеет функцию для изменения таблицы, когда нагрузка достигает около 70%. Мой хеш-таблица реализован с отдельными цепочками для столкновений.

У вас есть смысл, что я должен изменить размер хеш-таблица в любой момент или я должен просто оставить это, как есть? В противном случае, если я увеличиваю размер (почти двойным, на самом деле я следую это: http://planetmath.org/rusclenceClopedia/goodhashtableprides.html.) Когда нагрузка составляет 70%, я должен изместить его, когда нагрузка получает 30% или ниже?

Это было полезно?

Решение

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

Другие советы

Hash Tables не нужно иметь длину простого числового номера, если у вас есть хорошая хеш-функция (см. здесь). Вы можете сделать их полномочиями двух, которые существенно ускоряют индексные вычисления.

Почему это отношение к вопросу? Потому что, когда вы сжимаетесь с двумя хэш-хесами, вы можете оставить все записи в нижней половине, где они есть и просто добавьте связанный список в слоте i (от верхней половины) на связанный список в слоте i - n/2.

Если память дешево, оставь ее в покое. Если память стоит дорого, измените размер с Hysterisis, как вы предложили. Когда сделано, профиль результата, чтобы убедиться, что он хорошо работает и не сделал что-то глупо.

Первая идея: единственная причина для выращивания хэса, потому что производительность Hashtable уменьшается, если есть слишком много столкновений. Выращивание таблицы, когда его нагрузка превышает 70%, - это хорошее правило, чтобы предотвратить это, но это просто правило большого пальца. Намного лучше содержать отслеживание количества столкновений и расти только Hashtable, если они превышают определенный предел или после того, как определенный соотношение столкновения. В конце концов, почему вы хотите вырастить хэш, который загружен на 90%, но не имеет ни одного столкновения? У него не было бы преимуществ.

Вторая идея: единственная причина сокращения Hashtable состоит в том, чтобы сохранить память, но сокращается, она может увеличить количество столкновений и, таким образом, уменьшать производительность поиска. Это классическая скорость против компромиты памяти и почему вы должны решить сами? Оставьте это тем, кто использует ваш код. Просто никогда не уменьшится самостоятельно, но предлагаю метод сжимания. Если использование низкого использования памяти является требованием, тот, кто использует ваш код, может регулярно вызывать сокращение. Если максимальная производительность, если требование, тот, кто использует ваш код, никогда не должен вызывать уменьшение. Все остальные могут использовать какой-то эвристический, чтобы решить, и когда звонить сжимается.

Третья идея: при выращивании или сокращении всегда растут / сжимается таким образом, что после операции гарантируется определенный коэффициент нагрузки. Например, когда растут, всегда расти, так что после этого коэффициент нагрузки составляет 50%, а при сокращении, всегда сокращается таким образом, что после этого коэффициент нагрузки составляет 70%. Конечно, это ничего не говорит о количестве столкновений, поэтому добавление элемента сразу после выращивания / сокращения может привести к тому, что хеэштуру снова растут, но это неизбежно, как имитация эффекта расти / сокращения, как правило, слишком дорого. Также термоусадочные часто называются после дальнейших модификаций, поэтому она должна скорее сохранять память, чем избегать, чтобы снова расти в будущем.

Последнее представление: для каждого решения, которое вы делаете, вы сделаете Hashtable лучше для некоторых случаев использования и хуже для других. Если вы знаете, как будет использоваться ваш Hashtable, это не будет проблемой. Тем не менее, если вы этого не сделаете, и обычно вы не делаете, зачем принимать эти решения самостоятельно? Просто делегировать их. Разрешить пользователю вашего кода, чтобы настроить все небольшие детали, например, сколько для увеличения или сокращения, либо, позволяя установить все эти факторы, когда ваш hashtable создается или, позволяя вашим hashtable иметь функции делегирования (функции обратного вызова, которые вы всегда можно спросить, когда не уверен, что делать). Таким образом, каждый пользователь вашего кода может настроить свой код даже во время выполнения для любого сценария использования, которые они его требуют.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top