Простая хеш-таблица работает, сохраняя элементы в нескольких списках вместо одного. Он использует очень быстрый и повторяемый (то есть неслучайный) метод, чтобы выбрать, в каком списке хранить каждый элемент. Поэтому, когда пришло время снова найти элемент, он повторяет этот метод, чтобы определить, в каком списке искать, и затем выполняет обычный (медленный) линейный поиск в этом списке.
Разделение элементов на 17 списков ускоряет поиск в 17 раз, что является хорошим улучшением.
Хотя, конечно, это верно только в том случае, если списки имеют примерно одинаковую длину, поэтому важно выбрать хороший способ распределения элементов между списками.
В вашем примере таблицы первый столбец - это ключ, то, что нам нужно, чтобы найти элемент. И давайте предположим, что мы будем поддерживать 17 списков. Чтобы вставить что-то, мы выполняем операцию с ключом, называемую хэшированием. Это просто превращает ключ в число. Он не возвращает случайное число, потому что он всегда должен возвращать одно и то же число для одного и того же ключа. Но в то же время цифры должны «широко распространяться».
Затем мы берем полученное число и используем модуль, чтобы уменьшить его до размера нашего списка:
Hash(key) % 17
Все это происходит очень быстро. Наши списки находятся в массиве, поэтому:
_lists[Hash(key % 17)].Add(record);
А потом, чтобы найти предмет с помощью этого ключа:
Record found = _lists[Hash(key % 17)].Find(key);
Обратите внимание, что каждый список может быть контейнером любого типа или классом связанного списка, который вы пишете вручную. Когда мы выполняем Find
в этом списке, он работает медленно (проверьте ключ каждой записи).