AlgStr / Практические занятия / Практическая работа1
.docПрактическая работа
Тема: Спецификация и реализация нелинейных структур данных(деревья)
Понятие деревьев возникает там, где необходимо произвести классифика-цию. Деревья возникают при описании дерева игры в шахматы, игра в Х и 0 и т.д.
Деревья важны для хранения информации, для представления таблиц. Неотъемлемой частью дерева является рекурсивность. Деревья легко обрабатывать с помощью рекурсивных процедур.
Деревья состоят из узлов, узлы деревьев тяжело нарисовать в виде линейной структуры. Линейный список-это частный случай дерева. У дерева есть корень и поддеревья.
Можно выделить такие понятия: степень, ранг узла, узел разветвления, уровень дерева, регулярное дерево, точка роста, пустое дерево (NIL), высота дерева, ширина дерева (количество узлов на самом широком уровне).
Описать эти понятия.
По дереву необходимо ходить с корня. О деревьях можно говорить про упорядоч. деревьях. В памяти упорядоченных деревьев есть понятие леса. Вся эта терминология идет из генеологического дерева. Существует два вида таких деревьев:
-родословная (показывает прородителей данного узла)
Чарльз
Елизавета V Филипп
мама папа
Елизавета Георгий IV
Филипп
Если дерево упорядоченное, то левая ветвь женская, правая-мужская. Д.родословная может быть и не деревом.
-родовая схема (показывает потомков данного лица)
Гомер
Иофет
Ной
Хам Это уже дерево истинное
Сим
Человек придумал много возможностей изображения дерева
I.
II.
III. A IV. (A(B(H)(S’))(c(D)(E)(G))(F)))
B V. ABH. J..CD. EG..F...
H
J
C
D
E
VI.Десятинная система обозначений Дьюи
1. A-вся библиотека
1.1. B-раздел. литературы
1.1.1.H-раздел кубинской литературы
1.1.2. J-раздел китайской литературы
1.2.C- научная литература
1.2.1. D
1.2.2. E
1.2.2.1. G
Эта система используется для структур библиотеки и книги.
Например: матрицу можно представить в виде дерева
А
А[1] A[2] A[n]
A[1,1] A[1,2] ...
Алгеброические файлы перед тем, как происходит компиляция, тоже строятся деревья
a-b*(c/d+c/f)
5 4 3 1 2
Наиболее важными являются бинарные деревья.
Определение: бинарное дерево-это либо пусто,либо корень и два поддерева (левое и правое). Бинарное дерево является ориентированным.
Для непустого бинарного поддерева выполняется для всех узлов бинарного дерева все ключи левого поддерева меньше в некотором смысле ключа корня. Корня< ключа правого поддерева.
Бинарные деревья называются деревьями поиска и являются самыми простыми деревьями поиска.
Преобразование произвольного дерева в двоичное (в котором в узле не более 2-х сыновей)
Пример:
I.
Пол
II.Функциональное описание-описание поведения данной абстракции
Алгеброическая спецификация дерева:
TREE_T_SPEC
introduces
NEW: TREE (пустая константа создает пустое дерево)
Левое под правое
construct: T,TREE_T,TREE_T TREE_T
аргум контруктора узла
IS_EMPTY: TREE_T BOOL //пустое или нет
ROOT:TREE_T T //выдел.корень
LEFT:TREE_T T_TREE //взятие левого поддерева
RIGTH:TREE_T T_TREE //взятие правого поддерева
constreins New,construct,IS_EMPTY //перечисление всех операций
so that //такая что
generated by [NEW,construct] //перечислены базовые
конструкторы
portition by [IS_EMPTY,ROOT,LEFT,RIGHT] // как можна разделить дерево
на части
for all [t:T,ltree,rtree:TREE_T]
опис. типы
переменные
1) IS_EMPTY(NEW) TRUE
2) IS_EMPTY (construct(t,ltree,rtree)) FALSE
3) ROOT (NEW) ошибка // у пустого дерева нельзя
выделить корень
набор 4) ROOT(construct(t,ltree,rtree)=t //если я создал поддерево с правым
аксиом . и левым поддер., то корень t
.
.
формальным образом описано дерево
III. Логическое описание-представление нового понятия за счет
существующих
Типы:
TREE_T=(пустое/непустое)
Непустое =(корень:T;
левое_ПД: TREE_T;
правое ПД: TREE_T)
Алгоритм: NEW TREE_T
NEW Пустое
IV.Физическое представление
Будем рассматривать 3 способа физического представления:
1.Сплошное представление на базе адресной арифметики
1
2 3 4 5 6 7
Левого сына узла с индексом к запишется в 2к , а правого-в узла (2*к+1).
Как имея узел к, узнать родителя-взять [k/2] (на цело)
2.На основе массива узлов (указатель-это индекс)
ROOT
Key left right 1
And 0 0 2
End 0 3 3
For 5 6 4
Begin 1 2 5
For 0 0 6
Or 0 0
Преимущество: указатель 4 байта, а индекс-2 байта.
3.На основе полных указателей:
type
PTREE=^TREENode;
TREENode=record
key:Keytype ;
info:infotype;
left,right:PTREE;
end
Демонстрация представления (для лаб.раб)
Необходимы следующие понятия:
Полное дерево-дерево,у которого все точки роста находятся на последнем уровне.
Точка роста-указатель, у которой равен NIL.
Пример: , ,
не полное полное
Таким образом полное дерево-это дерево вида , в степени 2к-1
Полное дерево очень мало, вводим понятия.
Трехуровневое дерево- у которого все точки роста находятся на 2х последних уровнях.
Подровненное дерево-(сбалансированное по высоте дерево)(АВЛ-дерево)-для каждого узла высоты левого и правого поддеревьев отличаются не больше, чем на 1.
Самое плохое подровненное дерево-это дерево Фибоначчи.
F0 F1 F2 F2 F3
F0 F1 F2 F1