- •В.В. Чуркин технологии программирования
- •Содержание
- •Введение
- •Указатели. Операции над указателями Операции адресации и разыменования.
- •Арифметические операции.
- •Присваивание указателей.
- •Смещение и индексирование указателей.
- •Функции
- •Объявление функции (прототип)
- •Параметры функции
- •Встроенные функции
- •Функции с параметрами со значениями по умолчанию
- •Параметры функции main()
- •Рекурсивные функции
- •Перегрузка функций
- •Шаблоны функций
- •Указатели на функции
- •Объявление и инициализация массива указателей на функции:
- •Указатель на функцию как возвращаемое функцией значение
- •Выделение и освобождение динамической памяти
- •Символьные и строковые данные Символьные константы
- •Строковые константы (строки)
- •Символьные переменные
- •Строки – переменные
- •Специальные функции ввода-вывода строк
- •Стандартная библиотека функций языка с
- •Файлы Потоковый ввод-вывод в языке с Функции верхнего уровня файлового ввода-вывода
- •Открытие и закрытие потока
- •Текстовый режим
- •Бинарный режим
- •Закрытие файла
- •Функции в языке c для работы с файлами
- •Двоичный (бинарный) режим обмена с файлами
- •Строковый обмен с файлами
- •Форматный обмен с файлами
- •Позиционирование в потоке
- •Ввод-вывод нижнего уровня
- •Открытие / закрытие файла
- •Чтение и запись данных
- •Произвольный доступ к файлу
- •Позиционирование файлов
- •Сортировки числовых массивов Принцип наименьших привилегий
- •Обменная сортировка (SwapSort)
- •Сортировка выбором (SelectSort)
- •Пузырьковая сортировка (BubbleSort)
- •Сортировка вставками (InsertSort)
- •Быстрая сортировка (QuickSort)
- •Поиск в числовых массивах
- •Структуры
- •Форматы определения структурных типов
- •Форматы определения объектов структурных типов
- •Операции над объектами структурного типа
- •Доступ к элементам объектов структурного типа
- •Структуры, массивы и указатели
- •Объединения (смеси)
- •Оператор switch (переключатель)
- •Динамические структуры данных
- •Реализация стека с помощью массива
- •Очередь
- •Очередь приоритетов
- •Реализация очереди с помощью массива
- •Линейные списки
- •Функции для работы с двунаправленным линейным списком
- •Реализация списка с помощью массивов
- •Поиск хэшированием
- •Бинарные деревья
- •Бинарное упорядоченное дерево (дерево поиска)
- •Идеально сбалансированное дерево
- •Операции с бинарным упорядоченным деревом
- •Удаление узла из дерева
- •Обход (просмотр) дерева
- •Реализация дерева с помощью массивов
- •Вывод динамических структур в файл и чтение их из файла
- •Сбалансированные (avl) деревья
- •Алгоритм avl-вставки.
- •Повороты
- •Классы и объектно-ориентированное программирование
- •Объявление класса
- •Определение класса (реализация класса)
- •Использование класса (драйвер класса)
- •Доступ к элементам класса
- •Отделение интерфейса от реализации
- •Обслуживающие функции-утилиты
- •Конструкторы
- •Windows-программы в Builder
- •Структура головного файла проекта
- •Структура заголовочного файла модуля формы (“Unit1.H”)
- •Структура файла реализации модуля формы (“Unit1.Cpp”)
- •Области видимости (или области действия) переменных в блоках. Время жизни переменных
- •Доступ к свойствам и функциям-элементам (методам) объектов, переменным и функциям в приложении, содержащем одну форму
- •Константные объекты и константные функции-элементы
- •Перегрузка операций
- •Перегрузка унарных операций
- •Перегрузка бинарных операций
- •Перегрузка операции присваивания
- •Перегрузка операции приведения типа
- •Перегрузка операции индексирования []
- •Композиция классов
- •Дружественные функции класса
- •Дружественный класс
- •Использование указателя this
- •Статические элементы класса
- •Шаблон класса для статически и динамически создаваемых объектов
- •Конструктор 1
- •Деструктор
- •Вызовы конструкторов и деструкторов
- •Перегруженная операция присваивания
- •Конструктор 2 (конструктор копирования, конструктор копии)
- •Наследование. Иерархия классов.
- •Ключи доступа
- •Пример простого наследования (точка, круг)
- •Правила наследования функций-элементов. Вызовы конструкторов и деструкторов в иерархии
- •Виртуальные функции и полиморфизм
- •Правила определения и наследования виртуальных функций
- •Позднее (динамическое) связывание
- •Полиморфизм. Абстрактные и конкретные классы
- •Учебная литература (основная)
- •Учебная литература (для углубленного изучения)
- •Учебно-методические издания
Реализация дерева с помощью массивов
Способ реализации динамических структур с помощью массивов позволяет сортировать структуры из громоздких элементов данных без их физического перемещения в памяти и при этом не расходовать время на выделение и освобождение памяти для каждого элемента данных.
Вывод динамических структур в файл и чтение их из файла
Вывод в файл производится без вывода адресов; выводятся только данные. При чтении из файла одновременно формируется соответствующая динамическая структура данных.
Сбалансированные (avl) деревья
Бинарные деревья поиска предназначены для быстрого доступа к данным. В идеале дерево является разумно сбалансированным и имеет высоту порядка . Однако при некоторых данных дерево может оказаться вырожденным. Например, отсортированный по возрастанию массив 1, 2, 3, 4, 5 представлен деревом:
Высота дерева равна 4; в общем случае - . Доступ к данным существенно замедлится, эффективность поиска – эквивалентна списку.
AVL-деревья обладают всеми преимуществами бинарных деревьев и никогда не вырождаются. Под их сбалансированностью понимают то, что для каждого узла дерева высоты обоих его поддеревьев различаются не более чем на 1. В данном случае AVL-дерево имеет вид:
Высота дерева равна 2.
Для неотсортированного массива 20, 30, 80, 40, 10, 60, 50, 70 бинарное дерево (высота дерева равна 5):
AVL-дерево (высота дерева равна 3) :
В общем случае высота сбалансированного дерева не превышает . Поэтому AVL-дерево является мощной структурой хранения, обеспечивающей быстрый доступ к данным.
Особенностью AVL-дерева является то, что при вставке новых узлов и удалении узлов нужно постоянно отслеживать соотношение высот левого и правого поддеревьев узла. Для сохранения этой информации в структуру узла нужно включать показатель сбалансированности, который содержит разность высот правого и левого поддеревьев.
Примеры:
Следовательно:
-1: высота левого поддерева на 1 больше высоты правого поддерева,
0: высоты обоих поддеревьев одинаковы,
+1: высота правого поддерева на 1 больше высоты левого поддерева.
AVL-дерево должно оставаться сбалансированным по высоте после каждой операции включения или удаления узла.
Алгоритм avl-вставки.
Включение узла в AVL-дерево происходит почти так же, как и в бинарное дерево.
Осуществляется спуск по левым и правым потомкам, пока не встретится пустое поддерево, а затем производится пробное включение нового узла в этом месте. В течение этого процесса посещается каждый узел на пути поиска от корневого к новому узлу.
После пробного включения обработка узлов ведется в обратном порядке. При этом корректируется показатель сбалансированности корневого узла и всех остальных узлов, входящих в путь поиска. Необходимость обработки в обратном порядке требует, чтобы процесс был рекурсивным. При этом возможны три случая.
1-й случай
Узел (корень) изначально сбалансирован (показатель сбалансированности равен 0). После включения в поддерево нового узла корень станет перевешивать влево или вправо в зависимости от того, в какое поддерево было сделано включение. Если в левое, то показателю сбалансированности узла присваивается -1, если в правое - +1.В этом случае дерево сохраняет сбалансированность, пробное включение сохраняется.
2-й случай
Одно из поддеревьев перевешивает, и новый узел включается в более легкое поддерево
Корень становится полностью сбалансированным. Пробное включение сохраняется.
3-й случай
Одно из поддеревьев корня перевешивает, и новый узел включается в более тяжелое поддерево. При этом нарушается условие сбалансированности. Чтобы восстановить равновесие, нужен поворот.
Если дерево разбалансировалось слева, то для восстановления равновесия нужен поворот вправо. Если же справа, то симметричные действия – поворот влево.
