
- •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. Приложение: генерация графов для экспериментов
- •Литература
Задания для лабораторной работы № 6
Предлагается попарное сравнение различных использующих сортировку алгоритмов построения выпуклой оболочки n точек на плоскости с целочисленными координатами.
Варианты выбора пары алгоритмов A и B для сравнения:
Вариант d=2, …, 101
А используется сортировка d-кучей,
В используется сортировка (d+1)-кучей;
Вариант d=102, …., 200
А используется сортировка (d-100)-кучей,
В используется быстрая сортировка.
Задание.
Написать программу, реализующую алгоритм А и алгоритм В.
Написать программу, реализующую алгоритм А и алгоритм В, для проведения экспериментов, в которых можно выбирать:
количество n точек в исходном массиве a,
натуральные числа q и w для псевдослучайного размещения всех n точек в двух режимах:
в прямоугольнике со сторонами длины q и w,
на границе (на сторонах) этого прямоугольника.
Выходом данной программы должно быть время работы ТА алгоритма А и время работы ТВ алгоритма В в секундах.
Провести эксперименты на основе следующих данных:
q = 106, w = 106, n = 1, …, 106+1 с шагом 104, размещение точек псевдослучайное:
в режиме (1),
в режиме (2)
(нарисовать графики функций TА(n) и ТВ(n) для обоих случаев),
q = w = 0, …, 106 с шагом 104, n = 106, размещение точек псевдослучайное:
в режиме (1),
в режиме (2)
(нарисовать графики функций TА(n) и ТВ(n) для обоих случаев),
Сформулировать и обосновать вывод (на основе практических данных, для получения которых можно провести дополнительные эксперименты) о том, в каких случаях целесообразно применять алгоритм А, а в каких алгоритм В.
3.7. Поиск пары пересекающихся отрезков Постановка задачи
Задано множество S, состоящее из n отрезков на плоскости. Каждый отрезок si=S[i] (i = 1, 2,…, n) задан координатами его концевых точек в декартовой системе координат. Требуется определить, есть ли среди заданных отрезков по крайней мере два пересекающихся (см. [1], [3]). Если пересечение существует, то алгоритм должен выдать значение “истина” (“true”) и номера пересекающихся отрезков s1 и s2, в противном случае “ложь” (“false”).
Наивный алгоритм поиска пересечения
Перебираются пары отрезков до тех пор, пока не будет обнаружено пересечение, либо же не будут исчерпаны все пары.
function INTERSECTION_NAIVE(S, var s1, s2): boolean;
begin
INTERSECTION_NAIVE:= false;
for i:= 1 to n-1 do for j:=i+1 to n do if (S[i] пересекает S[j]) then begin
b:= true; s1:= S[i]; s2:= S[j]; INTERSECTION_NAIVE:= true; exit;
end;
end;
Временная сложность этого наивного алгоритма есть O(n2).
Эффективный алгоритм поиска пересечения
В этом алгоритме используется так называемый метод вертикальной заметающей прямой, движущейся в сторону возрастания абсциссы. В каждый момент времени заметающая прямая пересекает отрезки, которые образуют динамически меняющееся множество L. Отрезки в множестве L упорядочиваются по неубыванию ординат точек их пересечения с заметающей прямой. Множество L представляется АВЛ-деревом и модифицируется с помощью операций удаления и вставки элементов.
В алгоритме используются две операции ПОД(s, L) и НАД(s, L), позволяющие за время O(log |L|) определить непосредственно предшествующий отрезок и отрезок, непосредственно следующий за отрезком s в последовательности L.
Если не существует отрезка, предшествующего отрезку s или следующего за ним, то процедуры ПОД(s, L) и НАД(s, L) выдают произвольный отрезок, заведомо не пересекающийся с отрезками из множества S. Это требование введено для того, чтобы не усложнять алгоритм лишними деталями.
Операция ВСТАВИТЬ(s, L) осуществляется в момент, когда заметающая прямая достигает левого конца отрезка s, а операция УДАЛИТЬ(s, L), когда она достигает его правого конца. Обе эти операции осуществляются за время O(log |L|).
Полагаем, что точка ui = (ui.1, ui,2) лексикографически меньше точки vi = (vi.1, vi,2), если либо ui.1<vi.1, либо (ui.1=vi.1)&(ui.2<vi.2).
В алгоритме используется массив ТОЧКА[1..2n], элементы которого соответствуют концам отрезков. В каждом элементе представлены координаты точки, номер отрезка и информация о том, каким концом, левым или правым, для соответствующего отрезка является данная точка.
function INTERSECTION_EFFECTIVE(S, var s1, s2): boolean;
begin
Лексикографическая сортировка 2nконцов отрезков и помещение результата в массив ТОЧКА[1..2n];
INTERSECTION_EFFECTIVE:= false;
for i:= 1 to 2*n do
begin
p:= ТОЧКА[i];s:= отрезок, концом которого являетсяp;
if (p левый конец отрезка s) then begin
ВСТАВИТЬ(s, L);
s1:= НАД(s, L); s2:= ПОД(s, L);
if (s1 пересекает s) or (s2 пересекает s) then begin
INTERSECTION_EFFECTIVE:= true; exit;
end;
end else begin
s1:= НАД(s,L); s2:= ПОД(s, L);
if (s1 пересекает s2) then begin
INTERSECTION_EFFECTIVE:= true; exit;
end;
УДАЛИТЬ(s,L);
end;
end;
end;
Корректность работы алгоритма основана на том, что до момента, когда пересечение будет обнаружено и алгоритм, таким образом, завершит работу, включаемые в последовательность L и удаляемые из нее отрезки не меняют упорядочения остальных.
Временная сложность данного алгоритма с использованием АВЛ-дерева поиска пересечения есть O(nlog n).