- •Алгоритмы и алгоритмические языки
- •Лекция 1
- •Представление чисел в эвм
- •Вещественные
- •Ошибки вычислений
- •Лекция 2
- •Алгоритмы. Сведение алгоритмов.
- •Нижние и верхние оценки.
- •Сортировки
- •Постановка задачи
- •Сортировка пузырьком.
- •Сортировка слиянием с рекурсией.
- •Сортировка слиянием без рекурсии.
- •Лекция 3
- •Алгоритмы. Сведение алгоритмов.
- •Сортировки и связанные с ними задачи.
- •Доказательство корректности работы алгоритма.
- •Оценки времени работы алгоритма.
- •Некоторые задачи, сводящиеся к сортировке.
- •Лекция 4
- •Алгоритмы. Сведение алгоритмов.
- •Сортировки и связанные с ними задачи.
- •HeapSort или сортировка с помощью пирамиды.
- •Алгоритмы сортировки за время o(n)
- •Сортировка подсчетом
- •Цифровая сортировка
- •Сортировка вычерпыванием
- •Лекция 5
- •Алгоритмы. Сведение алгоритмов.
- •Порядковые статистики.
- •Поиск порядковой статистики за время (n) в среднем
- •Поиск порядковой статистики за время (n) в худшем случае
- •Язык программирования c.
- •Переменные
- •Структуры данных.
- •Вектор.
- •Лекция 6
- •Стек. Реализация 1 (на основе массива).
- •Стек. Реализация 2 (на основе массива с использованием общей структуры).
- •Стек. Реализация 3 (на основе указателей).
- •Стек. Реализация 4 (на основе массива из двух указателей).
- •Стек. Реализация 5 (на основе указателя на указатель).
- •Очередь.
- •Стандартная ссылочная реализация списков
- •Ссылочная реализация списков с фиктивным элементом
- •Реализация l2-списка на основе двух стеков
- •Реализация l2-списка с обеспечением выделения/освобождения памяти
- •Лекция 7
- •Структуры данных. Графы.
- •Поиск пути в графе с наименьшим количеством промежуточных вершин
- •Представление графа в памяти эвм
- •Массив ребер
- •Матрица смежности
- •Матрица инцидентности
- •Списки смежных вершин
- •Реберный список с двойными связями (рсдс) (для плоской укладки планарных графов)
- •Лекция 8
- •Структуры данных. Графы.
- •Поиск кратчайшего пути в графе
- •Алгоритм Дейкстры
- •Конец вечного цикла
- •Алгоритм Дейкстры модифицированный
- •Конец вечного цикла
- •Лекция 9
- •Бинарные деревья поиска
- •Поиск элемента в дереве
- •Добавление элемента в дерево
- •Поиск минимального и максимального элемента в дереве
- •Удаление элемента из дерева
- •Поиск следующего/предыдущего элемента в дереве
- •Слияние двух деревьев
- •Разбиение дерева по разбивающему элементу
- •Сбалансированные и идеально сбалансированные бинарные деревья поиска
- •Операции с идеально сбалансированным деревом
- •Операции со сбалансированным деревом
- •Поиск элемента в дереве
- •Добавление элемента в дерево
- •Удаление элемента из дерева
- •Поиск минимального и максимального элемента в дереве
- •Поиск следующего/предыдущего элемента в дереве
- •Слияние двух деревьев
- •Разбиение дерева по разбивающему элементу
- •Лекция 10
- •Красно-черные деревья
- •Отступление на тему языка с. Поля структур.
- •Отступление на тему языка с. Бинарные операции.
- •Высота красно-черного дерева
- •Добавление элемента в красно-черное дерево
- •Однопроходное добавление элемента в красно-черное дерево
- •Удаление элемента из красно-черного дерева
- •Лекция 11
- •Высота b-дерева
- •Поиск вершины в b-дереве
- •Отступление на тему языка с. Быстрый поиск и сортировка в языке с
- •Добавление вершины в b-дерево
- •Удаление вершины из b-дерева
- •Лекция 12
- •Хеширование
- •Метод многих списков
- •Метод линейных проб
- •Метод цепочек
- •Лекция 14
- •Поиск строк
- •Отступление на тему языка с. Ввод-вывод строк из файла
- •Алгоритм поиска подстроки с использованием хеш-функции (Алгоритм Рабина-Карпа)
- •Конечные автоматы
- •Отступление на тему языка с. Работа со строками
- •Алгоритм поиска подстроки, основанный на конечных автоматах
- •Лекция 15
- •Алгоритм поиска подстроки Кнута-Морриса-Пратта (на основе префикс-функции)
- •Алгоритм поиска подстроки Бойера-Мура (на основе стоп-символов/безопасных суффиксов)
- •Эвристика стоп-символа
- •Эвристика безопасного суффикса
- •Форматы bmp и rle
- •Bmp без сжатия.
-
Разбиение дерева по разбивающему элементу
Для данной вершины дерева v разбиение сбалансированного дерева поиска T на два сбалансированных дерева поиска T1 и T2 таких, что все элементы в T1 меньше или равны v, и все элементы в T2 больше или равны v.
Алгоритм, практически полностью, совпадает с алгоритмом разбиения обычного дерева поиска. Только, теперь, нам следует пользоваться алгоритмом слияния деревьев для сбалансированных деревьев поиска.
Пусть высота дерева T0 равна s0. Пусть с деревом T0 будут последовательно сливаться деревья T с индексами i1,…,iK (iKh), в результате чего будут получаться деревья S1, S2,…, SK . Будем считать S0= T0. Т.е. Sj-1+ Tij Sj .
Высота дерева Sj равна либо MAX(h(Sj-1),h(Tij )), либо MAX(h(Sj-1),h(Tij ))+1.
Пусть Ri – деревья с корнями в вершинах vi. Высота дерева Ri равна либо h(Ti)+1 либо h(Ti)+2. h(Ri) строго возрастают.
Покажем по индукции , что высота дерева Sj равна либо h(Rij), либо h(Rij)-1, либо h(Rij)-2. Пусть данное свойство выполнено для l<j, тогда
h(Sj )=MAX(h(Sj-1),h(Tij )) | MAX(h(Sj-1),h(Tij ))+1 следовательно
h(Sj )= MAX(h(Sj-1),h(Rij) -1) | MAX(h(Sj-1),h(Rij) -2) |
MAX(h(Sj-1),h(Rij) -1)+1 | MAX(h(Sj-1),h(Rij) -2)+1 следовательно по индукции
h(Sj )= (h(Rij) -1) | ((h(Rij) -1) | h(Rij) -2) |
h(Rij) | (h(Rij) | h(Rij) -1) следовательно
h(Sj )= h(Rij) | (h(Rij) -1) | (h(Rij) -2)
Здесь под вертикальной чертой подразумевается разделение возможных вариантов.
Время работы всего алгоритма
T=O(|h(T0)- h(Ti1 )|+1 +| h(S1)- h(Ti2 )|+1 +…+| h(SK-1) - h(TiK )|+1)=
=O(|h(T0)- h(Ti1 )| +| h(S1)- h(Ti2 )| +…+| h(SK-1) - h(TiK )|)+O(h)=
=O(|h(T0 )- h(Ri1 )|+4 +| h(Ri1 )- h(Ri2 )|+4 +…+| h(Ri(K-1) ) - h(RiK )|+4)+O(h)=
(в силу возрастания h(Ri) )
=O(|h(T0 )- h(Ri1 )|+| h(Ri1 )- h(Ri2 )|+…+| h(Ri(K-1) ) - h(RiK )|)+O(h)= O(h)
Т.о. T= O(h)=O(log2 N), где N – количество вершин в суммарном дереве.
Итак, верна следующая
Теорема. Для данной вершины v сбалансированного дерева поиска T разбиение на два сбалансированных дерева поиска T1 и T2 таких, что все элементы в T1 меньше или равны v, и все элементы в T2 больше или равны v. может быть произведено указанным алгоритмом за время = O(log2 N), где N – суммарное количество вершин в деревьях T1 и T2.
-
Лекция 10
-
Красно-черные деревья
Красно-черными деревьями называют бинарные деревья поиска, у которых для каждой вершины добавляется дополнительное свойство: вершина является черной или красной. При этом требуется выполнение следующих свойств:
-
корень дерева – черный
-
у каждой красной вершины потомки – черные
-
в любых двух ветвях от корня до листа количество содержащихся черных вершин равно
Для простоты реализации в дерево добавляются фиктивные черные вершины: для каждой вершины дерева, при отсутствии у нее потомка, на место соответствующего потомка вставляется фиктивная черная вершина.
Вершины, отличные от фиктивных, называются внутренними. Будем далее называть листьями вершины, все потомки которых – фиктивные. При определении высоты дерева фиктивные вершины учитывать не будем.
Например, для задания одной вершины красно-черного дерева целых чисел в языке С можно использовать следующую структуру
typedef struct SBTree_
{
int IsRed;
int value;
struct STree_ *par;
struct STree_ *left, *right;
} SBTree;
здесь указатель par указывает на родительский элемент данной вершины, а left и right – на двух потомков, которых традиционно называют левым и правым. Целая переменная IsRed указывает – является ли данная вершина красной. Величина value называется ключом вершины.