Professional Documents
Culture Documents
ASP - 01-Slozenost Na Algoritmi PDF
ASP - 01-Slozenost Na Algoritmi PDF
Час 1
Вовед
Пишувањето на програми може да биде тежок процес, посебно ако се прави без
да се следат добри препораки или упатства. Структурното програмирање е еден
принцип за развој на програми кои го “разбива“ кодот на помали делови што
соодветствува на решавањето на сложен проблем со негово делење на
поедноставни проблеми. Со овој процес се дава одредена структура на развојот
на програми, од каде потекнува и името на овој пристап.
1
на сите можни влезни податоци со кои тој алгоритам ќе работи, поведенија или
постапки за нивна обработка, како и сите можни излезни податоци кои
алгоритамот ќе ги креира. Важно е да се направи разлика помеѓу правилно
поведение за група влезни податоци и правилно поведение за сите можни
влезни податоци.
Според тоа алгоритам е процес кој прима било кој можен влез и го
трансформира во посакуван излез.
2
ограничувања (не постои побрз хардвер) и економски ограничувања (нема пари
за да се купи побрз хардвер).
3
1. Споредба на алгоритми
1.1 Асимптотска анализа
Споменатиот хипотетички компјутер RAM ќе го користиме за споредба на
ефикасноста на два алгоритми. За секој од алгоритмите се бројат операциите
при извршувањето како што беше објаснето во воведниот дел.
4
Сепак, не е толку едноставно. Во општ случај не се знае колку може да биде n
(10,...,100,...,100 000,…,1000 000). Ако може да се покаже дека TА(n) ≤ Tв(n) за
сите n ≥ 0, тогаш алгоритамот А побргу се извршува и тој е подобар од
алгоритамот В.
Дефиниција за асимптотска горна граница: велиме дека f(n) = O(g(n)) ако постои
no и некоја константа c > 0 така што за сите
Поинаку кажано: за функцијата f(n) постои функција g(n) која секогаш “е над” неа,
за било колкав број податоци n почнуваќи од некое n0 т.е. f(n) може да го
опишеме со помош на g(n).
5
Пример:
Значи, една можна асимптотска горна граница на f(n) е O(n2 ). Малку подоцна ќе
биде опишано како таа се одредува кога се работи за определување сложеност
на алгоритмите.
6
Да се вратиме на почетокот на овој дел – определување сложеност на даден
алгоритам и споредување различни алгоритми.
sum(
int
n
)
{
/*1*/
partial_sum
=
0;
/*
1
*/
/*2*/
for(
i=1;
i<=n;
i++
)
/*
2n+2
*/
/*3*/
partial_sum
+=
i*i*i;
/*
4n
*/
/*4*/
return
partial_sum;
/*
1
*/
}
/*
6n+4
-‐>
O(n)
*/
Велиме дека овој алгоритам е од ред О(n) или дека има линеарна сложеност.
7
1.1 Правила
Циклуси
Вгнездени циклуси
Последователни времиња.
lF/ELSE:
Фрагментот
if(
cond
)
S1
else
S2
8
Рекурзии
factorial(
n
)
{
if(
n
<=
1
)
return
1;
else
return
n
*
factorial(n-‐1);
}
9
1.2 Принципи на споредба
Пример:
За влез: -2, 11, -4, 13, -5, -2, одговорот е 20 (a2 до a4).
АЛГОРИТАМ 1
max_subsequence_sum(
a[],
n
)
{
/*1*/
max_sum
=
0;
best_i
=
best_j
=
-‐1;
/*2*/
for(
i=0;
i<n;
i++
)
/*3*/
for(
j=i;
j<n;
j++
)
{
/*4*/
this_sum=0;
/*5*/
for(
k
=
i;
k<=j;
k++
)
/*6*/
this_sum
+=
a[k];
/*7*/
if(
this_sum
>
max_sum
)
{
/*
update
max_sum,
best_i,
best_j
*/
/*8*/
max_sum
=
this_sum;
/*9*/
best_i
=
i;
/*10*/
best_j
=
j;
}
}
/*11*/
return
max_sum;
}
10
За да се потврди точноста на пристапот ќе биде направена и подетална
анализа која разгледува колку пати се извршува чекорот 6 односно
n n j
пресметува колку пати се извршува: ∑∑∑ .
i =1 j = i k = i
∑1 = j − i + 1
k =i
n
(n − i + 1)(n − i + 2)
∑ ( j − i + 1) = (сума на првите n – i + 1 броеви)
j =i 2
n
(n − i + 1)(n − i + 2) 1 n 2 3 n 1 2 n
∑ = ∑ i − ( n + ) ∑ i + ( n + 3n + 2) ∑ 1=
i =1 2 2 i =1 2 i =1 2 i =1
11
АЛГОРИТАМ 2
max_subsequence_sum(
a[],
n
)
{
/*1*/
max_sum
=
0;
best_i
=
best_j
=
-‐1;
/*2*/
for(
i=0;
i<n;
i++
)
{
/*3*/
this_sum
=
0;
/*4*/
for(
j=i;
j<n;
j++
)
{
/*5*/
this_sum
+=
a[j];
/*6*/
if(
this_sum
>
max_sum
)
/*
update
max_sum,
best_i,
best_j
*/;
}
}
/*7*/
return
max_sum;
}
На пример во низата
12
АЛГОРИТАМ 3
max_sub_sequence_sum(
a[],n
)
{
return
max_sub_sum(
a,
0,
n-‐1
);
}
int
max_sub_sum(
a[],
left,
right
)
{
/*1*/
if
(
left
==
right
)
/*
Base
Case
*/
/*2*/
if(
a[left]
>
0
)
/*3*/
return
a[left];
else
/*4*/
return
0;
/*5*/
center
=
(left
+
right
)/2;
/*6*/
max_left_sum
=
max_sub_sum(
a,
left,
center
);
/*7*/
max_right_sum
=
max_sub_sum(
a,
center+1,
right
);
/*8*/
max_left_border_sum
=
0;
left_border_sum
=
0;
/*9*/
for(
i=center;
i>=left;
i-‐-‐
)
{
/*10*/
left_border_sum
+=
a[i];
/*11*/
if(
left_border_sum
>
max_left_border_sum
)
/*12*/
max_left_border_sum
=
left_border_sum;
}
/*13*/
max_right_border_sum
=
0;
right_border_sum
=
0;
/*14*/
for(
i=center+1;
i<=right;
i++
)
{
/*15*/
right_border_sum
+=
a[i];
/*16*/
if(
right_border_sum
>
max_right_border_sum
)
/*17*/
max_right_border_sum
=
right_border_sum;
}
/*18*/
return
max3(
max_left_sum,
max_right_sum,
max_left_border_sum
+
max_right_border_sum
);
}
T(1) = 1
T(n) = 2T(n/2) + O(n)= 2T(n/2) + n
тогаш
13
T(2) = 4 = 2 * 2, T(4) = 12 = 4 * 3, T(8) = 32 = 8 * 4, T(16) = 80 = 16 * 5.
АЛГОРИТАМ 4
max_subsequence_sum(
ia[],
n
)
{
/*1*/
i
=
this_sum
=
max_sum
=
0;
best_i
=
best_j
=
-‐1;
/*2*/
for(
j=0;
j<n;
j++
)
{
/*3*/
this_sum
+=
a[j];
/*4*/
if(
this_sum
>
max_sum
)
{
/*
update
max_sum,
best_i,
best_j
*/
/*5*/
max_sum
=
this_sum;
/*6*/
best_i
=
i;
/*7*/
best_j
=
j;
}
else
/*8*/
if(
this_sum
<
0
)
{
/*9*/
i
=
j
+
1;
/*10*/
this_sum
=
0;
}
}
/*11*/
return
max_sum;
}
14
Во следната табела се дадени времињата за извршување на предходните
четири алгоритми за различен број на влезни податоци:
15
Најчестите кардиналности, или “класи” функции со кои опишуваме било кој
алгоритам се дадени во табела 1.2:
ln n 0 1 2 4 8 12 16
16
1.4 Нотации
Покрај О-нотацијата, постојат и други нотации кои помагаат
уште поточно да се опишат алгоритмите.
Ω -нотација
Θ -нотација
17
o-нотација (ретко се користи во анализа на алгоритми)
18