Вход/Регистрация
Prolog
вернуться

Неизвестно

Шрифт:

В этом представлении дерево рис. 9.4 выглядит как

дер( дер( nil, b, nil), a,

дер( дер( nil, d, nil), с, nil) ).

Теперь рассмотрим отношение принадлежности, которое будем обозначать внутри. Цель

внутри( X, Т)

истинна, если Х есть вершина дерева Т. Отношение внутри можно определить при помощи следующих правил:

Х есть вершина дерева Т, если

корень дерева Т совпадает с X, или

Х - это вершина из левого поддерева, или

Х - это вершина из правого поддерева.

Рис. 9. 5. Представление двоичных деревьев.

Эти правила непосредственно транслируются на Пролог следующим образом:

внутри( X, дер( -, X, -) ).

внутри( X, дер( L, -, -) ) :-

внутри( X, L).

внутри( X, дер( -, -, R) ) :-

внутри( X, R).

Очевидно, что цель

внутри( X, nil)

терпит неудачу при любом X.

Посмотрим, как ведет себя наша процедура. Рассмотрим рис. 9.4. Цель

внутри( X, Т)

используя механизм возвратов, находит все элементы данных, содержащиеся в множестве, причем обнаруживает их в следующем порядке:

Х = а; Х = b; Х = с; X = d

Теперь рассмотрим вопрос об эффективности. Цель

внутри( а, Т)

достигается сразу же после применения первого предложения процедуры внутри. С другой стороны, цель

внутри( d, Т)

будет успешно достигнута только после нескольких рекурсивных обращений. Аналогично цель

внутри( е, Т)

потерпит неудачу только после того, как будет просмотрено все дерево в результате рекурсивного применения процедуры внутри ко всем поддеревьям дерева Т.

В этом последнем случае мы видим такую же неэффективность, как если бы мы представили множество просто списком. Положение можно улучшить, если между элементами множества существует отношение порядка. Тогда можно упорядочить данные в дереве слева направо в соответствии с этим отношением.

Рис. 9. 6. Двоичный справочник. Элемент 6 найден после прохода по отмеченному пути 5-->8-->6.

Будем говорить, что непустое дерево дер( Лев, X, Прав) упорядочено слева направо, если

(1) все вершины левого поддерева Лев меньше X;

(2) все вершины правого поддерева Прав больше X;

(3) оба поддерева упорядочены.

Будем называть такое двоичное дерево двоичным справочником. Пример показан на рис. 9.6.

Преимущество упорядочивания состоит в том, что для поиска некоторого объекта в двоичном справочнике всегда достаточно просмотреть не более одного поддерева. Экономия при поиске объекта Х достигается за счет того, что, сравнив Х с корнем, мы можем сразу же отбросить одно из поддеревьев. Например, пусть мы ищем элемент 6 в дереве, изображенной на рис. 9.6. Мы начинаем с корня 5, сравниваем 6 с 5, получаем 6 > 5. Поскольку все элементы данных в левом поддереве должны быть меньше, чем 5, единственная область, в которой еще осталась возможность найти элемент 6, - это правое поддерево. Продолжаем поиск в правом поддереве, переходя к вершине 8, и т.д.

Общий метод поиска в двоичном справочнике состоит в следующем:

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

если Х - это корень справочника Д, то считать, что Х уже найден, иначе

если Х меньше, чем корень, то искать Х в левом поддереве, иначе

искать Х в правом поддереве;

если справочник Д пуст, то поиск терпит неудачу.

Эти правила запрограммированы в виде процедуры, показанной на рис. 9.7. Отношение больше( X, Y), означает, что Х больше, чем Y. Если элементы, хранимые в дереве, - это числа, то под "больше, чем" имеется в виду просто Х > Y.

Существует способ использовать процедуру внутри также и для построения двоичного справочника. Например, справочник Д, содержащий элементы 5, 3, 8, будет построен при помощи следующей последовательности целей:

?- внутри( 5, Д), внутри( 3, Д), внутри( 8, Д).

Д = дер( дер( Д1, 3, Д2), 5, дер( Д3, 8, Д4) ).

Переменные Д1, Д2, Д3 и Д4 соответствуют четырем неопределенным поддеревьям. Какими бы они ни были, все равно дерево Д будет содержать заданные элементы 3, 5 и 8. Структура построенного дерева зависит от того порядка, в котором указываются цели (рис. 9.8).

  • Читать дальше
  • 1
  • ...
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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