1. Заголовок или название темы должно быть информативным ! 2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code]. 3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК ! 4.НЕ используйте форум для личного общения! 5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!
оценка временной сложности алгоритма, как это делать
Нужно оценить временную сложность алгоритма.. Например для этого кода:
program sort_par; const n=10; var a: array[1..n] of integer; i,j,t,l: integer; begin i:=0; l:=0; randomize; for i:=1 to n do a[i]:=random(11)-5; for i:=1 to n do write(a[i]:4); writeln; while l<>2 do begin inc(l); inc(j); i:=2-(j mod 2); while i<n-1+(j mod 2) do begin if a[i]>a[i+1] then begin l:=0; t:=a[i]; a[i]:=a[i+1]; a[i+1]:=t; end; inc(i,2); end; end; for i:=1 to n do write(a[i]:4); end.
в продолжение оффтопа: была фраза "как это сделать".. думаю она трактуется однозначно))))
и все таки, я не понимаю _как_ Мы посчитали количество сравнений, а затем поделили его на n^2.. почему надо делать именно так? Мне чет кажется, что надо умножать среднее количество сравнений на количество просмотров? А эти данные должны как-то получаться аналитически из кода.. исходя из количества элементов массива..
..думаю мне нужен именно алгорит оценки (аналитический) на словах, на экзамене посчитать программно не получится..
и все таки, я не понимаю _как_ Мы посчитали количество сравнений, а затем поделили его на n^2.. почему надо делать именно так?
Исключительно для иллюстрации, что мы угадали. На самом деле можно написать программу, которая сама определяет, какой сложности алгоритм используется. В приведенном ниже примере подай на вход упорядоченную последовательность, например, так:
for i:=1 to n[j] do b[i]:=i;
для того, чтобы убедиться, что программа вернор определяет сложность хотя бы в этих двух (упорядоченный и не упорядоченный массив) случаях.
program sort_par;
type MyArray = array[1..100000] of integer; var b : MyArray;
function TestSort(var a : MyArray; n : longint): longint; // Returns amount of passes of an internal cycle var m,l,j,i,t : longint; begin j := 0; l := 0; m := 0; while l<>2 do begin inc(l); inc(j); i:=2-(j mod 2); while i<n-1+(j mod 2) do begin inc(m); if a[i]>a[i+1] then begin l:=0; t:=a[i]; a[i]:=a[i+1]; a[i+1]:=t; end; inc(i,2); end; end; TestSort := m; end;
const n : array[0..1]of longint = (1000, 10000); // array length o : array[0..6]of string = ('1','log(N)','N','N*log(N)','N^2','N^2*log(N)','N^3'); var i,j : longint; m : array[0..1]of longint; // amount of passes k : array[0..6]of double; // Statistics // 0 - const, 1 - log, 2 - n, 3 - n*log, 4 - n^2, 5 - n^2*log, 6 - n^3 delta : double; choice : longint; begin randomize; for j := 0 to 1 do begin; for i:=1 to n[j] do b[i]:=random(32766)-16383; m[j] := TestSort(b, n[j]); // writeln(j,' ',n[j]:6,' ',m[j]:9); end; k[0] := (m[1]/m[0]); k[1] := (m[1]/m[0])/ln(n[1]/n[0]); k[2] := (m[1]/m[0])/(n[1]/n[0]); k[3] := (m[1]/m[0])/(n[1]/n[0])/ln(n[1]/n[0]); k[4] := (m[1]/m[0])/sqr(n[1]/n[0]); k[5] := (m[1]/m[0])/sqr(n[1]/n[0])/ln(n[1]/n[0]); k[6] := (m[1]/m[0])/sqr(n[1]/n[0])/(n[1]/n[0]); // for i := 0 to 6 do // writeln(k[i]:5:3); delta := 1.0e+30; choice := -1; for i := 0 to 6 do begin if delta > abs(1.0-k[i]) then begin delta := abs(1.0-k[i]); choice := i; end; end; // for i:=1 to n[j] do write(b[i]:4); if choice <> -1 then writeln('O(',o[choice],') Algorithm') else writeln('Unknown'); end.
Цитата
..думаю мне нужен именно алгорит оценки (аналитический) на словах, на экзамене посчитать программно не получится..
Возможно. Но тогда лучше и брать не исходный код на Паскале, а алгоритм, записанный по-русски, т.к. именно по-русски его и придется анализировать.