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

        внутри( а, Т)

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

        внутри( 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),

Вы читаете Prolog
Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату