Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.12.2008, 07:45   #1
Zefick
Пользователь
 
Регистрация: 27.05.2008
Сообщений: 14
Смущение Почему размер хэш-таблицы обязательно простое число?

Вопрос в следующем: при проектировании хэш-таблиц обычно делают так, чтобы их размер был равен простому числу. Чаще всего это числа Мерсенне. Почему так? Что будет, если задать другой размер?
Например, при модульном хэшировании (хэш-код = (ключ)mod(размер)) если таблица будет иметь размер 20 и мы вставим в неё ключи от одного до ста, то в каждый ковш попадёт ровно по 5 значений и никакого перекоса не будет. Значит и саставные числа неплохо подходят, так почему-же именно простые выбирают в качестве размера?
Zefick вне форума Ответить с цитированием
Старый 22.12.2008, 08:37   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Ну, на сколько я знаю, рекомендуется использование не просто простых чисел (извиняйте за туфтологию ), а больших простых чисел, т.к. при таком выборе количество коллизий будет меньше (исследования это выявили), а в идеальной хэш таблице не должно их (коллизий) быть вообще.
pu4koff вне форума Ответить с цитированием
Старый 23.12.2008, 14:11   #3
Zefick
Пользователь
 
Регистрация: 27.05.2008
Сообщений: 14
По умолчанию

Наоборот, для хэш-таблицы с цепочками коллизий рекомендуется подбирать размер таблицы так, чтобы на каждую цепочку приходилось по 1-2 коллизии. Иначе сама структура таблицы имеет мало смысла.
Zefick вне форума Ответить с цитированием
Старый 24.12.2008, 10:13   #4
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от Zefick Посмотреть сообщение
Наоборот, для хэш-таблицы с цепочками коллизий рекомендуется подбирать размер таблицы так, чтобы на каждую цепочку приходилось по 1-2 коллизии. Иначе сама структура таблицы имеет мало смысла.
Я говорил про идеальную хэш-таблицу. Еще скажите, что коллизии просто необходимы и с ними лучше.
Хэш-таблица в идеале должна представлять из себя следующую структуру:
+------+----------+
| ключ | значение |
+------+----------+
| | |
+------+----------+
Одно обращение к этой таблице должно находить нужную запись и возвращать соответствующее значение, т.е. должен быть массив, у которого для навигации используется не индекс, а ключ. Наличие коллизий усложняет ситуацию, т.к. нужно реализовывать методы разрешения коллизий, что увеличивает время поиска.
Допустим коллизий у нас нет. Из-за этого автоматически "сама структура таблицы имеет мало смысла"? Если Вы имели ввиду, что более 2 коллизий плохо, то для этого какраз и выбирают в качестве размера таблицы большие простые числа, т.к. остаток от деления на них будет явно реже повторяться, а соответственно меньше коллизий будет. Или я заблуждаюсь?
pu4koff вне форума Ответить с цитированием
Старый 25.12.2008, 13:42   #5
Zefick
Пользователь
 
Регистрация: 27.05.2008
Сообщений: 14
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
Я говорил про идеальную хэш-таблицу. Еще скажите, что коллизии просто необходимы и с ними лучше.
Коллизии никогда не бывают к лучшему, просто непонятно, что вы имеете ввиду, говоря об идеальной таблице. Незаполненные таблицы отличаются только размером. Невозможно создать такую таблицу, в которой коллизии заранее исключены, если только она не бесконечного размера. Просто для таблиц с цепочками коллизий рекомендуется подбирать размер так, чтобы он был в два раза меньше, чем количество ключей, которое в ней собираются хранить. Тогда на каждую цепочку придётся по 2-3 значения, но трудоёмкость поиска всё равно останется постоянной. Альтернатива - сделать бОльшую таблицу и уменьшить вероятность коллизий ценой увеличения памяти для пустых ячеек.
Цитата:
Сообщение от pu4koff Посмотреть сообщение
Допустим коллизий у нас нет. Из-за этого автоматически "сама структура таблицы имеет мало смысла"?
Да, так как методы разрешения коллизий тогда не нужны.
Цитата:
Сообщение от pu4koff Посмотреть сообщение
Если Вы имели ввиду, что более 2 коллизий плохо, то для этого какраз и выбирают в качестве размера таблицы большие простые числа, т.к. остаток от деления на них будет явно реже повторяться, а соответственно меньше коллизий будет. Или я заблуждаюсь?
Нет, скорее всего вы не заблуждаетесь. Я как раз и хочу выяснить почему остаток от деления на простые числа будет реже повторятся. Это вовсе не очевидно. Например, если размер таблицы 250, а мы вставляем туда ключи от 0 до 1000000, то существует по 4000 ключей, которые потенциально могут находится в каждой ячейке. Это кочичесво существенно не изменится, если размер таблицы будет 251 - простое число.
Zefick вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обязательно ли программисту эмигрировать в США? Alar Свободное общение 58 27.12.2010 20:15
Простое любопытство.... KORT Свободное общение 130 20.06.2009 19:06
Как изменить динамически менять размер плавающего фрейма, к-й находится в ячейке таблицы? 3lander HTML и CSS 8 26.05.2008 19:54
взаимно простое числы Cantana Помощь студентам 4 07.03.2008 08:46