Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторные работы для 3-его курса по АРА.DOC
Скачиваний:
1
Добавлен:
24.08.2019
Размер:
129.02 Кб
Скачать

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

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

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

  • верхнюю q и нижнюю w границы для значений элементов массива,

  • заполнение массива a:

  • псевдослучайное,

  • автоматическое по неубыванию,

  • автоматическое по невозрастанию.

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

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

    1. q=1, w=109, n=1, … ,105+1 с шагом 103, заполнение массива a:

  • псевдослучайное,

  • по возрастанию,

  • по убыванию.

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

    1. q=1, w=1, … ,100 с шагом 1, n=105, заполнение массива a:

  • псевдослучайное,

  • по возрастанию,

  • по убыванию.

(привести в отчёте графики функций TА(w) и ТВ(w) для всех трех случаев).

Приведенные параметры экспериментов являются лишь отправной точкой и предназначены для проведения на компьютерах 2-3 летней давности. Если получается, что TА(n) и ТВ(n) (или TА(w) и ТВ(w)) чрезмерно близки или наблюдается не тот порядок роста этих функций, то следует увеличить один из параметров до устранения нежелательных эффектов.

Предлагаемые варианты для алгоритмов А и B:

Вариант 1.

  • A – Быстрая сортировка,

  • B – Сортировка 3-кучей.

Вариант 2.

  • A – Сортировка слиянием,

  • B – Сортировка 3-кучей.

Вариант 3.

  • A – Пузырьковая сортировка,

  • B – Сортировка 3-кучей.

Вариант 4.

  • A – Сортировка 2-кучей,

  • B – Сортировка 3-кучей.

Вариант 5.

  • A – Быстрая сортировка,

  • B – Сортировка 15-кучей.

Вариант 6.

  • A – Сортировка слиянием,

  • B – Сортировка 15-кучей.

Вариант 7.

  • A – Пузырьковая сортировка,

  • B – Сортировка 15-кучей.

Вариант 8.

  • A – Сортировка 2-кучей,

  • B – Сортировка 15-кучей.

Вариант 9.

  • A – Сортировка 14-кучей,

  • B – Сортировка 15-кучей.

Вариант 10.

  • A – Пузырьковая сортировка,

  • B – Быстрая сортировка.

Вариант 11.

  • A – Пузырьковая сортировка,

  • B – Сортировка слиянием.

Вариант 12.

  • A – Быстрая сортировка

  • B – Сортировка слиянием.

4. Лабораторная работа «Построение выпуклой оболочки системы n точек на плоскости» Постановка задачи

Для точек a1, …, an, где n≥1, ai=(ai,1, ai,2)R2 при i=1, …, n, требуется указать вершины b1, …, bm выпуклой оболочки Conv(a1, …, an) в порядке их встречи при движении по ее границе. Заметим, что в общем случае Conv(a1, …, an) будет многоугольником, а в вырожденных случаях может получиться отрезок или точка. В случае отрезка выходом решающего поставленную задачу алгоритма должны быть две являющиеся его концами точки, а в случае точки  сама эта точка.

Построение выпуклой оболочки с помощью сортировки

Для решения задачи (см. [3]) построения Conv(a1, …, an) мы из точек a1, …, an выберем точки с минимальной первой координатой, среди которых затем найдем точку c, имеющую минимальную вторую координату. Таким образом, точка c = lexmin(a1, … ,an) является лексикографическим минимумом точек a1, … ,an и поэтому представляет собой вершину выпуклой оболочки Conv(a1, …, an). Именно с неё мы и начнём обход границы против часовой стрелки, положив b1=c и осуществив перед этим для удобства промежуточных вычислений параллельный перенос системы координат так, чтобы её начало совпало с точкой с. После такого переноса на точках a1, …, an удается определить такой линейный порядок (≤), что для c1,c2 {a1-c, … ,an–c}имеет место c1 ≤ c2, если либо det(c1,c2)>0, либо (det(c1,c2)=0)&( (c1,1)2+(c1,2)2) < (c2,1)2+(c2,2)2 ).

Геометрический смысл такого упорядочения можно проиллюстрировать, если ввести полярную систему координат φ, r (-<φ ≤, r0) с центром в точке c и далее положить, что c1 ≤ c2, если (φ1,r1) лексикографически не превосходит (φ2,r2), где числа φi, ri являются полярными координатами точки ci, i = 1,2.

Таким образом, c1 ≤ c2, если либо φ< φ2, либо (φ1 = φ2)&(r1 ≤ r2). Как только линейный порядок на элементах (точках) a1, …, an определен, немедленно можем воспользоваться сортировкой, для того чтобы отсортировать эти элементы по неубыванию в соответствии с введенным линейным порядком. После этого мы произведем за время O(n) просмотр отсортированного массива с целью получения итоговых точек b1, …, bm исходя из того условия, что точка bi+1 располагается строго слева от вектора, идущего из точки bi-1 в точку bi, что эквивалентно требованию того, чтобы det(bi-bi-1,bi+1-bi)>0.

Описанные действия конкретизируются алгоритмом, представляемым процедурой CONV_SORT (a, n), на вход которой подается массив точек a[1], …, a[n]. Итоговые точки b1, …, bm, являющиеся решением задачи, будут представлены в той же последовательности в первых m элементах a[1], …, a[m] массива a. Отметим также, что в процедуре CONV_SORT используется подпрограмма сортировки СОРТИРОВКА (a, n), выдающая отсортированный по неубыванию массив a.

procedure CONV_SORT (var a, n);

begin

c:= a[1]; m:= 1;

for i:= 2 to n do if a[i][1]<c[1] then begin c:= a[i]; m:= i;

end else if a[i][1]=c[1] then if a[i][2]<c[2] then begin

c:= a[i]; m:= i;

end;

a[1]a[m]; m:= 1;

for i:= 1 to n do a[i]:= a[i]-c;

СОРТИРОВКА(a, n);

for i:= 2 to n do if a[i]  a[m] then begin

if m  2 then while (m  2)&(det(a[m]-a[m-1],a[i]-a[m]) 0) do m:= m-1;

m:= m+1; a[m]a[i];

end;

for i:= 1 to m do a[i]:= a[i]+c;

end;

Временная сложность алгоритма построения выпуклой оболочки точек в случае, если используется сортировка с помощью d–кучи или сортировка слиянием, есть величина O(nlog n), если же используется быстрая сортировка, то временная сложность алгоритма в худшем случае O(n2), а в среднем алгоритм выполняется за время O(nlog n).