- •1. Общие указания
- •2. Основные операции для работы с d-кучами
- •3. Лабораторная работа «Сравнение двух типов сортировок». Постановка задачи сортировки
- •Сортировка с помощью d-кучи
- •Пузырьковая сортировка
- •Быстрая сортировка
- •Сортировка слиянием
- •Задания для лабораторной работы
- •4. Лабораторная работа «Построение выпуклой оболочки системы n точек на плоскости» Постановка задачи
- •Построение выпуклой оболочки с помощью сортировки
- •Задания для лабораторной работы
- •5. Литература
1. Общие указания
Задание считается выполненным после представления программ и отчёта, содержащего следующие разделы:
описание алгоритмов,
обоснование теоретической оценки временной сложности алгоритмов,
описание реализующих алгоритмы программ,
проведенные эксперименты,
выводы.
В разделе «описание алгоритма» необходимо дать формальное описание алгоритма на каком-нибудь алгоритмическом языке или псевдокоде. Можно использовать описываемые далее псевдокоды. Следует привести пример работы алгоритма на данных из нескольких (7-8) элементов.
В разделе «обоснование теоретической оценки временной сложности алгоритмов» необходимо вывести трудоёмкости соответствующих алгоритмов. Вывод должен быть полным и строгим. Категорически запрещается использовать готовые формулы для трудоемкости сортировок (или отдельных её модулей). В большинстве своём, вывод трудоёмкости всех необходимых процедур рассказывается на лекции. Оставшуюся часть можно найти в [1] и [2] и в Интернете.
В разделе «описание реализующих алгоритмы программ» следует привести фрагменты написанной программы с комментариями. Полного программного кода можно и не приводить. Если всё же этот код приводится, то его необходимо поместить в раздел «приложение» после раздела «выводы».
В разделе «проведенные эксперименты» следует сравнить результаты экспериментов, дать объяснения обнаруженным различиям и отобразить результаты экспериментов с помощью графиков. В каждом эксперименте варьируется один параметр, обозначим его через k, в некоторых пределах K0<k<K1, при этом для каждого k фиксируется время t(k) работы алгоритма. На рисунке, соответствующем этому эксперименту, должны быть приведены графики функции t(k). Графики должны быть нарисованы так, чтобы:
графику непосредственно предшествовали параметры эксперимента,
указаны названия осей и масштаб,
В разделе «выводы» следует сделать и обосновать заключение о предпочтительности использования различных реализаций алгоритма в конкретных ситуациях.
2. Основные операции для работы с d-кучами
Предполагаем, что d-куча реализуется на массиве key[1..n] ключей.
Реализация основных операций для работы с d-кучами. Функция minchild(i, key, n, d) позволяет для i-го узла n-элементной d-кучи с массивом ключей key находить его непосредственного потомка с минимальным ключом. Если у i-го узла нет потомков, то minchild(i, key, n, d) = i. Данная функция использует функции first_child(n, d, i), last_child(n, d, i), father(n, d, i), выдающие номера первого потомка, последнего потомка и родителя узла i n-элементной d-кучи соответственно. Значение father(n, d, 1) = 1, и если у i-го узла нет потомков, то first_child(n, d, i) = 0, last_child(n, d, i) = 0.
function minchild (i, var key, n, d);
begin
kf:= first_child(n, d, i);
if kf = 0 then minchild:= i else
begin
kl:= last_child(n, d, i); min_key:= key[kf]; minchild:= kf;
for j := kf +1 to kl do
if key[j]< min_key then begin
min_key:= key[j]; minchild:= j;
end;
end;
end;
function first_child(n, d, i);
begin
k:= (i-1)d + 2; if k>n then first_child:= 0 else first_child:= k;
end;
function last_child(n, d, i);
begin
k:= first_child(n,d,i);
if k= 0 then last_child:= 0 else last_child:= min{k+d-1,n};
end;
function father(n, d, i);
begin
father:= (i – 2)div d +1;
end;
procedure ПОГРУЖЕНИЕ(i, var key, n, d);
begin
key0:= key[i]; c:= minchild(i, key, n, d);
while (c ≠ i) & (key0 > key[c]) do begin
key[i]:= key[c];
i:= c; c:= minchild (i, key, n, d);
end;
key[i]:= key0;
{+}
end;
procedure ВСПЛЫТИЕ(i; var key; n,d);
begin
key0:= key[i]; p:= father(n, d, i);
while (i ≠ 1) and (key[p] > key0) do begin
key[i]:= key[p];
i:= p; p:= father(n, d, i);
end;
key[i]:= key0;
{+}
end;
procedure ИЗЪЯТИЕ_МИНИМУМА (var key, var n, d);
begin
key1:= key[1];
key[1]:= key[n];
key[n]:= key[1];
n:= n-1;
if n>1 then ПОГРУЖЕНИЕ(1, name, key, n, d);
end;
procedure ОБРАЗОВАTЬ_ОЧЕРЕДЬ(var key, n, d);
begin
for i:= n downto 1 do ПОГРУЖЕНИЕ (i);
end;
Сводные данные о трудоемкости операций с n–элементными d-кучами
ПОГРУЖЕНИЕ |
O (d logd n) |
ВСПЛЫТИЕ |
O (logd n) |
ИЗЪЯТИЕ_МИНИМУМА |
O (d logd n) |
ОБРАЗОВАTЬ_ОЧЕРЕДЬ |
O (n) |