- •Алгоритмы и алгоритмические языки
- •Лекция 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 без сжатия.
-
Очередь.
Очередью называется структура данных, организованная по принципу FIFO – first-in, first-out , т.е. элемент, попавшим в множество первым, должен первым его и покинуть. При практическом использовании часто налагается ограничение на длину очереди, т.е. требуется, чтобы количество элементов не превосходило N для некоторого целого N.
Создание исполнителя очередь предполагает наличие следующих функций
-
инициализация
-
добавление элемента в конец очереди
-
взятие/извлечение элемента с начала очереди
-
проверка: пуста ли очередь?
-
очистка очереди
Обычно, используется реализация циклической очереди. Т.е. под очередь отводится некоторый непрерывный кусок памяти (массив) и при подходе хвоста очереди к концу массива хвост автоматически перебрасывается на противоположный конец массива. Например, для реализации стандартной очереди из менее чем 100 целых чисел на базе массива в языке С следует определить следующие данные
#define N 100
int array[N], begin=N-1,end=N-1;
Было бы логичным объединить все эти данные в единую структуру:
struct SQueue
{
int Array[N];
int Begin, End;
};
Тогда функция инициализации очереди может выглядеть
void Init(struct SQueue *queue){ queue->Begin=queue->End=N-1;}
Функция добавления элемента может выглядеть следующим образом
int Add(struct SQueue *queue, int value)
{
if(queue->End - queue->Begin == 1 ||
queue->Begin - queue->End == N-1)return -1;
queue->Array[queue->End-- ]=value;
if(queue->End<0) queue->End=N-1;
return 0;
}
Отметим, что при данной реализации один элемент в очереди всегда будет не использован.
Функция извлечения элемента с уничтожением может выглядеть следующим образом
int Get(struct SQueue *queue, int *value)
{
if(queue->Begin== queue->End)return -1;
*value= queue->Array[queue->Begin];
if((--queue->Begin)<0) queue->Begin=N-1;
return 0;
}
В функции сначала проводится проверка очереди на пустоту, далее из нее извлекается элемент. Если необходимо, индекс начала очереди перебрасывается на конец массива.
-
Дек.
Деком называется структура данных, представляющих собой упорядоченное множество элементов, в котором элементы можно добавлять в начало и конец множества и извлекать их можно с обеих сторон.
Создание исполнителя дек предполагает наличие следующих функций
-
инициализация
-
добавление элемента в начало дека
-
добавление элемента в конец дека
-
взятие/извлечение элемента из начала дека
-
взятие/извлечение элемента с конца дека
-
проверка: пуст ли дек?
-
очистка дека
Аналогично очереди, обычно используются циклические реализации дека.
-
Списки
Как правило, рассматриваются односвязные и двусвязные списки. Данные в списках представляют собой некоторым способом упорядоченное множество. В множестве вводится понятие текущего элемента. В каждый момент можно получать данные только о текущем элементе. За одну операцию можно выбрать в качестве текущего элемента первый элемент в списке. Далее за одну операцию можно переместиться к следующему или предыдущему (для двусвязного списка) элементу. Можно стереть текущий элемент или вставить новый элемент вслед за текущим.
Более конкретно, создание исполнителя односвязный список (L1-список) предполагает наличие следующих функций
-
инициализация
-
установка текущего элемента в начало списка
-
перемещение текущего элемента к следующему элементу списка
-
взятие значения текущего элемента
-
уничтожение текущего элемента с автоматическим перемещением текущего элемента к следующему элементу списка
-
вставка нового элемента после текущего
-
проверка: пуст ли список?
-
проверка: текущий элемент в конце списка?
-
очистка списка
Двусвязный список отличается от односвязного наличием дополнительных операций:
-
перемещение текущего элемента к предыдущему элементу списка
-
вставка нового элемента перед текущим
-
проверка: текущий элемент в начале списка?
Иногда используются циклические списки. В них ссылки на концах списка циклически замыкаются. Хотя, формально, в данной структуре данных нет начала и конца, тем не менее, понятие первого элемента списка следует оставить, т.к. без него сложно, например, реализовать перебор всех элементов списка. Список предписаний несколько модифицируется. Например, для двусвязного списка он может выглядеть следующим образом:
-
инициализация
-
установка текущего элемента в первый элемент списка
-
перемещение текущего элемента к следующему элементу списка
-
перемещение текущего элемента к предыдущему элементу списка
-
взятие значения текущего элемента
-
уничтожение текущего элемента с автоматическим перемещением текущего элемента к следующему элементу списка
-
вставка нового элемента после текущего
-
вставка нового элемента перед текущим
-
проверка: пуст ли список?
-
проверка: текущий элемент первый в списке?
-
очистка списка