
- •Содержание
- •Введение
- •Структуры данных Классификация структур данных
- •Операции над данными
- •Понятие алгоритма
- •Массивы Описание массива
- •Представление массивов в памяти
- •Рис 1. Представление вектора в памяти
- •Рис 2. Представление вектора ml в памяти
- •Алгоритмы поиска
- •Алгоритмы сортировки
- •Пример сортировки простыми вставками.
- •Описание записи
- •Операции над записями
- •Записи с вариантами
- •Представление записи в памяти
- •Общие процедуры и функции для работы с файлами
- •Процедуры и функции для работы с типизированными файлами.
- •Сортировка содержимого файлов (Внешняя сортировка)
- •Пример внешней сортировки прямым слиянием
- •Пример внешней сортировки естественным слиянием
- •Динамическая память и данные с динамической структурой
- •Ссылочный тип в языке Pascal
- •Типизированные указатели
- •Нетипизированные указатели
- •Операции над переменными ссылочного типа.
- •Динамические списки
- •Реализация списков на языке Pascal.
- •Стек, очередь, дек
- •Рекурсия
- •Нелинейные структуры данных. Деревья
- •Бинарные деревья
- •Реализация бинарных деревьев
- •Способы обхода бинарных деревьев
- •Сортировка с прохождением бинарного дерева
Рекурсия
Рекурсивное объявление объекта подразумевает определение объекта частично или полностью через (с помощью) этот объект.
Пример: факториал —
или
— рекурсивное объявление.
Рекурсия — это такой способ организации процесса, при котором подпрограмма, в ходе выполнения составляющих её операторов, обращается к самой себе. Обращение может быть прямое или косвенное.
Рекурсия | |||
прямая |
косвенная | ||
Внутри подпрограммы вызывается эта же подпрограмма. |
Подпрограмма обращается к себе через другие подпрограммы. | ||
Procedure A; Begin … A; … End; |
Procedure A; Begin … A; … End; |
Procedure B; Begin … C; … End; |
Procedure C; Begin … A; … End; |
Рекурсия обеспечивается за счет того, что память под локальные переменные подпрограмм резервируется в стеке.
Главное требование к рекурсивным подпрограммам: в них обязательно должна присутствовать проверка завершения рекурсивного вызова.
Структура конечного рекурсивного алгоритма:
If {условие}
Then {действия, не содержащие рекурсивного вызова}
Else {действия с рекурсивным вызовом}
Вычисление факториал:
Function fact1(n: byte):integer; Begin If n=0 then f:=l else for i:=l to n do f:=f*i; Fact1:=f; End; |
Function fact2(n: byte):integer; Begin If n=0 then fact2:=l else fact:=fact(n-l)*n; End; |
Числа Фибоначчи —
это элементы числовой последовательности
1 ,1, 2, 3, 5, 8, …, в
которых каждый последующий элемент
равен сумме предыдущих:
,
где
и
.
function fibonacci( N : integer): integer;
begin
if
then
fibonacci:=1
else
fibonacci:=fibonacci(N-l)+fibonacci(N-2);
end;
Точных правил для выбора между рекурсивной и нерекурсивной версиями алгоритма решения задачи не существует. Краткость и выразительность большинства рекурсивных процедур упрощает их чтение и сопровождение. С другой стороны, выполнение рекурсивных процедур требует больших затрат и памяти, и времени процессора нежели их итерационные аналоги.
Нелинейные структуры данных. Деревья
Дерево — это иерархическая структура, состоящая из узлов (вершин) и соединяющих их дуг (ветвей). В каждый узел кроме одного (который называется корнем дерева) ведет ровно одна дуга.
Т.о. дуги ведут к узлам дерева. Можно также сказать, что дуги ведут к частям дерева, которые сами являются деревьями.
Рекурсивное определение дерева: Дерево - это либо пустая структура, либо узел, связанный дугами с конечным числом деревьев (поддеревьев).
Рекурсивное и нерекурсивное определения дерева равносильны, но из второго можно извлечь много полезных алгоритмов.
Вершина Y, находящаяся непосредственно ниже вершины X, называется потомком X, а вершина X - предком Y.
Считается, что корень дерева находиться на 0 уровне, непосредственные потомки корня на 1 уровне и т.д. максимальный уровень какой-нибудь из вершин дерева - глубина дерева.
Если вершина не имеет потомка, то её называют листом, а любую вершину, не лист, - внутренней вершиной.
Степень вершины - это число непосредственных потомков вершины. Максимальная степень из степеней всех вершин - степень дерева.
Число ветвей, которые нужно пройти от корня до вершины - длина пути. Путь к корню равен 0.
Вершина, находящаяся на уровне i имеет путь i. Длина пути всего дерева - сумма длин путей всех его вершин.
Упорядоченное дерево - это дерево, у которого ветви (дуги, ребра), исходящие из каждой вершины, упорядочены.
Различают два типа деревьев: бинарные и сильноветвящиеся.
В бинарном дереве из каждой вершины выходит не более двух дуг. В сильноветвящемся дереве количество дуг может быть произвольным.
Логическое представление и изображение деревьев
Имеется ряд способов графического изображения деревьев.
Метод вложенных скобок
Примеры деревьев в жизни: генеалогическое дерево; книга, разбитая на главы, разделы, подразделы.
Рис. 10. Представление дерева: а)- исходное дерево, б)- оглавление книг
Блоки программ составляют дерево, дуги которого означают вложенность. Взаимная вложенность операторов цикла, условных операторов, составных, - все это деревья. Даже арифметические выражения - деревья, в узлах которых операции.
Деревья используются также для хранения и поиска информации.
Особо важную роль играют деревья 2-ой степени - бинарные деревья.
Далее будем рассматривать только бинарные деревья.