Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
АиПА / Контрольная / Задания для КР [рус].doc
Скачиваний:
10
Добавлен:
07.02.2016
Размер:
115.2 Кб
Скачать

2

МиНиСТЕРСТВО Образования и НАУКИ УКРАиНы

Запорожский национальный технический университет

Факультет информатики и вычислительной техники

анализ и построение алгоритмов

Задания к контрольным работам

и методические указания для самостоятельной работы

для студентов специальности 7.091501

"Компьютерные сети и системы"

заочной формы обучения

2007

Анализ и построение алгоритмов. Методические указания и задания к контрольным работам и методические указания для само-стоятельной работы для студентов специальности 7.091501 "Компью-терные сети и системы" заочной формы обучения.

Сост. Пинчук В.П., - Запорожье: ЗНТУ, 2007.- 17 с.

Составитель: В.П. Пинчук, доцент, канд. физ.-мат. наук,

Рецензент: Н.И. Белая, доцент, канд. физ.-мат. наук,

Ответственный за выпуск: Г.В. Корнич, профессор

Утверждено на заседании кафедры вычислительной математики, протокол № __ от __. ___ 2007 р.

Издание содержит индивидуальные задания для выполнения контрольной работы, методические указания и рекомендации для самостоятельной работы по дисциплине "Анализ и построение алгоритмов". Приводится список литературы, рекомендуемой для самостоятельной работы и подготовки к зачету.

Содержание

1 Методические указания по выполнению контрольной работы 3

2 Тематика заданий к контрольной работе 7

3 Варианты заданий контрольной работы 7

4 Литература 17

Приложение. Таблица вариантов заданий 18

1 Методические указания по выполнению контрольной РаБоТы

Контрольные работы по дисциплине "Анализ и построение алгоритмов" выполняются в 5 семестре, они являются средством контроля самостоятельной работы студента и степени освоения знаний и умений по изучаемой дисциплине. Для выполнения лабораторных работ предусматривается использование знаний, которые получены при обучении в предыдущих семестрах. Используются знания в области математики, методов вычислений, программирования.

Для выполнения контрольных работ рекомендуется использование языка программирования С++, операционной среды типа Windows или Linux и компиляторов, которые соответствуют стандарту ANSI/ISO C++. Данные для тестирования написанных программ и программных компонентов студент выбирает самостоятельно или по рекомендации преподавателя. По каждому заданию оформляется отчет, он должен соответствовать действующим стандартам ЗНТУ.

Номер варианта задания определяется с помощью таблицы, которая приводится в приложении, по последней цифре номера зачетной книжки. Всего предусмотрено 10 вариантов с номерами от 0 до 9.

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

Все задания выполняются в последовательности, приведенной ниже.

1. Построить или выбрать алгоритм для решения заданной задачи.

2. Алгоритм реализовать в виде функции С++.

3. Создать программу для проверки правильности построенного алгоритма (программа А).

4. Создать программу численного исследования функции временной сложности Ft(n) своего алгоритма (программа В). Программа B должна предусматривать:

а) вывод таблицы функции Ft(n) на экран;

б) преобразование полученных табличных значений функции Ft(n) к таким координатам, в которых она становится линейной (линеаризация графика функции);

в) вывод на экран линеаризованного графика функции Ft(n);

г) вычисление параметров эффективности алгоритма.

5. Выполнить анализ полученных результатов.

Если полученные значения функции Ft(n) в координатах log(n)log(t) хорошо ложатся на прямую линию, это служит доказательством того, что исследуемый алгоритм относится к классу полиномиальных (по времени) алгоритмов. Обозначим:

x = log(n) , y = log(t) .

Для проверки того, является ли алгоритм полиномиальным, выполняем аппроксимацию таблицы зависимости y(x), используя линейную аппроксимирующую функцию:

y = a0+ a1x .

