6.5. Разреженный индекс 6.5.1 Разреженный индекс обычно создается, как вспомогательная структура для поиска в плотном индексе, хотя может применяться и как первичная структура поиска. Разреженный индекс представляет из себя структуру вида: <ук-тель> <знач.> <ук-тель> .... <ук-тель> <знач.> <ук-тель> Для каждого значения указатели справа и слева определяют диапазон поиска искомого элемента в основной структуре. Число указателей в разреженном индексе - его параметр m (число значений соответственно равно m-1). Для построения разреженного индекса с параметром m исходную структуру следует разбить на m блоков. Обозначим эти блоки Bi, где i=1..m. Должно выполняться условие: для любых i, j=1..m [((xe Bi, ye Bj) A (i<j)) => (x<y)]. При этом блоки могут располагаться не обязательно в упорядоченном порядке. Элементы внутри блока упорядочены. T~ m+log(n/m) ~ m+ logn - logm. Пример применения разреженного индекса для поиска в плотном индексе: Пусть плотный индекс выглядит так: (2,1), (3,2), (1,3), (4,4), (8,5), (7,6), (6,7), (5,8). Примечание. Считаем, что в каждом блоке хранится по одной записи исходной структуры Построим разреженный индекс с параметром 3= log 8 (т.к m=8) . (1)3(2)6(3) Предполагается, что можно хранить три записи плотного индекса в блоке (параметр e=3) и они распределены по блокам следующим образом: [(1,3), (2,1),(3,2)] [(4,4),(5,8),(6,7)] [(7,6), (8,5)] . По условию в блоке может быть k элементов, где (e+1)/2<=k<=e. Удаление элемента из плотного индекса означает его удаление из блока. Если в результате удаления очередного элемента в блоке осталось менее (e+1)/2, то переносится один элемент из соседнего блока, а если в соседнем блоке ровно (e+1)/2 элементов, то блоки объединяются. После этого корректируются записи разреженного индекса (фактически удаляется одно из значений). Пример (рис. 25).
|
Рис. 25. Удаление из разреженного индекса При включении нового элемента ищется по
разреженному индексу блок, куда он должен быть помещен. Элемент
помещается в этот блок, если в нем есть место (число элементов <e),
иначе блок расщепляется на два и корректируется разреженный индекс (фактически
вставляется новое значение). |