- •Нелинейные структуры данных: классификация.
- •Деревья: ориентированные, упорядоченные и бинарные.
- •Представление деревьев в памяти компьютера: последовательное и связанное размещение элементов.
- •Операции над деревьями.
- •Графы и их представление в компьютере.
- •Матричное представление орграфов.
- •Связное представление орграфов.
- •Алгоритмы, оперирующие со структурами типа графа.
- •Поиск в глубину
- •Построение остова минимального веса
- •Построение эйлерова цикла
- •Поиск кратчайшего пути
- •Алгоритм поиска в ширину
- •Построение наибольшего паросочетания в двудольном графе
- •Алгоритм укладки графа на плоскости
- •Задачи поиска.
- •Исчерпывающий поиск: перебор с возвратом, метод ветвей и границ, динамическое программирование. Поиск с возвращением
- •Алгоритм поиска с возвращением
- •Метод ветвей и границ
- •Динамическое программирование
- •Быстрый поиск: бинарный и последовательный поиски в массивах, хеширование Бинарный поиск
- •Хеширование
- •Использование деревьев в задачах поиска: бинарные, случайные бинарные, оптимальные и сбалансированные деревья поиска.
- •Двоичные деревья
- •Сбалансированные двоичные деревья
- •Деревья оптимального поиска
- •Деревья цифрового поиска
- •Алгоритмы поиска на графах.
- •Внутренняя сортировка.
- •Сортировка включением
- •Обменная сортировка
- •Сортировка выбором
- •Сортировка разделением (Quicksort)
- •Сортировка с помощью дерева (Heapsort)
- •Сортировка со слиянием
- •Сравнение методов внутренней сортировки
- •Внешняя сортировка.
- •Прямое слияние
- •Естественное слияние
- •Сбалансированное многопутевое слияние
- •Многофазная сортировка
- •Улучшение эффективности внешней сортировки за счет использования основной памяти
- •Файлы: организация и обработка, представление деревьями: b-деревья. Классические b-деревья
- •Контрольные вопросы:
Операции над деревьями.
Над деревьями определены следующие основные операции:
1) Поиск узла с заданным ключом.
2) Добавление нового узла
3) Удаление узла ( поддерева ) .
4) Обход дерева в определенном порядке:
Нисходящий обход ;
Смешанный обход ;
Восходящий обход.
ПОИСК ЗАПИСИ В ДЕРЕВЕ
Нужная вершина в дереве ищется по ключу. Поиск в бинарном дереве осуществляется следующим образом.
Пусть построено некоторое дерево и требуется найти звено с ключом X. Сначала сравниваем с X ключ, находящийся в корне дерева. В случае равенства поиск закончен и нужно возвратить указатель на корень в качестве результата поиска. В противном случае переходим к рассмотрению вершины, которая находится слева внизу, если ключ X меньше только что рассмотренного, или справа внизу, если ключ X больше только что рассмотренного. Сравниваем ключ X с ключом, содержащимся в этой вершине, и т.д. Процесс завершается в одном из двух случаев:
1) найдена вершина, содержащая ключ, равный ключу X;
2) в дереве отсутствует вершина, к которой нужно перейти для выполнения очередного шага поиска.
В первом случае возвращается указатель на найденную вершину. Во втором - указатель на звено, где остановился поиск, (что удобно для построения дерева ).
ДОБАВЛЕНИЕ НОВОГО УЗЛА
Для включения записи в дерево прежде всего нужно найти в дереве ту вершину, к которой можно "подвести" (присоединить) новую вершину, соответствующую включаемой записи. При этом упорядоченность ключей должна сохраняться.
Алгоритм поиска нужной вершины, вообще говоря, тот же самый, что и при поиске вершины с заданным ключом. Эта вершина будет найдена в тот момент, когда в качестве очередного указателя, определяющего ветвь дерева, в которой надо продолжить поиск, окажется указатель NIL ( случай 2 в поиске записи в дереве).
ОБХОД ДЕРЕВА.
Во многих задачах, связанных с деревьями, требуется осуществить систематический просмотр всех его узлов в определенном порядке. Такой просмотр называется прохождением или обходом дерева.
Бинарное дерево можно обходить тремя основными способами: нисходящим, смешанным и восходящим ( возможны также обратный нисходящий, обратный смешанный и обратный восходящий обходы). Принятые выше названия методов обхода связаны с временем обработки корневой вершины: До того как обработаны оба ее поддерева, после того как обработано левое поддерево, но до того как обработано правое , после того как обработаны оба поддерева. Используемые в переводе названия методов отражают направление обхода в дереве: от корневой вершины вниз к листьям - нисходящий обход; от листьев вверх к корню - восходящий обход, и смешанный обход - от самого левого листа дерева через корень к самому правому листу.
Схематично алгоритм обхода двоичного дерева в соответствии с нисходящим способом может выглядеть следующим образом:
1. В качестве очередной вершины взять корень дерева. Перейти к пункту 2.
2. Произвести обработку очередной вершины в соответствии с требованиями задачи. Перейти к пункту 3.
3.а) Если очередная вершина имеет обе ветви, то в качестве новой вершины выбрать ту вершину, на которую ссылается левая ветвь, а вершину, на которую ссылается правая ветвь, занести в стек; перейти к пункту 2;
3.б) если очередная вершина является конечной, то выбрать в качестве новой очередной вершины вершину из стека, если он не пуст, и перейти к пункту 2; если же стек пуст, то это означает, что обход всего дерева окончен, перейти к пункту 4;
3.в) если очередная вершина имеет только одну ветвь, то в качестве очередной вершины выбрать ту вершину, на которую эта ветвь указывает, перейти к пункту 2.
4. Конец алгоритма.
Для примера рассмотрим возможные варианты обхода дерева (рис. 4.1).
При обходе дерева представленного на рис.1 этими тремя методами мы получим следующие последовательности: ABCDEFG ( нисходящий ); CBAFEDG ( смешанный ); CBFEGDA ( восходящий ).
Рис.4.1. Схема дерева
ВОСХОДЯЩИЙ ОБХОД
Трудность заключается в том, что в этом алгоритме каждая вершина запоминается в стеке дважды: первый раз - когда обходится левое поддерево, и второй раз - когда обходится правое поддерево. Таким образом, в алгоритме необходимо различать два вида стековых записей: 1-й означает, что в данный момент обходится левое поддерево; 2-й - что обходится правое, поэтому в стеке запоминается указатель на узел и признак (код-1 и код-2 соответственно).
Алгоритм восходящего обхода можно представить следующим образом:
1) Спуститься по левой ветви с запоминанием вершины в стеке как 1-й вид стековых записей;
2) Если стек пуст, то перейти к п.5;
3) Выбрать вершину из стека, если это первый вид стековых записей, то возвратить его в стек как 2-й вид стековых записей; перейти к правому сыну; перейти к п.1, иначе перейти к п.4;
4) Обработать данные вершины и перейти к п.2;
5) Конец алгоритма.