Комбинаторные алгоритмы для программистов

          

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


Здесь мы рассмотрим организацию в виде деревьев для таблиц, в которых часто встречаются включения и исключения. Что происходит с временем поиска в дереве, которое модифицировалось путем включения и исключения? Если включенные и исключенные имена выбраны случайно, то оказывается, что в среднем время поиска мало изменяется; но в худшем случае поведение плохое - деревья могут вырождаться в линейные списки, поиск в которых нужно осуществлять последовательно. Проблема вырождения дерева в линейный список, приводящая к времени поиска

Логарифмический поиск в динамических таблицах
вместо
Логарифмический поиск в динамических таблицах
в практических применениях выражена более резко, чем это указывается теоретическим анализом. Такой анализ обычно предполагает, что включения и исключения появляются случайным образом, но на практике часто это не так.

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

Для включения

Логарифмический поиск в динамических таблицах
мы используем незначительную модификацию алгоритма 13.5. Если
Логарифмический поиск в динамических таблицах
не было найдено, мы получаем для
Логарифмический поиск в динамических таблицах
новую ячейку и связываем ее с последним узлом, пройденным во время безуспешного поиска
Логарифмический поиск в динамических таблицах
. Соответствующее предложение нельзя однако просто добавить в конце алгоритма 13.5, поскольку при нормальном окончании цикла
Логарифмический поиск в динамических таблицах
указатель
Логарифмический поиск в динамических таблицах
не указывает больше на последний пройденный узел, а вместо этого имеет значение
Логарифмический поиск в динамических таблицах
. В связи с этим мы должны производить включение до того, как выполняется предположение
Логарифмический поиск в динамических таблицах
или
Логарифмический поиск в динамических таблицах
; мы можем осуществить это, сделав процедуру включения рекурсивной. Процедура
Логарифмический поиск в динамических таблицах
выдает в качестве значения указатель на дерево, в которое добавлено
Логарифмический поиск в динамических таблицах
. Таким образом,
Логарифмический поиск в динамических таблицах
используется для включения
Логарифмический поиск в динамических таблицах
в
Логарифмический поиск в динамических таблицах
.

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

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

Исключение гораздо сложнее включения, и мы изложим здесь только основную идею. Если подлежащее удалению имя

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


Содержание раздела