
Види функції складності алгоритмів
Функція складності О(1). В алгоритмах константної складності більшість операцій в програмі виконуються один або декілька раз. Будь-який алгоритм, що завжди потребує незалежно від розміру даних одного і того ж часу, має константну складність.
Функція складності O(N). Час роботи програми лінійний, коли кожний елемент вхідних даних треба опрацювати лише лінійне число раз.
Функція складності O(N2), O(N3), O(Na) – поліноміальна функція складності.
Функція складності O(log2N), O(N log2N). Такий час роботи мають ті алгоритми, які поділяють велику проблему на множину невеликих, а потів, вирішивши її, об’єднують рішення.
Функція складності O(2N). Експоненціальна складність. Такі алгоритми найчастіше виникають у результаті підходу, що називається «метод грубої сили».
Часова функція складності
Часова складність алгоритму може бути порахована, виходячи із аналізу його керівних структур.
Алгоритми без циклів та рекурсивних викликів мають константну складність. Якщо немає рекурсії та циклів, то всі керівні структури можуть бути зведені до структур константної складності. Отже, весь алгоритм також характеризується константною складністю. Визначення складності алгоритму переважно зводиться до аналізу циклів та рекурсивних викликів.
Наприклад, розглянемо алгоритм обробки елементів масиву:
For i:=1 to N do
Begin
…
End;
Складність цього алгоритму O(N), так як тіло циклу виконується N раз, і складність тіла циклу дорівнює О(1). Якщо один цикл вкладений в інший та обидва цикли залежать від розміру однієї і тієї ж змінної, то вся конструкція характеризується квадратичною складністю:
For i:=1 to N do
For j:=1 to N do
Begin
…
End;
Складність цієї програми O(N2).
Аналіз функції складності за програмою
Існує два способи аналізу складності алгоритму: висхідний (від внутрішніх керівних структур до зовнішніх) та низхідний (від зовнішніх структур до внутрішніх).
Приклад 2. Оцінимо складність програми «Трійки Піфагора»:
O(A) = O(1) + O(1) + O(1) = O(1);
O(B) = O(C) = O(J) = O(K) = O(L) = 1;
O(H) = O(1) + O(1) + O(1) = O(1);
O(F) = O(1) + O(H) = O(1) + O(1) = O(1);
O(I) = O(N)* (O(F)+O(J)) = O(N) * O(домінанти умови) = O(N);
O(G) = O(N)* (O(C) + O(I) + O(K)) = O(N)*(O(1) + O(N) + O(1)) = O(N2);
O(E) = O(N)*(O(B) + O(G) + O(L)) = O(N)*O(N2) = O(N3);
O(D) = O(A)+ O€ = O(1) + O(N3) = O(N3).
Складність даного алгоритму O(N3).
Варіанти завдань
Завдання 1.
Провести аналіз складності алгоритму, для цього підрахувати число базових операцій та функцію складності. Побудувати графік ефективності програми.
Варіант 1
program matrixadd(input, output);
const maxN=l0;
var p, q, r: array [0..maxN, 0..maxN] of real;
N, i, j: integer;
begin
readln (N) ;
for i:=0 to N-l do for j:=0 to N-l do read(p[i, j]);
for i:=0 to N-l do for j:=0 to N-l do read(q[i, j]);
for i:=0 to N-l do for j:=0 to N-l do r[i, j]:=p[i, j]+q[i, j];
for i:=0 to N-l do for j:=0 to N do
if j=N then writeln else write(r[i, j]);
end.
Варіант 2
program gauss(input, output);
const maxN=50;
var a: array[1..maxN, l..maxN] of real;
i, J, k, N: integer;
begin
readln (N) ;
for j:=l to N do
begin for k:=l to N+1 do read(ab, k]); readln end;
for i:=l to N do
for j:=i+l to N do
for k:=N+l downto i do
[ab,k]:=aIj,k]-a[i,k]*ab,i]/a[i,i];
for j:=l to N do
begin for k:=l to N+1 do write(ab, k]); writeln end;
end.
Варіант 3
procedure eliminate;
var i, j, k, max: integer;
t: real;
begin
for i:=l to Ndo
begin
max:=i;
for j:=i+l to N do
if abs(a[j, i])>abs(a[max, i]) then max:=j;
for k:=i to N+l do
begin t:=a[i, k]; a[i, k] :=a[max, k]; a[max, k] :=t end;
for j:=i+l to N do
for k:=N+l downto i do
ab,k]:=ab,k]-a[i,k]*ab,i]/a[i,i];
end
end;
Варіант 4
Варіант 5
Варіант 6
var s:string;
r:real;
i,j,n:integer;
begin
r:=0;
readln(s);
for i:=1 to length(s) do begin
n:=0;
for j:=1 to length(s) do begin
if s[i]=s[j] then inc(n);
end;
r:=r+1/n;
end;
writeln('количество различных букв = ', r:1:0);
end.
Варіант 7
program MaximuM;
const
m = 7;
n = 4;
var
Matrix: array[1..m, 1..n] of integer;
i,j,max,smax: integer;
Begin
Writeln('Матрица:');
max:= -41;
smax:= 1;
Randomize;
for i:=1 to m do begin
for j:=1 to n do begin
Matrix[i, j]:=Random(71)-40;
Write( (Matrix[i, j]):4 );
if (Matrix[i, j] > max) then
begin
max:= Matrix[i, j];
smax:= i;
end;
end;
Writeln;
end;
Writeln('Максимальный элемент ', max,' в строке ',smax,':');
Writeln('Новая матрица:');
for i:= m downto smax+1 do begin
for j:=1 to n do begin
if (i = smax + 1) then Matrix[i, j]:= Matrix[1, j] else
if smax <> m then Matrix[i, j]:= Matrix[i-1, j];
end;
end;
for i:=1 to m do begin
for j:=1 to n do begin
Write( (Matrix[i, j]):4 );
end;
Writeln;
end;
Readln;
End.
Варіант 8
Варіант 9
Варіант 10
Варіант 11
Варіант 12
Варіант 13
program minImax;
uses crt;
const
N = 9;
type Mas = array[1..N,1..N] of integer;
var
M: Mas;
i,j,s: integer;
min,max,jmin,imax: integer;
Begin
clrscr;
Writeln;
Randomize;
TextAttr:=15;
for i:=1 to N do begin
for j:=1 to N do begin
M[i,j]:=Random(10);
Write(' ',M[i,j]:3);
end;
Writeln;
end;
max:=M[1,1];imax:=1;
min:=M[1,1];jmin:=1;
for i:=1 to N do begin
for j:=1 to N do begin
if M[i,j] > max then begin
max:=M[i,j];imax:=i;
end;
if M[i,j] < min then begin
min:=M[i,j];jmin:=j;
end;
end;
end;
Writeln;
Writeln('max= ',max,' в строке ',imax);
Writeln('min= ',min,' в столбце ',jmin);
Writeln;
for i:=1 to N do begin
for j:=1 to N do begin
if (i=imax) or (j=jmin) then TextAttr:=11 else TextAttr:=8;
Write(' ',M[i,j]:3);
end;
Writeln;
end;
Writeln;
Write('Скалярное произведение ',imax,' строки на ',jmin,' столбец: ');
for i:= 1 to N do
s:= s + M[i,jmin]*M[imax,i];
Write(s);
Readln;
End.
Варіант 14
program M_x_N;
type
Tmatrix = array[1..1] of integer;
var
Matrix: ^Tmatrix;
Sums: ^Tmatrix;
Nums: ^Tmatrix;
i,j,k1,k2,m,n: integer;
Begin
Write('Введите n:');
Readln(n);
Write('Введите m:');
Readln(m);
Write('Введите k1:');
Readln(k1);
Write('Введите k2:');
Readln(k2);
GetMem(Matrix,n * m * sizeOf(integer));
GetMem(Sums,n * sizeOf(integer));
GetMem(Nums,n * sizeOf(integer));
for j:=1 to n do begin
Nums^[j]:= 0;
Sums^[j]:= 0;
end;
Writeln;
Writeln('Матрица:');
Randomize;
for i:=1 to m do begin
for j:=1 to n do begin
Matrix^[(j-1)*n+i]:=Random(71)-40;
Write( (Matrix^[(j-1)*n+i]):4 );
if (Matrix^[(j-1)*n+i] mod k1 = 0) or (Matrix^[(j-1)*n+i] mod k2 = 0) then
begin
Sums^[j]:= Sums^[j] + Matrix^[(j-1)*n+i];
Nums^[j]:= Nums^[j] + 1;
end;
end;
Writeln;
end;
Writeln('Число элементов кратных ', k1,' и ',k2,':');
for j:=1 to n do
Write( (Nums^[j]):4 );
Writeln;
Writeln('Сумма по столбцам:');
for j:=1 to n do
Write( (Sums^[j]):4 );
FreeMem(Sums,n * sizeOf(integer));
FreeMem(Nums,n * sizeOf(integer));
FreeMem(Matrix,n * m * sizeOf(integer));
Readln;
End.