2012-02-23 4 views
5

Недавно меня спросили: «Как бы вы реализовали hastable». Я знаю, что алгоритм хэширования имеет решающее значение, так как меньше коллизий лучше, чем производительность WRT, но какой алгоритм/структура данных следует использовать для доставки амортизированного постоянного времени {O (1)} для вставки/удаления/поиска?Внедрение Hashtable

+0

Может ли сила массивов быть с вами? –

+0

Вы посмотрели в книге «Введение в алгоритмы» Кормена и др.? – Raphael

+0

Это именно та книга, в которой я нахожусь. –

ответ

7

таблицы хеширования имеет две основных возможностей:

  1. открытой адресация, который является простого массива [динамического массива actualy если вы можете позволить вашему столу расти на лета]. Как только конфликт встретится - вам нужно использовать вторую хеш-функцию, чтобы найти следующую строку, на которую будет отображаться элемент. Обратите внимание, что это решение имеет некоторые проблемы [которые могут быть решены], когда ваша хеш-таблица также позволяет удалять. [Специальный знак для «удаленных» блюд]
  2. СЦЕПЛЕНИЯ - в этом решении, каждый вхож в массиве является связанным список - containig всех элементов хешируются этой вхожа. Здесь - все элементы, сопоставленные определенному значению, находятся в списке.

важная часть о хэш-таблиц [в обоих растворах] для того, чтобы позволить armotorized O (1) вставки/дел/смотреть вверх - выделяет большую таблицу и перепевы после достижения заранее определенный load factor.

EDIT: сложность analsis:
Предположим, коэффициент нагрузки p для некоторого p < 1.

  1. вероятность «столкновения» в каждом доступе есть p Таким образом, среднее значение массива доступов: Sigma(i * p^(i-1) * (1-p)) for each i in [1,n] Это дает: Sigma(i * p^(i-1) * (1-p)) = (1-p) * Sigma(i * p^(i-1)) <= (1-p) * 1/(p-1)^2 = 1-p = CONST. [взгляните на правильность Sigma(i * p^(i-1)) < 1/(p-1)^2 in wolfram alpha]. Таким образом, получается в среднем постоянное количество обращений к массиву. Кроме того: вам может потребоваться перефразировать все элементы после достижения коэффициента загрузки, в результате получится O(n) доступ к массиву. Это приводит к n * O(1) ops [добавление n элементов] и 1 * O(n) op [rehashing], так что вы получаете: (n * O(1) + 1 * O(n))/n = O(1) время в арматуре.
  2. Очень похоже на (1), но анализ выполняется при доступе к списку. Для каждой операции требуется ровно один доступ к массиву, а число вариантов доступа к списку - с тем же анализом, что и раньше.
+0

Помог ли downvoter комментировать? – amit

+0

Я не голосовал, но, думаю, вы перепутали свою терминологию. Реализованные хеш-таблицы «Цепочки» состоят из связанных списков элементов в каждом хэш-ведре. Реализованные хеш-таблицы с открытым адресом - это те, которые хранят элементы в одном буфере и могут быть реализованы с помощью стратегии двойного хэширования, которую вы описали. Проверьте страницу, с которой вы связались ... –

+0

@DarrenEngwirda: Спасибо за ваш комментарий. Я не являюсь носителем английского языка, и из-за этого я время от времени смешиваю условия. Я отредактировал ответ. – amit

Смежные вопросы