Чтение онлайн

на главную - закладки

Жанры

Программирование на языке Пролог для искусственного интеллекта

Братко Иван

Шрифт:

добавив в нее третий аргумент

Путь
таким образом, чтобы можно было бы получить путь между корнем справочника и указанным элементом.

9.3. Двоичные справочники: добавление и удаление элемента

Если мы имеем дело с динамически изменяемым множеством элементов данных, то нам может понадобиться внести в него новый элемент или удалить из него один из старых. В связи с этим набор основных операций, выполняемых над множеством S, таков:

внутри( X, S) % X содержится в S

добавить( S, X, S1) %
Добавить X к S, результат - S1

удалить( S, X, S1) % Удалить X из S, результат - S1

Рис. 9.9. Введение в двоичный справочник нового элемента на уровне листьев. Показанные деревья соответствуют следующей последовательности вставок:

добавить( Д1, 6, Д2)
,
добавить( Д2, 6, Д3)
,
добавить( Д3, 6, Д4)

доблист( nil, X, дер( nil, X, nil) ).

доблист( дер( Лев, X, Прав), X, дер( Лев, X, Прав) ).

доблист( дер( Лев, Кор, Прав), X, дер( Лев1, Кор, Прав)) :-

 больше( Кор, X),

доблист( Лев, X, Лев1)).

доблист( дер( Лев, Кор, Прав), X, дер( Лев, Кор, Прав1)) :-

 больше( X, Кор),

 доблист( Прав, X, Прав1).

Рис. 9.10. Вставление в двоичный справочник нового элемента в качестве листа.

Определим отношение добавить. Простейший способ: ввести новый элемент на самый нижний уровень дерева, так что он станет его листом. Место, на которое помещается новый элемент, выбрать таким образом, чтобы не нарушить упорядоченность дерева. На рис. 9.9 показано, какие изменения претерпевает дерево в процессе введения в него новых элементов. Назовем такой метод вставления элемента в множество

доблист( Д, X, Д1)

Правила добавления элемента на уровне листьев таковы:

• Результат добавления элемента X к пустому дереву есть дерево

дер( nil, X, nil)
.

• Если X совпадает с корнем дерева Д, то Д1 = Д (в множестве не допускается дублирования элементов).

• Если корень дерева Д больше, чем X, то X вносится в левое поддерево дерева Д; если корень меньше, чем X, то X вносится в правое поддерево.

На рис. 9.10 показана соответствующая программа.

Теперь рассмотрим операцию удалить. Лист дерева удалить легко, однако удалить какую-либо внутреннюю вершину — дело не простое. Удаление листа можно на самом деле определить как операцию, обратную операции добавления листа:

удлист( Д1, X, Д2) :-

 доблист( Д2, X, Д1).

Рис. 9.11. Удаление X

из двоичного справочника. Возникает проблема наложения "заплаты" на место удаленного элемента X.

К сожалению, если X — это внутренняя вершина, то такой способ не работает, поскольку возникает проблема, иллюстрацией к которой служит рис. 9.11. Вершина X имеет два поддерева

Лев
и
Прав
. После удаления вершины X в дереве образуется "дыра", и поддеревья
Лев
и
Прав
теряют свою связь с остальной частью дерева. К вершине А оба эти поддерева присоединить невозможно, так как вершина А способна принять только одно из них.

Если одно из поддеревьев Лев и Прав пусто, то существует простое решение: подсоединить к А непустое поддерево. Если же оба поддерева непусты, то можно использовать следующую идею (рис. 9.12): если самую левую вершину Y поддерева

Прав
переместить из ее текущего положения вверх и заполнить ею пробел, оставшийся после X, то упорядоченность дерева не нарушится. Разумеется, та же идея сработает и в симметричном случае, когда перемещается самая правая вершина поддерева
Лев
.

Рис. 9. 2. Заполнение пустого места после удаления X.

На рис. 9.13 показана программа, реализующая операцию удаления элементов в соответствии с изложенными выше соображениями. Основную работу по перемещению самой левой вершины выполняет отношение

удмин( Дер, Y, Дер1)

Здесь Y — минимальная (т.е. самая левая) вершина дерева

Дер
, а
Дер1
 — то, во что превращается дерево
Дер
после удаления вершины Y.

Существует другой, элегантный способ реализация операции добавить и удалить. Отношение добавить можно сделать недетерминированным в том смысле, что новый элемент вводится на произвольный уровень дерева, а не только на уровень листьев. Правила таковы:

Для того, чтобы добавить X в двоичный справочник Д, необходимо одно из двух:

• добавить X на место корня дерева (так, что X станет новым корнем) или

• если корень больше, чем X, то внести X в левое поддерево, иначе — в правое поддерево.

уд( дер( nil, X, Прав), X, Прав).

уд( дер( Лев, X, nil), X, Лев).

уд( дер( Лев, X, Прав), X, дер( Лев,Y, Прав1) ) :-

 удмин( Прав, Y, Прав1).

уд( дер( Лев, Кор, Прав), X, дер( Лев1, Кор, Прав) ) :-

 больше( Кор, X),

 уд( Лев, X, Лев1).

уд( дер( Лев, Кор, Прав), X, дер( Лев, Кор, Прав1) ) :-

 больше( X, Кор),

Поделиться:
Популярные книги

Вечный. Книга VI

Рокотов Алексей
6. Вечный
Фантастика:
рпг
фэнтези
5.00
рейтинг книги
Вечный. Книга VI

Темный Лекарь 4

Токсик Саша
4. Темный Лекарь
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Темный Лекарь 4

Тринадцатый II

NikL
2. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Тринадцатый II

Наследник павшего дома. Том III

Вайс Александр
3. Расколотый мир
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Наследник павшего дома. Том III

Я тебя верну

Вечная Ольга
2. Сага о подсолнухах
Любовные романы:
современные любовные романы
эро литература
5.50
рейтинг книги
Я тебя верну

Релокант. По следам Ушедшего

Ascold Flow
3. Релокант в другой мир
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Релокант. По следам Ушедшего

Темный Патриарх Светлого Рода 2

Лисицин Евгений
2. Темный Патриарх Светлого Рода
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Темный Патриарх Светлого Рода 2

Безнадежно влип

Юнина Наталья
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Безнадежно влип

Законы Рода. Том 9

Flow Ascold
9. Граф Берестьев
Фантастика:
городское фэнтези
попаданцы
аниме
дорама
фэнтези
фантастика: прочее
5.00
рейтинг книги
Законы Рода. Том 9

Провинциал. Книга 8

Лопарев Игорь Викторович
8. Провинциал
Фантастика:
боевая фантастика
космическая фантастика
аниме
5.00
рейтинг книги
Провинциал. Книга 8

Страж Кодекса. Книга II

Романов Илья Николаевич
2. КО: Страж Кодекса
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Страж Кодекса. Книга II

Законы Рода. Том 8

Flow Ascold
8. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Законы Рода. Том 8

Прометей: владыка моря

Рави Ивар
5. Прометей
Фантастика:
фэнтези
5.97
рейтинг книги
Прометей: владыка моря

Войны Наследников

Тарс Элиан
9. Десять Принцев Российской Империи
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Войны Наследников