Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
математическая логика и теория алгоритмов.doc
Скачиваний:
118
Добавлен:
10.05.2014
Размер:
2.32 Mб
Скачать
        1. Перемешивание сцеплением

Перемешанная таблица, использующая перемешивание сцеплением, обладает следующими свойствами:

  1. Таблица явно разделяется на две области – основную и переполнения;

  2. Основная область таблицы отображается вектором, размер которого должен быть достаточным для отображения всех значений ключей;

  3. Область переполнения представляет собой семейство списков – отдельный список для каждого элемента основной области.

Следовательно, элемент перемешанной таблицы, использующей перемешивание сцеплением, должен иметь еще одно поле – поле связи с элементами из области переполнения (рис. II–50).

Рис. II–50

Рассмотрим способ перемешивания сцеплением на примере выполнения операции включения элементов в таблицу.

Пусть дана та же, что и ранее, последовательность ключей элементов, записываемых в таблицу (всего 15 элементов):

12, 48, 3, 5, 7, 63, 15, 202, 103, 188, 30, 43, 6, 18, 19

Используем ту же функцию расстановки:

I(k) = k%10;

В соответствии с выбранной функцией расстановки основная область таблицы будет представлена вектором из 10 элементов.

Функция расстановки отобразит исходное множество ключей в следующее множество производных ключей:

номер элемента

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

исходный ключ

12

48

3

5

7

63

15

202

103

188

30

43

6

18

19

производный ключ

2

8

3

5

7

3

5

2

3

8

0

3

6

8

9

При занесении записей в таблицу, пока не встретится коллизия (т.е. до записи с ключом 63), записи будут включаться в основную область. В случае коллизии запись будет включена в список, связанный с соответствующим элементом основной таблицы, причем переполняющая запись может быть включена и в начало, и в конец соответствующего списка. В результате занесения всех перечисленных записей таблица примет вид, приведенный на рис. II–51 (для наглядности переполняющие записи включаются в конец соответствующего списка).

Рис. II–51

Из приведенного примера видно, что записи, ключи которых имеют одинаковое значение производного ключа, объединяются в один список; следовательно, при поиске записи потребуется просматривать только записи таблицы с одинаковым значением производного ключа. В упоминавшейся выше книге Ф. Хопгуда "Методы компиляции" (стр. 36) приведена следующая оценка средней длины поиска для случайных, равномерно распределенных записей:

,

где M– размер основной области таблицы (отображающего вектора),

N– общее количество элементов в таблице.

На практике отображающий вектор (основную область таблицы) можно представить только массивом указателей на элементы таблицы, а все записи включать в область переполнения. В этом случае все операции с таблицей сначала осуществляют выбор необходимого списка (элемента массива указателей), а затем реализуется требуемая операция со списком (соответствующие операции со списками были рассмотрены ранее). При такой организации таблицы минимальная длина доступа будет равна 2, так как всегда требуется, по крайней мере, одно дополнительное обращение к области переполнения. С другой стороны, выполнение операций вставки и удаления при такой организации таблицы не требуют проверок, где размещается элемент – в основной области или области переполнения. Предлагаю самостоятельно разработать и реализовать основные операции работы с перемешанной таблицей, использующей перемешивание сцеплением.