
- •Структуры и алгоритмы обработки данных
- •230100.62 – Информатика и вычислительная техника
- •Стандартная постановка задачи
- •Пример постановки задачи
- •Пример постановки задачи в стандартной форме
- •Алгоритмы и их сложность
- •Основы анализа программ
- •Пример анализа алгоритмов
- •Выполнение операторов программы
- •Основы доказательства корректности
- •Динамическое программирование
- •Перемножение нескольких матриц
- •Когда применимо динамическое программирование
- •Наибольшая общая подпоследовательность
- •Жадные алгоритмы
- •Задача о выборе заявок
- •Абстрактные типы данных
- •Атд «Список»
- •Атд «Стек»
- •Атд «Очередь»
- •Множества
- •Хеширование
- •Словари, основанные на хеш-таблицах
- •Поиск слова в тексте
- •Сортировка
- •Сортировка вставками
- •Корневая сортировка
- •Пирамидальная сортировка
- •Переформирование пирамиды
- •Построение пирамиды
- •Сортировка слиянием
- •Управление с помощью таблиц
- •Способы представления графа
- •Матрица смежности
- •Матрица инцидентности
- •Список рёбер
- •Алгоритмы обхода графа
- •Поиск в ширину
- •Задача о кратчайшем пути
- •Алгоритм Дейкстры
- •Алгоритм Беллмана-Форда
- •Задача перекресток
- •Максимальный поток
- •Метод Форда-Фалкерсона
- •Минимальные покрывающие деревья
- •Алгоритм Крускала
- •Алгоритм Прима
- •Минимальные покрывающие деревья
- •Поиск в глубину
- •Топологическая сортировка
- •Деревья
Топологическая сортировка
Пусть имеется ориентированный граф G=(V,E) без циклов (directed acyclic graf).
Задача о топологической сортировке (topological sort) этого графа состоит в следующем: надо указать такой линейный порядок на его вершинах, что любое ребро ведет от меньшей вершины к большей (в смысле этого порядка)
Алгоритм топологической сортировки
TOPOLOGICAL-SORT (G)
1. вызвать DFS(G) , при этом
2. завершая обработку вершины
( DFS-VISIT, строка 8),
добавлять ее в начало списка
3. вернуть построенный список вершин
Топологическая сортировка выполняется за время Θ (V + E), потому что столько времени занимает поиск в глубину, а добавлять каждую из | V | вершин к списку можно за время O(1).
Деревья
Деревья
Рекурсивные процедуры обхода деревьев
Прямой обход
procedure PREODER (n: узел);
begin
Занести в список обхода узел n;
for для каждого сына с узла n в порядке слева направо do PREORDER (c )
end; { PREODER}
Симметричный обход
procedure INODER (n: узел);
begin
if n - лист then
занести в список обхода узел ;
else begin
INORDER (самый левый сын узла n);
занести в список обхода узел n;
for для каждого сына с узла n, исключая
самый левый, порядке слева направо do
INORDER ( c )
end
end; { INODER}
Операторы АТД, основанные на деревьях:
1.PARENT (n, T)
2. LEFTMOST_CHILD (n, T)
3. RIGHT_SIBLING (n, T)
4. LABEL (n, T)
5. CREATi (v, T1,T2,…Ti)
6. ROOT( T)
7. MAKENULL ( T)
АВЛ-деревья
1962 год
Московские математики Г.М.Адельсон-Вельский и Е.М.Ландис предложили схему самобалансирующегося поискового дерева. Для балансировки дерева требуется произвести каждый раз небольшие преобразования, которые затрагивают не более трех узлов.
Высота дерева – длина наибольшего пути в этом дереве.
Вершина дерева называется сбалансированной, если высота ее левого и правого поддерева отличается не более чем на 1.
Дерево называется подравненным, если все его вершины сбалансированы.
При добавлении в дерево новых вершин, некоторые вершины могут стать несбалансированными. Сбалансированность может пропасть только у вершин, лежащих на пути от корня дерева к новой вершине, и разность высот достигает значения 2.
Обозначим a самую нижнюю вершину с нарушенным балансом. Две следующие вершины на этом пути обозначим как b и c.
Возможные схемы взаимного расположения вершин (для нижней части дерева вниз от a) для случая, когда левый путь длиннее правого на 2, изображен на рисунке.
Все остальные части дерева изображены условными блоками. Достаточно небольшого изменения вершин a, b, c и прицепленных к ним деревьев, чтобы балланс восстановился во всех вершинах. Эти изменения представлены на рисунке.
Фактически нужна только одна операция – поднятие вершины на один уровень наверх. Для первого случая нужно поднять наверх вершину b один раз, а во втором случае – вершину c два раза.
В настоящее время в некоторых схемах, где требуется быстрый доступ к часто меняющейся информации, применяется адаптирующееся дерево, основанное на АВЛ-преобразованиях.
В современных информационных системах данные хранятся преимущественно во внешней памяти, а время, расходуемое на одно обращение к диску существенно больше времени, требуемого на сопутствующие вычисления.
Поэтому целесообразно в каждом узле дерева ветвить поиск не на два варианта, а на много.
В информационных системах АВЛ деревья уступили место более прогрессивной конструкции В-дерева и различным его обобщениям.
Различные классы балансирующихся двоичных деревьев и В-деревьев рассмотрены в книге Т.Кормен, Ч.Лейзерсон, З. Ривест Алгоритмы: построение и анализ. М.:МЦНМО, 1999.-960 с.