Недостаточно знать n
.Распределение элемента по корзине является функцией самого элемента, поэтому, если вы хотите получить идеальную хеш-функцию (один элемент на корзину), вам необходимо знать данные.
В любом случае, если вы 'ограничивая количество элементов до известного n
, вы уже технически ищите O (1).Верхняя граница будет основана на константе n
.Это было бы верно даже для решения без хэширования.
Лучше всего, вероятно, просто использовать имеющуюся у вас хеш-функцию, и чтобы каждое ведро было связанным списком сталкивающихся элементов.Даже если хеш не идеален, вы все равно значительно минимизируете затраченное время.
Только если хеш полностью несовершенен (все элементы n
, помещенные в одну корзину), он будет таким же плохим, какобычный связанный список.
Если вы не знаете данные заранее, идеальный хеш не возможен.Если, конечно, вы не используете h
сам в качестве хеш-ключа, а не h%n
, но это займет очень много места: -)
Мой совет - использовать достаточно хороший хеш ссвязанный список маршрутов.Я не сомневаюсь, что вы могли бы создать лучшую хэш-функцию, основанную на относительной частоте букв в именах людей по всему населению, но даже ваш хэш (который идеально подходит для всех букв, имеющих одинаковую частоту) должен быть адекватным.*
И, в любом случае, если вы начнете полагаться на частоты, и вы получите приток людей из тех стран, которые, кажется, не используют гласные (а-ля Босния a ), вы в конечном итогес большим количеством столкновений.
Но имейте в виду, что это действительно зависит от n
, который вы используете.
Если n
достаточно мало, вы можете даже сойти с рук споследовательный поиск несортированного массива.Я предполагаю, что ваш n
достаточно велик, и вы уже установили, что (или сбалансированное двоичное дерево) не даст вам достаточной производительности.
Пример: у нас есть некоторый код, которыйпросматривает списки проблем, ища имена людей, оставивших комментарии (чтобы мы могли определить последнего члена нашей команды, который ответил).В нашей команде всего около десяти или около того членов, поэтому мы просто используем их последовательный поиск - повышение производительности за счет использования более быстрой структуры данных считалось слишком большой проблемой.
a Без обид.Я просто помню юмористическую статью давным-давно о Клинтоне, разрешающем перенос гласных слов в Боснию.Я уверен, что есть другие страны с подобной «проблемой».