Опубликован: 08.11.2006 | Уровень: специалист | Доступ: платный | ВУЗ: Новосибирский Государственный Университет
Лекция 13:

Поиск

< Лекция 12 || Лекция 13: 1234 || Лекция 14 >

Логарифмический поиск в динамических таблицах

Здесь мы рассмотрим организацию в виде деревьев для таблиц, в которых часто встречаются включения и исключения. Что происходит с временем поиска в дереве, которое модифицировалось путем включения и исключения? Если включенные и исключенные имена выбраны случайно, то оказывается, что в среднем время поиска мало изменяется; но в худшем случае поведение плохое - деревья могут вырождаться в линейные списки, поиск в которых нужно осуществлять последовательно. Проблема вырождения дерева в линейный список, приводящая к времени поиска {\rm
O}(n) вместо {\rm O}(\log n) в практических применениях выражена более резко, чем это указывается теоретическим анализом. Такой анализ обычно предполагает, что включения и исключения появляются случайным образом, но на практике часто это не так.

Случайные деревья бинарного поиска. Как ведут себя деревья бинарного поиска без ограничений в качестве динамических деревьев? Другими словами, предположим, что дерево бинарного поиска меняется при случайных включениях и исключениях.

Для включения z мы используем незначительную модификацию алгоритма 13.5. Если z не было найдено, мы получаем для z новую ячейку и связываем ее с последним узлом, пройденным во время безуспешного поиска z. Соответствующее предложение нельзя однако просто добавить в конце алгоритма 13.5, поскольку при нормальном окончании цикла while указатель p не указывает больше на последний пройденный узел, а вместо этого имеет значение \Lambda. В связи с этим мы должны производить включение до того, как выполняется предположение p \leftarrow LEFT(p) или p \leftarrow
RIGHT(p) ; мы можем осуществить это, сделав процедуру включения рекурсивной. Процедура INSERT(z,T) выдает в качестве значения указатель на дерево, в которое добавлено z. Таким образом, T
\leftarrow INSERT(z,T) используется для включения z в T.

Алгоритм 13.6. Включение в дерево бинарного поиска

Алгоритм 13.6. Включение в дерево бинарного поиска

Исключение гораздо сложнее включения, и мы изложим здесь только основную идею. Если подлежащее удалению имя z имеет самое большее одного сына, то при исключении z его сын (если он вообще есть) объявляется сыном отца z. Если z имеет двух сыновей, его прямо удалить нельзя. Вместо этого мы находим в таблице либо имя y_1, которое непосредственно предшествует z, либо имя y_2, которое непосредственно следует за z в естественном порядке. Оба имени принадлежат узлам, которые имеют не больше одного сына, и, таким образом, z можно исключить заменой его либо именем y_1, либо y_2, и затем исключением узла, который содержал y_1 или y_2, соответственно.

Сбалансированные сильно ветвящиеся деревья

Деревья бинарного поиска естественным образом обобщаются до m -арных деревьев поиска, в которых каждый узел имеет k \leqslant m сыновей и содержит k - 1 \leqslant m - 1 имен. Имена в узле делят множество имен на k подмножеств, каждое подмножество соответствует одному из k поддеревьев узла. На рис. 13.2 показано полностью заполненное 5-арное дерево с двумя уровнями. Заметим, что мы не можем требовать, чтобы каждый узел m -арного дерева имел ровно m сыновей и включал равно m -
1 имен; если мы захотим включить Z в дерево на рисунке 13.2, то должны будем создать узлы с меньше чем m сыновьями и меньше чем m -
1 именами. Таким образом, определение m -арного дерева утверждает только, что каждый узел имеет не более m сыновей и содержит не более m
- 1 имен. Ясно, что на m -арных деревьях можно осуществлять поиск так же, как и на бинарных деревьях.

Как и в деревьях бинарного поиска, полезно различать внутренние узлы и листья. Внутренний узел содержит k \geqslant 1 имен, записанных в естественном порядке, и имеет k + 1 сыновей, каждый из которых может быть либо внутренним узлом, либо листом. Лист не содержит имен (разве что временно в процессе включения), и, как раньше, в листьях - завершаются безуспешные поиски. Обычно за очевидностью мы на рисунке их опускаем.

Абсолютно сбалансированное, полностью заполненное 5-арное дерево поиска

Рис. 13.2. Абсолютно сбалансированное, полностью заполненное 5-арное дерево поиска

Сбалансированное сильно ветвящееся дерево порядка m есть m -арное дерево в котором:

  1. Все листья расположены на одном уровне.
  2. Корень имеет k сыновей, 2 \leqslant k \leqslantm.
  3. Другие внутренние узлы имеют k' сыновей, m/2 \leqslant k'  \leqslant m.
< Лекция 12 || Лекция 13: 1234 || Лекция 14 >
Денис Хажиев
Денис Хажиев
Россия
Замир Ашурбеков
Замир Ашурбеков
Россия