69
ОСНОВЫ АЛГОРИТМОВ И СТРУКТУР ДАННЫХ
4.9.5. Метод цепочек
Все
вышеописанные
методы
реализовывали
включение
как
последовательность обращений к ячейкам с адресами
А
0
,
А
1
,
А
2
и т.д. При
поиске адреса
А
0
,
А
1
,
А
2
… также последовательно вычисляются, как и при
включении. Этого повторного вычисления адресов можно избежать, если
применить связные списки: каждому имени
x
i
хранящемуся в ячейке
M
(
A
k
)
будет сопоставлена ссылка на ячейку, в которой хранится следующий элемент
из данной коллизии.
Пример:
Пусть
A
k
=(
h
0
(
x
)+
k
)mod
m
;
0
1
2
3
4
5
6
7
8
9
10 11 12 13 14 15
имена
h
функции
2
3
4
2
7
8
7
7
11 8
ссылки
5
-
9
12 10 -
-
-
Включаем элемент
z
с
h
0
(
z
)=7/
В ячейке
A
0
(
z
)=7 уже есть другое имя (т.е. имеем здесь коллизию).
Вместо того, чтобы анализировать, занята ли ячейка
A
1
=
A
0
+1=8, мы сразу
переходим к ячейке 9 (по ссылке). Далее к ячейке 10. Здесь уже нет ссылки.
Далее,
A
3
=
A
2
+1=10+1=11 – занята;
A
4
=
A
3
+1=11+1=12 – занята;
A
5
=
A
4
+1=12+1=13 – свободна.
Помещаем
z
в ячейку 13, а в ячейке 10 ставим ссылку 13.
Пример
Включение элемента
z
с
h
0
(
z
)=8 в связный список потребует двух итераций,
вместо пяти, в базовом варианте.
Алгоритм включения / исключения / поиска – самостоятельно!
1...,61,62,63,64,65,66,67,68,69,70 72,73,74,75,76,77,78,79,80,81,...106