МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
ЗВІТ
З лабораторної роботи №1
з дисципліни “Алгоритми та методі обчислень”
на тему: “Властивості, параметри та характеристики
складності алгоритму”
Варіант 21
1.Завдання:
Скласти програму (C/C++), яка дозволяє провести порівняння трьох алгоритмів
знаходження НСД за характеристикою часової складності для таких вхідних даних:
2.Варіант завдання.
Варіант № 21 N1 = 526 N2 = 521
3. Алгоритм виконання завдання:
/
4. Результат виконання програми:
/
Рис.1. Результат виконання програми
4. Складність алгоритму:
Відношення часу роботи до кількості стрічок коду
1-ша алгоритм: 5563ns – 40 = 139.08
2-га алгоритм: 25ns – 21 = 1.19
3-тя алгоритм: 28ns – 19 = 1.47
Тому можна вважати, що найефективнішим алгоритмом є 2 алгоритм.
5. Висновок:
На даній лабораторній роботі я навчився порівнювати часові характеристики двох алгоритмів, застосованих для вирішення одного завдання.
Код програми:
//to measure time it is better to run with Linux
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N1 526
#define N2 521
#define MIN(a,b) (((a)<(b))?(a):(b))
#define MAX(a,b) (((a)>(b))?(a):(b))
#define REPEAT_COUNT 1000000
#define REPEATOR(count, code) \
for (unsigned int indexIteration = (count); indexIteration--;){ code; }
#define TWO_VALUES_SELECTOR(variable, firstValue, secondValue) \
(variable) = indexIteration % 2 ? (firstValue) : (secondValue);
double getCurrentTime(){
clock_t time = clock();
if (time != (clock_t)-1) {
return ((double)time / (double)CLOCKS_PER_SEC);
}
return 0.; // else
}
unsigned long long int f1_GCD(unsigned long long int variableN1, unsigned long long int variableN2){
unsigned long long int returnValue = 1;
for(unsigned long long int i = 1, k = MIN(variableN1, variableN2); i <= k; i++){
if(!(variableN1 % i || variableN2 % i)){
returnValue = i;
}
}
return returnValue;
}
unsigned long long int f2_GCD(unsigned long long int a, unsigned long long int b){
for(unsigned long long int aModB;
aModB = a % b,
a = b,
b = aModB;
);
return a;
}
unsigned long long int f3_GCD(unsigned long long int a, unsigned long long int b){
if(!b){
return a;
}
return f3_GCD(b, a % b); // else
}
int main() {
unsigned long long int vN1 = N1, vN2 = N2, a = MAX(vN1, vN2), b = MIN(vN1, vN2),
vN1_ = vN1, vN2_ = vN2, a_ = a, b_ = b,
returnValue;
double startTime, endTime;
// f1_GCD
startTime = getCurrentTime();
REPEATOR(REPEAT_COUNT,
TWO_VALUES_SELECTOR(vN1, 16, vN1_);
TWO_VALUES_SELECTOR(vN2, 4, vN2_);
returnValue = f1_GCD(a, b);
)
endTime = getCurrentTime();
printf("f1_GCD return %d \r\nrun time: %dns\r\n\r\n",
returnValue,
(unsigned int)((endTime - startTime) * (double)(1000000000 / REPEAT_COUNT)));
// f2_GCD
startTime = getCurrentTime();
REPEATOR(REPEAT_COUNT,
TWO_VALUES_SELECTOR(a, 16, a_);
TWO_VALUES_SELECTOR(b, 4, b_);
returnValue = f2_GCD(a, b);
)
endTime = getCurrentTime();
printf("f2_GCD return %d \r\nrun time: %dns\r\n\r\n",
returnValue,
(unsigned int)((endTime - startTime) * (double)(1000000000 / REPEAT_COUNT)));
// f3_GCD
startTime = getCurrentTime();
REPEATOR(REPEAT_COUNT,
TWO_VALUES_SELECTOR(a, 16, a_);
TWO_VALUES_SELECTOR(b, 4, b_);
returnValue = f3_GCD(a, b);
)
endTime = getCurrentTime();
printf("f3_GCD return %d \r\nrun time: %dns\r\n\r\n",
returnValue,
(unsigned int)((endTime - startTime) * (double)(1000000000 / REPEAT_COUNT)));
printf("Press any key to continue . . .");
getchar();
return 0;
}