I Konstrukcija algoritama
Algoritam koji zadovoljava rešenje formulisanog problema opisuje se
Primer : Sortiranje
Output: niz A sortiran u nerastućem poretku a1 <= a2 <= ... <= an
kôdiranje:
kôdiranje programskim jezikom:
for(j=0; j<N-1; j++)
for(k=j+1; k<N; k++)
if( A[j]>A[k] )
{
int rezerva;
rezerva=A[j];
A[j]=A[k];
A[k]=rezerva;
}
Na primer:
kod sortiranja izlaz mora biti neopadajući poredak niza A, čak i ako niz A
(1) već jeste sortiran, ili
(2) sadrži elemente koji se ponavljaju..
zavisi od sledećih faktora:
Na primer: i=i+1; i++; i+=1;
Na primer: a=3; b=a+3; ILI a=3; b=6;
Faktori 1 i 2 zavise od konkretnog računara i prevodioca i ne odražavaju suštinu algoritma.
Analiza performansi algoritama u računarstvu se može odvijati i nezavisno od analize performansi hardvera ili konkretnog programskog jezika, iako kompletna analiza pretenduje da diskutuje i o uticaju tih parametara.
Za potrebe ALGORITMIKE se pri konstrukciji algoritama i diskusiji o njihovim osobinama koristi RAM model:
Složenost najgoreg slučaja algoritma jeste funkcija definisana u odnosu na najveći broj potrebnih koraka za obradu ulaza dimenzije n.
Složenost prosečnog slučaja algoritma jeste funkcija definisana u odnosu na prosečni broj potrebnih koraka za obradu ulaza dimenzije n.
Niz od n elemenata se može sortirati tako što se pretpostavi da se n-1 elemenata mogu sortirati, a potom se umetne n-ti element na mesto koje mu pripada, tako što se pregleda n-1 sortiranih elemenata sve dok se ne pronađe odgovarajuđa pozicija za umetanje.
Dakle, počne se sa praznom listom , a potom se, umeću novi elementi na adekvatna mesta u nizu:
a1<=a2<=...<=ak| ak+1...an
U svakoj iteraciji, umetnuti element napušta sortiranu listu, i nakon do n umetanja pronalaze se korektne pozicije, te je otuda algoritam korektan.
Ali, koliko je on EFIKASAN?
Potrebno je uočiti koliko predsortiranost ulaza utiče na broj koraka, tj. slučaj već sortiranog niza u zahtevanom poretku i slučaj niza u obrnutom poretku i slučaj nesortiranog niza.
Precizna analiza algoritma
Prebrojmo koliko puta će se izvršiti svaka linija pseudokôda
Br linije
InsertionSort(A)
#Inst.
#Izvrš.
1
for (j=1; j<n; j++)
c1
1+n*1 +n-1
2
{pom=A[j];
c2
n-1
3
/* smesti A[j] unutar A[0..j-1] */
c3=0
/
4
i=j-1;
c4
n-1
5
while
(i>=0 && A[i]>pom)
c5
tj
6
{A[i+1]= A[i];
c6
7
i = i-1; }
c7
8
A[i+1]=pom; }
c8
n-1
Unutar for ciklusa se dodela"pom=A[j]" obavi n-1 puta.
Koraci 5, 6, 7:
Za svako j, neka tj je broj ponavljanja provere (i>=0 && A[i]>pom),
To je, zapravo, 1+ broj
elemenata koji se moraju pomeriti udesno da bi se umetnuo element
sa rednim brojem j, (element pom=a[j-1]).
Korak 5 se izvrsava puta.
Korak 6: .
Ukupno vreme izvrsavanja algoritma je:
gde tj su zavisni od ulaznih parametara (zbog relacije poređenja)
Najbolji slučaj
Otuda je vreme najboljeg slučaja
gde C i D su konstante, tj. složenost je O(n)
Najgori slučaj
Dakle, n-ti element se upoređuje sa svih prethodnih n-1 brojeva. U najgorem slučaju se u n-tom koraku premesta n-1 brojeva, te je i broj premestanja/kopiranja O(n2)
Dakle, ukupan broj uporedjivanje moze biti 1+2+...+n-1=n(n-1)/2=O(n2)
Inače, sortiranje umetanjem se moze poboljsati binarnom pretragom (ali ona ne utice na smanjenje broja kopiranja) ili ukrštanjem sa sortiranjem izborom.
Jelena Hadži-Purić | Algoritmi i strukture podataka |