Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Задание к ИДЗ блоковые списки.doc
Скачиваний:
31
Добавлен:
20.06.2014
Размер:
342.53 Кб
Скачать

1.3. Линейные связные индексированные блоковые списки

Механизм индексации блоковых списков сходен с механизмом индексации узловых. Так как в блоковых списках количество элементов в блоках варьируется, равномерная индексация узлов затруднена. Вместо этого можно проводить равномерную индексацию блоков. Блоковая структура предусматривает произвольный доступ внутри блока без перемещения по ссылкам, поэтому пока не добавляются и не удаляются новые блоки, индексная таблица не "ухудшается", хотя при этом может происходить значительное количество операций вставки или удаления. Графический пример индексированного блокового списка с размером блока 15 приведен на рис. 10 (индексы указывают на начало соответствующего блока).

Адрес

0

15

40

Рис. 10. Индексированный блоковый список

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

Для индексации блоков в индексную таблицу следует добавить независимый столбец, который не учитывается при доступе к элементам, но используется для переиндексации при вставке/удалении блоков, если накопилась значительная неравномерность. Индексная таблица будет содержать теперь три поля: номер блока, номер позиции и адрес блока. Исходя из выбранного размера индексной таблицы и текущей длины списка в блоках, при каждой операции вставки/удаления блока вычисляется размер интервала индексации. В столбце индексной таблицы, отвечающей за номер блока, при необходимости происходит перераспределение номеров для восстановления равномерности, остальные два столбца в этом случае также обновляют содержимое. Перестройка таблицы предполагает полный проход по блокам для вычисления номера и адреса блоков, однако она выполняется редко.

Предположим, что блоковый список содержит 10 000 элементов в 500-х блоках, размер блока – 20. Пусть индексная таблица содержит 6 записей. Тогда диапазон индексации  = 500/5 = 100 блоков. При этом можно добавлять или удалять до 5-ти блоков, т.е. 520 = 100 случайных элементов в один и тот же индексный диапазон, так как int(500/5) = int(501/5) = ...= int(504/5)  int(505/5). Если в списке требуется произвольный доступ, такой, что обращения к произвольным ячейкам случайны и равномерно распределены, операции вставки/удаления будут происходить равномерно по всем индексным диапазонам, и полного прохода по списку не потребуется в течение длительного времени. Интерес также представляют случаи, когда операции произвольного доступа происходят не по равномерному, а согласно иным законам распределения. Для создания генератора случайной величины с заданным законом распределения может использовать метод обратных функций. Он заключается в том, что для заданной функции распределения F(x) случайной величины находят обратную к ней функцию Q(x) такую, что Q(F(x))  x. Затем, подставляя в качестве аргумента функции Q(x) значение равномерно распределенной на [0,1] случайной величины r, получают случайную величину Q(r) с требуемым законом распределения F(x). Для генерации приблизительно нормально распределенной случайной величины с нулевым математическим ожиданием и единичной дисперсией можно вначале сгенерировать s равномерно распределенных на [0,1] случайных величин Ri, а затем вычислить величину X = (R1+R2+...+Rs-s/2)/ (s/12)1/2.