Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
вот оно.docx
Скачиваний:
6
Добавлен:
25.09.2019
Размер:
1.75 Mб
Скачать

40Таблицы

Общие сведения

В настоящее время очень широко используются автоматизировнныеинформационные системы (АИС). Их назначение: хранение большого числа

сведений, прием новых сведений и выдача хранимых сведений по запросам.

Обычно сведения предоставляются записями.

Основная задача при создании АИС – организация выдачи по запросу любой из записей, независимо от того, какая запись выдавалась перед ней.

Недостаток: усложняется процедура включения новой записи в таблицу.

Однонаправленный список с отдельным хранением текста записиИспользуется для ускорения поиска записи. Тексты записей хранятся отдельно от ключей. При ключе хранится только ссылка на текст записи. Схематическоепредставлениетаблицы в видесписка с отдельным хранением текста записи имеет вид, который представляет рисунок 7.17.

Представление в виде массива

Каждый элемент таблицы является записью, содержащей два поля – ключ записи и ссылку на текст записи. Такие элементы обьединяются не в список, а в одномерный массив.

Пример 7.19.

Объявления типа таблицы при использовании таблицы записей содержащих два поля – ключ записи и ссылку на текст записи.

Type

Index = 1..N;

Text = <Тип_текста_записи>; Adr = ^Text;

Element = Record

Kl: Integer; {Ключ}

Adrzap: Adr

End;

Mas = Array [Index] Of Element; Var

Tabl: Mas;

Берется средний элемент массива с индексом (номером) N/2. Если

искомый ключ К меньше чем ключ в элементе с номером N/2, то требуемый элемент находится в первой половине массива, в противном случае – во второй.

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

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

Так как на каждом шаге зона поиска уменьшается в два раза, то для завершения поиска требуется не более 1 + log2 N шагов. Таким образом, эффект способа по сравнению со способами 1 и 2 быстро возрастает с ростом N.

Пример 7.20.

Логическая функция поиска нужного ключа в таблице реализующая метод дихотомического поиска. Функция Poisk возвращает

значение True, если нужный ключ в таблице есть, и False в противном случае. Функция Poisk имеет два параметра: К – искомый ключ, Nomer – номер элемента массива Tabl, в котором хранится нужный ключ К (в параметр- переменную Nomer функция устанавливает значение индекса (номера элемента) массива Tabl, содержащего нужный ключ).

Пусть имеется объявление по примеру 7.19.

Function Poisk (K: Integer; Var Nomer: Index): Boolean;

Var

Lev, Prav: Integer;

B: Boolean; I: I ndex;

Begin

Lev := 1; Prav := N; B := False;

Nomer := 0;

Repeat

I := (Lev + Prav) Div 2; If K = Tabl[I].Kl Then

Begin

B := True;

Nomer := I End

Else

If K < Tabl[I].Kl Then Prav := I - 1

Else Lev := I+1

Until B Or (Lev > Prav);

Poisk := B

End;

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

41 Структура двоичного дерева

Схематично двоичное дерево можно представить как набор вершин, соедененных стрелками (ветвями, рисунок 7.19).

Из каждой вершины выходит не более двух ветвей, направленных влево-

вниз или вправо-вниз. В каждую вершину, помимо одной, входит одна стрелка. Вершина, в которую не входит ни одна стрелка, называется корнем дерева. Вершины, из которых не выходит ни одна стрелка, называются листьями.

При представлении таблицы в виде дерева тексты записей хранятся отдельно. Каждая вершина дерева (звено) является записью, состоящей из четырех полей: ключа записи (Kl), ссылки на вершину влево-вниз (Lev), ссылки

на вершину вправо-вниз (Prav) и ссылки на текст записи (*). Данную структуру звена представляет рисунок 7.20.

Построение дерева

Принцип построения дерева заключается в следующем.

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

заданным ключом, реализованным в примере 7.23. Такая вершина найдена, если В = False. В этом случае в Rez находится адрес вершины, к которой можно подсоединить включаемую вершину.

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

Пусть имеется объявление по примеру 7.22.

Пример 7.24.

Процедура включения записи в дерево. Параметры процедуры: К - ключ,

D - адрес корня дерева, Zap - текст вставляемой записи.

Procedure Vkl (K: Integer; Var D: Adrzv; Zap: Tekst);

Var Q, S: Adrzv; T: Adrt;

Begin

If Not Poisk (K, D, Q) Then

Begin

New (T); T^ := Zap; New (S);

S^.Kl := K; S^.Adr := T;

S^.Lev := Nil;

S^.Prav := Nil;

If D = Nil Then D := S

Else

If K < Q^.Kl

Then

Q^.Lev := S Else

Q^.Prav := S

End

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

Пример 7.22.

Описание двоичного дерева.

Type

Tekst = <Тип_значения_записи>; Adrt = ^Tekst;

Adrzv = ^Zveno; Zveno = Record

Kl:I nteger;

Lev, Prav: Adrzv; Adr: Adrt

End;

Var

Dvder: Adrzv;