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

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 logn)

ВСПЛЫТИЕ

O (logn)

ИЗЪЯТИЕ_МИНИМУМА

O (d logd n)

ОБРАЗОВАTЬ_ОЧЕРЕДЬ

O (n)