Назад | Содержание| Вперёд Глава 10 УСОВЕРШЕНСТВОВА...

Назад | Содержание| Вперёд

Глава 10

УСОВЕРШЕНСТВОВАННЫЕ МЕТОДЫ

ПРЕДСТАВЛЕНИЯ МНОЖЕСТВ ДЕРЕВЬЯМИ

В данной главе мы рассмотримусовершенствованные методы представлениямножеств при помощи деревьев. Основная идеясостоит в том, чтобы поддерживатьсбалансированности или приближеннуюсбалансированность дерева, с тем чтобы избежатьвырождения его в список. Механизмы балансировкидеревьев гарантируют, даже в худшем случае,относительно быстрый доступ к элементам данных,хранящихся в дереве, при логарифмическом порядкевремени доступа. В этой главе изложено два такихмеханизма: двоично-троичные (кратко, 2-3) деревья иAVL-деревья. (Для изучения остальных главпонимание данной главы не обязательно.)

10. 1.    Двоично - троичные справочники

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

Рис. 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,л( Х) ) :-

               больше( X, А).

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

               больше( А, X).

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

               в3( Д1, М2, НД2, М3, Д3) ) :-

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

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

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

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

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

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

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

               в3( Д1, М2, Д2, М3, НД3) ) :-

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

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

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

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

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

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

Рис. 10. 6.  Вставлениеэлемента в 2-3 справочник. В этой

программе предусмотрено, что попыткаповторного

вставления элемента терпит неудачу.

Программа для вставления нового элемента в 2-3справочник показана полностью на рис. 10.6. На рис.10.7 показана программа вывода на печать 2-3деревьев.

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

        встав2( Дер, X,Деревья)

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

        Деревья = [ НовДер], есливстав( Дер, X, НовДер)

        Деревья = [ НДа, Мб, НДб],

        если встав( Дер, X, НДа,Мб, НДб)

Теперь отношение доб23 можнопереопределить так:

        доб23( Д, X, Д1) :-

               встав( Д, X, Деревья),

               соединить( Деревья, Д1).

Отношение соединить формирует однодерево Д1 из деревьев, находящихся в списке Деревья.

Упражнения

10. 1.    Определите отношение

        внутри( Эдем, Дер)

для поиска элемента Элем в 2-3справочнике Дер.

Посмотреть ответ

10. 2.    Введите в программу рис.10.6 изменения для устранения лишних возвратов(определите отношения встав2 и соединить).

%  Отображение 2-3 справочников

        отобр(Д) :-                                                                                                       15

            отобр( Д, 0).                                                                                           --

        отобр( nil, _ ).                                                                                          15

        отобр( л(А), Н) :-                                                                                      --

               tab( H), write( A), nl.                                                                             13

        отобр( в2( Д1, М, Д2), Н):-                                                                --

               H1 is H + 5                                                                                     13

               отобр( Д2, H1),                                                                             --

               tab( H), write( --), nl,                                                                             12

               tab( H), write( M), nl,                                                                         --

               tab( H), write( --), nl,                                                                       12

               отобр( Д1, H1).                                                                                       10

        отобр( в3( Д1, M2, Д2, М3,Д3), H) :-                                                      10

               H1 is H + 5                                                                                           --

               отобр( Д3, H1),                                                                                        8

               tab( H), write( --), nl,                                                    --

               tab( H), write( M3), nl,                                                  8

               отобр( Д2, H1),                                                              --

               tab( H), write( M2), nl,                                                                             7

               tab( H), write( --), nl,                                                                         --

               отобр( Д1, H1).                                                                                    7

                                                                                                                                --

                          (a)                                                                                                    5

                                                                                                                          --                                                                                                                            5

                                                                                                                          --

                                                                                                                                      4

                                                                                                                                --

                                                                                                                                4

                                                                                                                                      3

                                                                                                                                3

                                                                                                                                --

                                                                                                                                       1

                                                                                                     (б)

Рис. 10. 7.    (а)  Программа для отображения 2-3 справочника.

(b)   Справочник (см. рис. 10.2), отпечатанныйэтой программой.

Назад | Содержание| Вперёд









Главная | В избранное | Наш E-MAIL | Добавить материал | Нашёл ошибку | Наверх