Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Алгоритмы и структуры данных.doc
Скачиваний:
81
Добавлен:
01.05.2014
Размер:
411.14 Кб
Скачать

Задания для лабораторной работы № 6

Предлагается попарное сравнение различных использующих сортировку алгоритмов построения выпуклой оболочки n точек на плоскости с целочисленными координатами.

Варианты выбора пары алгоритмов A и B для сравнения:

Вариант d=2, …, 101

  • А  используется сортировка d-кучей,

  • В  используется сортировка (d+1)-кучей;

Вариант d=102, …., 200

  • А  используется сортировка (d-100)-кучей,

  • В  используется быстрая сортировка.

Задание.

  1. Написать программу, реализующую алгоритм А и алгоритм В.

  2. Написать программу, реализующую алгоритм А и алгоритм В, для проведения экспериментов, в которых можно выбирать:

  • количество n точек в исходном массиве a,

  • натуральные числа q и w для псевдослучайного размещения всех n точек в двух режимах:

  1. в прямоугольнике со сторонами длины q и w,

  2. на границе (на сторонах) этого прямоугольника.

Выходом данной программы должно быть время работы ТА алгоритма А и время работы ТВ алгоритма В в секундах.

  1. Провести эксперименты на основе следующих данных:

    1.  q = 106, w = 106, n = 1, …, 106+1 с шагом 104, размещение точек псевдослучайное:

  • в режиме (1),

  • в режиме (2)

(нарисовать графики функций TА(n) и ТВ(n) для обоих случаев),

    1.  q = w = 0, …, 106 с шагом 104, n = 106, размещение точек псевдослучайное:

  • в режиме (1),

  • в режиме (2)

(нарисовать графики функций TА(n) и ТВ(n) для обоих случаев),

  1. Сформулировать и обосновать вывод (на основе практических данных, для получения которых можно провести дополнительные эксперименты) о том, в каких случаях целесообразно применять алгоритм А, а в каких  алгоритм В.

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(nlog n).