Я попытаюсь дать простые объяснения хэширования и его цели.
Сначала рассмотрим простой список. Каждая операция (вставить, найти, удалить) в таком списке будет иметь сложность O (n), что означает, что вам необходимо проанализировать весь список (или половину его в среднем) для выполнения такой операции.
Хешинг - это очень простой и эффективный способ ускорить его: учтите, что мы разделили весь список в наборе небольших списков. Элементы в одном таком небольшом списке будут иметь что-то общее, и это может быть выведено из ключа. Например, имея список имен, мы могли бы использовать первую букву как качество, которое будет выбирать, в каком маленьком списке искать. Таким образом, разбив данные на первую букву ключа, мы получили простой хеш, который сможет разбить весь список в ~ 30 меньших списков, так что каждая операция будет принимать O (n)/30 раз ,
Однако мы могли бы отметить, что результаты не настолько совершенны. Во-первых, их всего 30, и мы не можем их изменить. Во-вторых, некоторые буквы используются чаще, чем другие, так что набор с Y
или Z
будет намного меньше, чем набор с A
. Для получения лучших результатов лучше найти способ разделения элементов в наборах примерно такого же размера. Как мы можем это решить? Здесь вы используете хэш-функции. Это такая функция, которая способна создавать произвольное количество разделов с примерно одинаковым количеством элементов в каждом. В нашем примере с именами, мы могли бы использовать что-то вроде
int hash(const char* str){
int rez = 0;
for (int i = 0; i < strlen(str); i++)
rez = rez * 37 + str[i];
return rez % NUMBER_OF_PARTITIONS;
};
это обеспечило бы довольно равномерное распределение и настраиваемое количество наборов (называемых также ведер).
Попробуйте [Hash table] (http://en.wikipedia.org/wiki/Hash_table) в Википедии. Хеш-функция используется как часть процесса, но не объясняет, как работает хэш-таблица. – 2010-12-15 19:05:25
Нет такой вещи, как `HashList` на Java или любой другой язык, о котором я знаю. Не используйте форматирование кода для текста, который не является кодом. – EJP 2017-06-12 05:27:54