- •64 Жегуло а.И. Компьютерные науки 2-й семестр 2011-2012 гг. Компьютерные науки Лекции для студентов 1 курса мехмата, 2011-2012 уч. Г.
- •2 Семестр
- •16.Модули
- •16.1.Модуль и модульное программирование
- •16.2.Структура модуля
- •Interface //Раздел интерфейса
- •Implementation //Раздел реализации
- •Initialization //Раздел инициализации
- •Пример модуля и его использования
- •Interface //Раздел интерфейса
- •Implementation //Раздел реализации
- •Заголовок модуля
- •Раздел интерфейса interface
- •Раздел реализации implementation
- •Раздел инициализации initialization
- •16.4.Использование объявленных в модуле объектов
- •17.Файлы
- •17.1.Файлы. Классификация файлов
- •17.2.Организация работы с файлами
- •17.3.Подпрограммы для работы с файлами любых типов Связывание файловой переменной с файлом
- •Запись в файл
- •17.5.Обработка ошибок ввода-вывода
- •17.6.Текстовые файлы
- •17.6.1.Структура текстового файла
- •17.6.2.Особенности открытия текстовых файлов
- •17.6.3.Особенности чтения и записи для текстовых файлов
- •17.6.7.Поэлементная обработка текстовых файлов, состоящих из строковых значений и чисел
- •17.7.Типизированные файлы
- •17.7.1.Описание и структура типизированного файла
- •17.7.5.Сравнение текстовых и типизированных файлов
- •17.7.6.Пример работы с типизированными файлами из записей
- •18.Процедурные типы
- •18.1.Назначение процедурных типов
- •18.2.Описание процедурных типов и процедурных переменных
- •18.3.Присваивание процедурным переменным. Вызов подпрограмм через процедурные переменные
- •18.4.Процедурные переменные в качестве параметров
- •19.Рекурсия
- •19.1.Что такое рекурсия
- •19.2.Рекурсивные подпрограммы
- •19.3.Прямая и косвенная рекурсия
- •19.4.Предварительное (опережающее) описание подпрограммы
- •19.5.Опасности рекурсии
- •19.5.1.Бесконечная рекурсия
- •19.5.2.Глубокая рекурсия
- •19.5.3.Итерация и рекурсия, необоснованное применение рекурсии
- •19.6.Когда использовать рекурсию
- •19.7.Формы рекурсивных подпрограмм
- •19.8.Примеры рекурсивных программ
- •19.8.1.Вывод цифр целого числа в прямом порядке
- •19.8.2.Поиск максимального элемента массива
- •19.9.Задача о Ханойских башнях
- •20.Указатели
- •20.1.Указательные типы
- •Описание типизированного указателя
- •20.2.Операции с указателями
- •20.3.Примеры присваивания для указателей
- •20.4.Статические и динамические переменные
- •Создание новой динамической переменной базового типа и установка на нее указателя
- •Уничтожение динамической переменной, на которую ссылается указатель
- •Проблема потерянных ссылок
- •21.Динамические структуры данных
- •21.1.Данные статической структуры и данные динамической структуры
- •21.2.Односвязные линейные списки
- •21.2.1.Структура односвязного линейного списка
- •Вставка элемента после заданного элемента
- •21.3.Стеки
- •21.3.1.Реализация стека через односвязный линейный список
- •21.3.2.Применение стеков
- •21.3.3.Реализация стека на основе массива
- •21.4.Деревья
- •21.4.1.Основные определения
- •Алгоритм построения идеально сбалансированного дерева
- •21.4.3.Способы обхода дерева
- •Деревья поиска
- •Построение дерева поиска
21.3.3.Реализация стека на основе массива
Реализуем стек на одномерном целочисленном массиве AS длины nAS. Указатель на вершину стека Top может принимать значения в диапазоне 0..nAS. Стек пуст, когда Top=0.
const nAS=100;
var Top: 0..nAS;
AS:array[1..nAS] of integer;
procedure DoTop;
begin Top := 0
end;
function Empty:boolean;
begin Result:=(Top=0)
end;
procedure Push (i: integer);
begin
Top:=Top+1;
AS[Top]:=i;
end;
function Pop: integer;
begin
Result:=AS[Top];
Top:=Top-1;
end;
21.4.Деревья
21.4.1.Основные определения
Дерево – это совокупность элементов, называемых узлами (при этом один из них определен как корень), и отношений (родитель–сын), образующих иерархическую структуру узлов.
Рекурсивное определение дерева: Дерево – это либо пустая структура, либо узел, с которым связано конечное число деревьев, называемых поддеревьями.
Тип узла называется базовым типом дерева.
Примеры деревьев: файловая система, словарь, календарь, структура университета.
Виды узлов дерева:
Предок узла y – это узел, из которого исходит дуга, заходящая в узел y.
Потомок узла x – это узел, в который заходит дуга, исходящая из узла x.
Корень дерева – узел, не имеющий предков.
Терминальный узел (или лист) – узел, не имеющий потомков.
Нетерминальные (внутренние) узлы – все узлы, кроме корня и терминальных узлов.
Уровни дерева:
Корень дерева расположен на уровне 0.
Если узел X находится на уровне i, то его потомок Y – на уровне i+1.
Глубина (высота) дерева – максимальный уровень из уровней всех узлов.
Степени узлов дерева:
Степень узла – число непосредственных потомков узла.
Степень дерева – максимальная степень всех узлов.
Упорядоченным деревом называется дерево, у которого дуги, исходящие из каждого узла, упорядочены.
Это разные упорядоченные деревья
21.4.2.Бинарные деревья
Бинарное дерево – это упорядоченное дерево степени 2, где каждый узел связан с двумя бинарными деревьями, называемыми левым поддеревом и правым поддеревом.
Для краткости бинарные деревья будем называть просто «деревьями».
Представление бинарных деревьев
Узлы дерева будем размещать в динамической памяти. Для представления узла удобно использовать записи.
type Tinf=тип_информационой_части;
ref =^Node;
Node=record
inf:TInf; {информационная часть}
Left,Right:ref {ссылки на левое и правое поддерево}
end;
Базовый тип дерева – тип Node, являющийся записью. Тип ref – указатель на переменные типа Node.
Основные операции над деревьями
Создать пустое дерева.
Проверить, пусто ли дерево.
Добавить в дерево новый узел.
Найти заданный узел.
Удалить из дерева заданный узел.
Выполнить некоторую операцию над каждым узлом дерева. Для этого надо посетить все узлы дерева, или совершить обход дерева.
Уничтожить дерево и освободить динамическую память, которую занимало дерево.
Алгоритм построения произвольного дерева
Построить пустое дерево Root:=nil
Построить корень дерева: 2.1. Ввести данные для Inf корня 2.2. Заполнить узел new(t); t^.Inf:=данные; t^.Left:=nil; t^.Right:=nil
Повторять для всех остальных узлов: 3.1. Ввести данные для Inf узла 3.2. Заполнить узел 3.3. Подсоединить узел к дереву
Построение идеально сбалансированного дерева
Идеально сбалансированным деревом называется такое дерево, у которого для каждого узла количество узлов в левом и правом поддереве различается не более чем на 1.
Высота h идеально сбалансированного дерева из n узлов не превосходит log2n: h <= log2n
-
n
1
2, 3
4 .. 7
8 .. 15
16 .. 31
h
0
1
2
3
4
Поиск узла в идеально сбалансированном дереве занимает время порядка O(log2n). При добавлении и удалении узлов в таком дереве необходимо сохранять баланс дерева.