Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
отчет_Буяков_СВ_8306.doc
Скачиваний:
7
Добавлен:
26.10.2018
Размер:
423.94 Кб
Скачать

2. Обоснование теоретических оценок временной сложности алгоритмов

Неотрицательная функция есть , если существует такая постоянная , что , для всех, кроме конечного (возможно пустого) множества, неотрицательных значений .

Алгоритм сортировки с использованием d-кучи

Лемма 1

Утверждение

Высота d-кучи с узлами удовлетворяет неравенству .

Доказательство

Минимальное число узлов на глубине равно .

Максимальное число узлов на глубине равно .

Суммируя левую и правую части как геометрические прогрессии, получим .

Логарифмируя, получим .

Лемма 2

Утверждение

Операция погружение в d-куче имеет временную оценку , где – количество узлов в куче.

Доказательство

Операция погружения узла проводится до тех пор, пока есть потомок с меньшим весом. То есть, максимум при погружении узла погружение будет проходить раз (где – высота кучи). На каждом уровне кучи максимум будет проводиться сравнений, так как узел максимум имеет потомков. Получаем, что временная оценка операции погружения принадлежит классу функций , или .

Теорема

Утверждение

Временная сложность алгоритма сортировки массива из n-элементов с использованием d-кучи принадлежит классу функций , где – количество узлов в куче, – высота d-кучи.

Доказательство

Рассмотрим поэтапно алгоритм сортировки.

1.Окучивание. Так как на этом этапе будет произведено операций погружения, временная оценка этого этапа сортировки принадлежит классу функций .

2. Изъятие минимума. Так как на этом этапе будет произведено операций погружения, временная оценка этого этапа сортировки принадлежит классу функций .

3. Перестановка элементов массива в обратном порядке. Временная оценка этого этапа сортировки принадлежит классу функций .

Итоговая временная оценка сортировки с помощью d-кучи есть сумма временных оценок всех ее этапов: .

В результате временная оценка сортировки с помощью 7-кучи принадлежит классу функций .

Алгоритм быстрой сортировки

Для доказательства того, что время работы составляет , мы используем метод подстановки. Пусть – наибольшее время работы алгоритма для массива длины . Тогда, очевидно,

(мы рассматриваем все возможные разбиения на первом шаге).

Докажем что существует такое, что для всех , меньших некоторого . Тогда

.

Квадратный трехчлен достигает максимума на отрезке в его концах (вторая производная по положительна, поэтому функция выпукла вниз). Этот максимум равен . Отсюда получаем

,

если константа c выбрана так, чтобы . Выразим отсюда :

.

Из этого следует, что , следовательно , при .

Из всего этого получаем, что временная оценка быстрой сортировки принадлежит классу функций (по определению).

3. Описание реализующих алгоритмы программ

Алгоритм сортировки с использованием d-кучи

//погружение

void HEAP :: Down(int i)

{

int key0, c;

key0=key[i];

c=MinChild(i);

while((c!=0)&&(key0>key[c]))

{

key[i]=key[c];

i=c;

c=MinChild(i);

}

key[i]=key0;

}

//образовать очередь

void HEAP :: MakeQueue()

{

int i;

for(i=n-1; i>=0; i--)

{

Down(i);

}

}

//изъятие минимума

void HEAP :: MinOut()

{

int key0;

key0=key[0];

key[0]=key[n-1];

key[n-1]=key0;

n=n-1;

if(n>1)

{

Down(0);

}

}

//сортировка d-кучей

void HEAP :: HeapSorting()

{

int Size=n;

MakeQueue();

while(n>0)

{

MinOut();

}

n=Size;

}

Алгоритм быстрой сортировки

//быстрая сортировка

void QUICK :: QuickSorting(int left, int right)

{

int i, j, x, y;

i=left;

j=right;

x=key[(left+right)/2];

do

{

while(key[i]<x && i<right) i++;

while(x<key[j] && j>left) j--;

if(i<=j)

{

y=key[i];

key[i]=key[j];

key[j]=y;

i++;

j--;

}

}

while(i<=j);

if(left<j) QuickSorting(left, j);

if(i<right) QuickSorting(i, right);

}