ВУЗ:
Составители:
Рубрика:
48
ванная таблица называется хеш-таблицей с открытым хешированием. Схемати-
чески она изображена на следующем рисунке:
0
N-1
Заметим, что если в списках находится примерно равное количество элемен-
тов, то поиск одинаково эффективен для всех возможных значений. Например,
пусть N=1001 и в каждом списке максимум 3 элемента, а во всей хеш-таблице –
2048 элементов. Тогда после вычисления хеш-значения элемента последователь-
ный поиск в списке с этим номером потребует максимум
три итерации. Бинарный
же поиск потребует 11 итераций (
20482
11
= ).
Если количество элементов в разных списках отличается значительно, то эф-
фективность хеширования падает. Самый плохой случай – если один список со-
держит все элементы, а остальные списки – пустые. Для поиска в этом случае мо-
жет потребоваться 2048 итераций. Поэтому следует стремиться к тому, чтобы
хеш-функция хорошо перемешивала элементы, заполняя хеш-таблицу
как можно
более равномерно для любых значений (отсюда и название метода – хеширование,
т.е. перемешивание). В частности, именно поэтому число N стремятся выбирать
простым.
Реализуем хеш-таблицу целых в виде класса на основе динамического масси-
ва списков. Поскольку список обеспечивает удаление элемента, наша хеш-
таблица будет также позволять удалять элементы.
uses IntList;
const
sz = MaxInt div sizeof(List);
type
PArr = ^Arr;
Arr = array [0..sz-1] of List;
HashTable = class
private
a: PArr;
N: integer;
public
constructor Create(nn: integer);
destructor Destroy;