Россия |
Поиск
Логарифмический поиск в динамических таблицах
Здесь мы рассмотрим организацию в виде деревьев для таблиц, в которых часто встречаются включения и исключения. Что происходит с временем поиска в дереве, которое модифицировалось путем включения и исключения? Если включенные и исключенные имена выбраны случайно, то оказывается, что в среднем время поиска мало изменяется; но в худшем случае поведение плохое - деревья могут вырождаться в линейные списки, поиск в которых нужно осуществлять последовательно. Проблема вырождения дерева в линейный список, приводящая к времени поиска вместо в практических применениях выражена более резко, чем это указывается теоретическим анализом. Такой анализ обычно предполагает, что включения и исключения появляются случайным образом, но на практике часто это не так.
Случайные деревья бинарного поиска. Как ведут себя деревья бинарного поиска без ограничений в качестве динамических деревьев? Другими словами, предположим, что дерево бинарного поиска меняется при случайных включениях и исключениях.
Для включения мы используем незначительную модификацию алгоритма 13.5. Если не было найдено, мы получаем для новую ячейку и связываем ее с последним узлом, пройденным во время безуспешного поиска . Соответствующее предложение нельзя однако просто добавить в конце алгоритма 13.5, поскольку при нормальном окончании цикла указатель не указывает больше на последний пройденный узел, а вместо этого имеет значение . В связи с этим мы должны производить включение до того, как выполняется предположение или ; мы можем осуществить это, сделав процедуру включения рекурсивной. Процедура выдает в качестве значения указатель на дерево, в которое добавлено . Таким образом, используется для включения в .
Исключение гораздо сложнее включения, и мы изложим здесь только основную идею. Если подлежащее удалению имя имеет самое большее одного сына, то при исключении его сын (если он вообще есть) объявляется сыном отца . Если имеет двух сыновей, его прямо удалить нельзя. Вместо этого мы находим в таблице либо имя , которое непосредственно предшествует , либо имя , которое непосредственно следует за в естественном порядке. Оба имени принадлежат узлам, которые имеют не больше одного сына, и, таким образом, можно исключить заменой его либо именем , либо , и затем исключением узла, который содержал или , соответственно.
Сбалансированные сильно ветвящиеся деревья
Деревья бинарного поиска естественным образом обобщаются до -арных деревьев поиска, в которых каждый узел имеет сыновей и содержит имен. Имена в узле делят множество имен на подмножеств, каждое подмножество соответствует одному из поддеревьев узла. На рис. 13.2 показано полностью заполненное 5-арное дерево с двумя уровнями. Заметим, что мы не можем требовать, чтобы каждый узел -арного дерева имел ровно сыновей и включал равно имен; если мы захотим включить в дерево на рисунке 13.2, то должны будем создать узлы с меньше чем сыновьями и меньше чем именами. Таким образом, определение -арного дерева утверждает только, что каждый узел имеет не более сыновей и содержит не более имен. Ясно, что на -арных деревьях можно осуществлять поиск так же, как и на бинарных деревьях.
Как и в деревьях бинарного поиска, полезно различать внутренние узлы и листья. Внутренний узел содержит имен, записанных в естественном порядке, и имеет сыновей, каждый из которых может быть либо внутренним узлом, либо листом. Лист не содержит имен (разве что временно в процессе включения), и, как раньше, в листьях - завершаются безуспешные поиски. Обычно за очевидностью мы на рисунке их опускаем.
Сбалансированное сильно ветвящееся дерево порядка есть -арное дерево в котором:
- Все листья расположены на одном уровне.
- Корень имеет сыновей, .
- Другие внутренние узлы имеют сыновей, .