Коэффициент a1представляет собой порядок полиномиального алгоритма (алгоритм будет полиномиальным, если линейная аппроксимация является достаточно точной). Для программирования линейной аппроксимации можно использовать функцию linappr из модуля syst.h. Дополнительную информацию об этой функции можно посмотреть в файле syst.doc пакета программ VP/C++.

Если значения функции Ft(n) не ложатся на прямую в координатах

log(n) log(t) следует проверить алгоритм на принадлежность к другим категориям сложности. Для проверки того, относится ли алгоритм к классу экспоненциальных по времени алгоритмов, следует построить график функции сложности в координатах nlog(t) и проверить, является ли зависимость y(x), где x = n, y = log(t), линейной. Таким образом, подбирая соответствующий способ линеаризации функции сложности алгоритма, можно эксперименталь-о установить, к какой категории сложности он относится.

Результаты выполнения задания контрольной работы описываются в следующей последовательности:

- формулировка задачи;

- описание используемых методов и алгоритмов;

- программа, подтверждающая правильность построенного алгоритма;

- программа расчета таблицы для временной функции сложности алгоритма;

- заключение об эффективности алгоритма и его принадлежнос-ти к определенному классу.

Ниже приведен пример построения программ для выполнения задания контрольной работы.

Задание

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

Построение программы А

Программа А должна решать задачу упорядочивания массива методом вставки и служить доказательством правильности построенного (выбранного) алгоритма. Алгоритм реализуется в виде отдельной процедуры (функции) sort_insert(n, A), где n - размер исходного массива, А - имя массива (указатель на массив). Для проверки правильности алгоритма и его реализации используются случайные числа, для получения которых применяется стандартная библиотечная функция random(M).

// Программа А

#include <syst.h>

void sort_insert(int n, int* A)

{ int i, j, key;

for (j=1; j<n; j++)

{ key=A[j]; // key - буфер для запоминания

i=j-1;

while (i>=0 && A[i]>key) { A[i+1]=A[i]; i--; }

A[i+1]=key;

}

}

void main()

{ int i,n;

printf("n = "); scanf("%d",&n);

// Ввод размера исходного массива

int* A= new int[n];

for (i=0;i<n;i++) A[i]= random(100);

for (i=0;i<n;i++) printf("%2d ",A[i]); printf("\n");

sort_insert(n,A);

for (i=0;i<n;i++) printf("%2d ",A[i]); printf("\n");

pause;

}

Построение программы В

Программа должна вычислять таблицу функции сложности и, решая соответствующую задачу аппроксимации, определяет порядок алгоритма, т.е. порядок полинома, который соответствует функции t = F(n). Ниже приводится пример программы, выполняющей действия, соответствующие этапу В. Программа вычисляет таблицу функции сложности (времени выполнения) исследуемого алгоритма, выводит ее на экран и, далее, решая соответствующую задачу аппроксимации данных, находит порядок алгоритма. При этом предполагается, что алгоритм является полиномиальным, т.е. его функция сложности t = F(n) представляет собой полином относитель-но n порядка p, где p - порядок алгоритма.

// Программа В

#include <syst.h>

void sort_insert(int n, int* A)

{ int i, j, key;

for (j=1; j<n; j++)

{ key=A[j];

i=j-1;

while (i>=0 && A[i]>key) { A[i+1]=A[i]; i--; }

A[i+1]=key;

}

}

const int M=6;

void main()

{ randomize();

int i,k,n=4096;

double t;

double x[M],y[M];

int* a;

for (k=0;k<M;k++)

{ a= new int[n];

for (i=0;i<n;i++) a[i]= random(1000000);

runtimer();

sort_insert(n,a);

t=timer();

x[k]=log2(n); y[k]=log2(t);

printf("k=%d n=%6d t=%f \n", k,n,t);

n*=2;

delete[] a;

}

double a0,a1;

linappr(M,x,y,a0,a1);

printf("\n p = %6.4f \n",a1);

delete[] a;

printf("\7"); pause;

}