- •2. Основные операции для работы с d-кучами
- •3. Лабораторные работы
- •3.1. Нахождение кратчайших путей в графе Постановка задачи
- •Структура данных для представления графа
- •Алгоритм Дейкстры, реализованный на основе d-кучи
- •Алгоритм Дейкстры, использующий метки
- •Алгоритм Форда–Беллмана
- •Задания для лабораторной работы № 1
- •3.2. Нахождение минимального остова графа Постановка задачи
- •Стратегии решения задачи
- •Алгоритм Борувки
- •Алгоритм Краскала
- •Алгоритм Прима
- •Round Robin алгоритм
- •Задания для лабораторной работы № 2
- •3.3. Создание и использование словаря Постановка задачи
- •Решение задачи создания и использования словаря
- •Тривиальный алгоритм
- •Алгоритм с использованием авл-дерева
- •Задания для лабораторной работы № 3
- •3.4. Поиск фрагмента в тексте Постановка задачи
- •Наивный алгоритм поиска фрагмента в тексте
- •Алгоритм Кнута-Морриса-Пратта
- •Задания для лабораторной работы № 4
- •3.5. Сортировка Постановка задачи
- •Сортировка с помощью d-кучи
- •Быстрая сортировка
- •Задания для лабораторной работы № 5
- •3.6. Построение выпуклой оболочки n точек на плоскости Постановка задачи
- •Построение выпуклой оболочки с помощью сортировки
- •Задания для лабораторной работы № 6
- •3.7. Поиск пары пересекающихся отрезков Постановка задачи
- •Наивный алгоритм поиска пересечения
- •Эффективный алгоритм поиска пересечения
- •Задания для лабораторной работы № 7
- •4. Приложение: генерация графов для экспериментов
- •Литература
Задания для лабораторной работы № 7
Написать программу, реализующую наивный алгоритм и алгоритм с использованием АВЛ-дерева для решения поставленной задачи, основываясь на процедурах INTERSECTION_NAIVE и INTERSECTION_EFFECTIVE.
Модифицировать написанные программы для проведения экспериментов, в которых можно выбирать:
число n рассматриваемых отрезков с вещественными координатами концов,
способ задания отрезков из числа следующих:
автоматический с псевдослучайными координатами концов из квадрата единичной длины,
автоматический с задаваемой длиной r всех отрезков и псевдослучайными координатами их центров из квадрата единичной длины и псевдослучайными величинами углов, образуемых прямыми, проходящими через эти отрезки, с осью абсцисс,
непосредственный ввод координат концов отрезков.
Выходом данной программы должно быть время работы Т1 тривиального алгоритма и время работы Т2 нетривиального алгоритма в секундах.
При этом в автоматических способах задания отрезков должна быть предусмотрена возможность ввести число k<n-1 и сделать так, чтобы первые k отрезков не пересекались ни между собой, ни с оставшимися, а отрезки с номерами k+1 и k+2 пересекались между собой.
Провести эксперименты на основе следующих данных:
первый способ задания отрезков, n = 1, … ,104+1 с шагом 100 (нарисовать графики функций T1(n) и T2(n)),
первый способ задания отрезков, n = 104+3, k = 1, … ,104+1 с шагом 100 (нарисовать графики функций T1(k) и T2(k)),
второй способ задания отрезков, r = 0,001, n = 1, …, 104+1 с шагом 100 (нарисовать графики функций T1(n) и T2(n)),
второй способ задания отрезков, r = 0,0001, …, 0,01 с шагом 0,0001, n = 104 (нарисовать графики функций T1(r) и T2(r)).
Сформулировать и обосновать (на основе псевдокодов алгоритмов и практических данных, для получения которых можно провести дополнительные эксперименты) вывод о том, в каких случаях целесообразно применять наивный алгоритм, а в каких - эффективный.
4. Приложение: генерация графов для экспериментов
Нас будет интересовать генерация графа G = (V, E) с n вершинами (множество вершин V = {1, … , n}) и m ребрами (множество ребер E, m=|E|) из двух классов графов: класса ориентированных графов без петель и класса обыкновенных графов. В любом из этих двух случаев задача решается единообразно: первоначально каким-либо образом на множестве Еmax (заметим, что в практическом построении этого множества нет необходимости) всех возможных ребер графа с множеством вершин V = {1, … , n} устанавливается строгий линейный порядок (тем самым обретают смысл понятия следующего и предшествующего ребра) и далее последовательно строятся требуемые m ≤ |Еmax| ребер, каждое ребро e из которых строится следующим образом:
псевдослучайно генерируется ребро e’,
если e’ не было построено ранее, то ребро e=e’ считается построенным,
если e’ уже было построено ранее, то осуществляется поиск первого ребра из следующих после e’ ребер, которое еще не было построено, если такое ребро e’’ существует, то ребро e=e’’ считается построенным, если же такого ребра не существует, то осуществляется поиск первого ребра e’’’ из предшествующих e’ ребер, которое еще не было построено, и ребро e=e’’’ считается построенным.