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

Неизвестно

Шрифт:

встав( Дер, X, НовДер).

Здесь НовДер– результат вставления элемента Х в Дер. Деревья Дер и НовДер имеют одну и ту же глубину. Разумеется, не всегда возможно сохранить ту же глубину дерева. Поэтому существует еще одно отношение с пятью аргументами специально для этого случая:

встав( Дер, X, НДа, Mб, НДб).

Имеется в виду, что при вставления Х в Дер дерево Дер разбивается на два дерева НДа и НДб, имеющих ту же глубину, что и Дер. Мб– это минимальный элемент из НДб. Пример показан на рис. 10.4.

Рис. 10. 4. Объекты, показанные на рисунке, удовлетворяют отношению встав( Дер, 6, НДа, Мб, НДб).

2-3 деревья мы будем представлять в программе следующим образом:

nil представляет пустое дерево;

л( Х) представляет дерево, состоящее из одной вершины - листа с элементом X;

в2( Д1, М, Д2) представляет дерево с двумя поддеревьями Д1 и Д2; М - минимальный элемент из Д2;

в3( Д1, М2, Д2, М3, Д3) представляет дерево с тремя поддеревьями Д1, Д2 и Д3; М2 - минимальный элемент из Д2; М3 - минимальный элемент из Д3; Д1, Д2 и Д3 - 2-3 деревья.

Между доб23 и встав существует следующая связь: если после вставления нового элемента дерево не "вырастает", то

доб23( Дер, X, НовДер) :-

встав( Дер, X, НовДер).

Однако если после вставления элемента глубина дерева увеличивается, то встав порождает два поддерева Д1 и Д2, а затем составляет из них дерево большей глубины:

доб23( Дер, X, в2( Д1, М, Д2) ) :-

встав( Дер, X, Д1, М, Д2).

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

Случай а

встав( в2( Д1, М, Д2), X, в2( НД1, М, Д2) ) :-

больше( М, X), % М больше, чем Х

встав( Д1, X, НД1).

Случай b

встав( в2( Д1, M, Д2), X, в3( НД1а, Мб, НД1б, M, Д2) ) :-

больше( М, X),

встав( Д1, X, НД1а, Мб, НД1б).

Случай с

встав( в3( Д1, М2, Д2, М3, Д3), X, в2( НД1а, Мб, НД1б), М2, в2(Д2, М3, Д3) ) :-

больше( М2, X),

встав( Д1, X, НД1а, Мб, НД1б).

Рис. 10. 5. Некоторые из случаев работы отношения встав.

(a) встав( в2( Д1, М, Д2), X, в2( НД1, М, Д2) );

(b) встав( в2( Д1, М, Д2), X,

в3( НД1а, Мб, НД1б, М, Д2) );

(c) встав( в3( Д1, М2, Д2, М3, Д3), X,

в2( НД1а, Мб, НД1б), М2, в2( Д2, М3, Д3) ).

% Вставление элемента в 2-3 справочник

доб23( Дер, X, Дер1) :- % Вставить Х в Дер, получить Дер1

встав( Дер, X, Дер1). % Дерево растет вширь

доб23( Дер, X, в2( Д1, М2, Д2) ) :-

встав( Дер, X, Д1, М2, Д2). % Дерево растет вглубь

доб23( nil, X, л( Х) ).

встав( л( А), X, л( А), X, л( Х) ) :-

  • Читать дальше
  • 1
  • ...
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • ...

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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