- •Структуры и алгоритмы обработки данных
- •230100.62 – Информатика и вычислительная техника
- •Стандартная постановка задачи
- •Пример постановки задачи
- •Пример постановки задачи в стандартной форме
- •Алгоритмы и их сложность
- •Основы анализа программ
- •Пример анализа алгоритмов
- •Выполнение операторов программы
- •Основы доказательства корректности
- •Динамическое программирование
- •Перемножение нескольких матриц
- •Когда применимо динамическое программирование
- •Наибольшая общая подпоследовательность
- •Жадные алгоритмы
- •Задача о выборе заявок
- •Абстрактные типы данных
- •Атд «Список»
- •Атд «Стек»
- •Атд «Очередь»
- •Множества
- •Хеширование
- •Словари, основанные на хеш-таблицах
- •Поиск слова в тексте
- •Сортировка
- •Сортировка вставками
- •Корневая сортировка
- •Пирамидальная сортировка
- •Переформирование пирамиды
- •Построение пирамиды
- •Сортировка слиянием
- •Управление с помощью таблиц
- •Способы представления графа
- •Матрица смежности
- •Матрица инцидентности
- •Список рёбер
- •Алгоритмы обхода графа
- •Поиск в ширину
- •Задача о кратчайшем пути
- •Алгоритм Дейкстры
- •Алгоритм Беллмана-Форда
- •Задача перекресток
- •Максимальный поток
- •Метод Форда-Фалкерсона
- •Минимальные покрывающие деревья
- •Алгоритм Крускала
- •Алгоритм Прима
- •Минимальные покрывающие деревья
- •Поиск в глубину
- •Топологическая сортировка
- •Деревья
Атд «Список»
Список представляет последовательность элементов определенного типа, который в общем случае будем обозначать как elementtype.
a1,a2,…,an, где n ≥0
a1 – первый элемент списка
an – последний элемент списка
n – длина списка
Обозначения
L - список объектов типа elementtype
x – объект этого типа
p – позиция элемента в списке
Функция END (L) возвращает позицию, следующую за позицией n в n- элементном списке L.
Операции над списками
1. Оператор INSERT ( x,p,L) – вставляет объект x в позицию p в списке L. Если в списке L нет позиции p, то результат этого оператора не определен.
2. Функция LOCATE (x,L) – возвращает позицию первого объекта x в списке L. Если объекта x нет в списке L, то возвращается END(L).
3. Функция RETRIEVE (p,L) – возвращает элемент, который стоит в позиции p в списке L. Результат не определен, если в списке L нет позиции p, или если p= END(L).
4. Оператор DELETE ( p,L) – удаляет элемент в позиции p списка L. Результат не определен, если в списке L нет позиции p, или если p= END(L).
5. Функции NEXT(p, L) и PREVIOUS(p,L) – возвращают соответственно следующую и предыдущую позиции от позиции p в списке L. Функция NEXT не определена, если p= END(L). Функция PREVIOUS не определена, если p= 1. Обе функции не определены, если в списке L нет позиции p.
6. Функция MAKENULL (L) – делает список L пустым и возвращает позицию END(L).
7. Функция FIRST (L) – возвращает первую позицию в списке L. Если список пустой, то возвращается позиция END(L).
8. Оператор PRINTLIST ( L) – печатает элементы списка L в порядке их расположения.
Атд «Стек»
Стек – специальный тип списка, в котором все вставки и удаления выполняются только на одном конце, называемом вершиной
Добавление элемента, называемое также проталкиванием (push), возможно только в вершину стека (добавленный элемент становится первым сверху). Удаление элемента, называемое также выталкиванием (pop), тоже возможно только из вершины стека, при этом второй сверху элемент становится верхним.
Реализация стеков массивами
stak – массив, используемый для организации стека;
stksiz – размер массива;
stktop – указатель вершины стека;
data - данные;
pr – признак успешности операции
Включить в стек
procedure push(var stak:massiv; stksiz:integer; var stktop:integer; data:integer; var pr:boolean);
begin
{vkl}
if stktop >= stksiz then pr:=false
else
begin
stktop:=stktop+1;
stak[stktop]:= data;
pr:=true
end;
end;
Исключить из стека
procedure pop(var stak:massiv; stksiz:integer; var stktop:integer;var data:integer; var pr:boolean);
begin
{iskl}
if stktop = 0 then pr:=false
else
begin
data:= stak[stktop];
stktop:=stktop+1;
pr:=true
end;
end;
Очередь (FIFO)
Атд «Очередь»
О́чередь — структура данных с дисциплиной доступа к элементам «первый пришёл — первый вышел» (FIFO, First In — First Out). Добавление элемента (принято обозначать словом enqueue — поставить в очередь) возможно лишь в конец очереди, выборка — только из начала очереди (что принято называть словом dequeue — убрать из очереди), при этом выбранный элемент из очереди удаляется.
Существует несколько способов реализации очереди в языках программирования.
Массив
Первый способ представляет очередь в виде массива и двух целочисленных переменных start и end.
Обычно start указывает на голову очереди, end — на элемент, который заполнится, когда в очередь войдёт новый элемент. При добавлении элемента в очередь в q[end] записывается новый элемент очереди, а end уменьшается на единицу. Если значение end становится меньше 1, то мы как бы циклически обходим массив и значение переменной становится равным n. Извлечение элемента из очереди производится аналогично: после извлечения элемента q[start] из очереди переменная start уменьшается на 1. С такими алгоритмами одна ячейка из n всегда будет незанятой (так как очередь с n элементами невозможно отличить от пустой), что компенсируется простотой алгоритмов.
Преимущества данного метода: возможна незначительная экономия памяти по сравнению со вторым способом; проще в разработке.
Недостатки: максимальное количество элементов в очереди ограничено размером массива. При его переполнении требуется перевыделение памяти и копирование всех элементов в новый массив.
Связный список
Второй способ основан на работе с динамической памятью. Очередь представляется в качестве линейного списка, в котором добавление/удаление элементов идет строго с соответствующих его концов.
Преимущества данного метода: размер очереди ограничен лишь объёмом памяти.
Недостатки: сложнее в разработке; требуется больше памяти; при работе с такой очередью память сильнее фрагментируется; работа с очередью несколько медленнее.
Реализация с помощью массива
Занести в очередь
procedure QUEINS(var QUEUE:massiv; QUESIZ:integer; var QUEF, QUER:integer; DATA:integer; var PR:boolean);
begin
if (QUEF=QUER+1) or ((QUEF=1) and (QUER=QUESIZ)) then PR:=false
else
begin
PR:=true;
QUEUE[QUER]:= DATA;
QUER:=QUER+1;
if (QUER > QUESIZ)) then QUER:=1
end;
end;
Исключить из очереди
procedure QUEDEL(var QUEUE:massiv; QUESIZ:integer; var QUEF, QUER:integer; var DATA:integer; var PR:boolean);
begin
if (QUEF=QUER) then PR:=false
else
begin
PR:=true;
DATA := QUEUE[QUEF]
QUEF:=QUEF+1;
if (QUEF > QUESIZ)) then QUEF:=1
end;
end;
Инициализация очереди
procedure QUEINT(var QUEUE:massiv; QUESIZ:integer; var QUEF, QUER:integer; var PR:boolean);
begin
var I:integer;
PR:=true;
QUEF:=1;
QUER:=1;
for I:=1 to QUESIZ do QUEUE[I]:=0;
end;
