380 likes | 637 Views
Osnovi računarstva II. Algoritamski koraci - ciklus Složenost algoritma. Selekcija (nastavak).
E N D
Osnovi računarstva II Algoritamski koraci - ciklus Složenost algoritma
Selekcija (nastavak) • Selekcija može biti još složenija. Jedne naredbe se izvršavaju ako je prvi uslov zadovoljen; druge naredbe se izvršavaju ako prvi uslov nije zadovoljen, a drugi uslov jeste; treće naredbe se izvršavaju ako prva dva uslova nijesu zadovoljena, a treći uslov jeste. Ako nijedan od pobrojanih uslova nije zadovoljen izvršava se INAČE dio. • Da bi ovo ilustrovali, posmatrajmo slučaj određivanja korijena kvadratne jednačine. Neka je kvadratna jednačina koja se rješava AX2+BX+C=0 i neka su zadati koeficijenti A, B i C.
Selekcija - Primjer • Rješenja ove jednačine zavise od diskriminante B2-4AC. Ako je diskriminanta veća od nule i A0kvadratna jednačina ima dva rješenja: • Ako je diskriminanta jednaka nuli, B2-4AC0, i A0, onda postoji jedno rješenje: X=-B/(2A) • Ako je diskriminanta manja od nule, a A0, jednačina nema rješenja u skupurealnih brojeva.
Selekcija - Primjer • Ako je A0 i B0 postoji jedno rješenje X=-C/B. • Ako je A0 i B0 i C0 nema rješenja. • Ako je A0 i B0 i C0 rješenje je trivijalno, odnosno, svako X je moguće rješenje.
NE START NE A0B0 B*B-4*A*C0A0 DA DA A,B,C:FLOAT X1,X2,X:FLOAT X=-C/B X=-B/(2*A) X X A,B,C NE B*B-4*A*C>0A0 DA NE B0C0 NE X1=(-B+KvKor(B*B-4*A*C))/(2*A) B*B-4*A*C<0 DA DA X2=(-B-KvKor(B*B-4*A*C))/(2*A) “Trivijalno” “Nema rješenja” “Nema rješenja” X1,X2 END Pretpostavljamoda je KvKorfunkcija koja daje kvadratni korjen. Sami napišite pseudokod za ovaj algoritam.
Ciklus • Određeni broj algoritamskih koraka koji se ponavlja više puta se naziva ciklusom. • Postoji više tipova ciklusa: • ciklusi koji se ponavljaju tačno određen broj puta • ciklusi koji se ponavljaju dok je ispunjen određeni logički uslov. U zavisnosti od mjesta u ciklusu gdje se logički uslov provjerava imamo: • cikluse sa izlazom na početku • cikluse sa izlazom na kraju • cikluse sa izlazom u sredini • Svi ciklusi se mogu svesti na ciklus sa izlaskom na početku!
Ciklus sa unaprijed zadatim brojem izvršavanja • Određenu operaciju treba ponoviti N puta gdje je N unaprijed zadat broj • Koristi se brojačka varijabla • Najčešće korišćeni tip ciklusa • Primjeri: • Unos N elemenata niza • Računanje zbira elemenata niza dužine N FOR I=1,N ... NEXT
Primjer: Unos elemenata niza • Broj elemenata niza mora biti unaprijed poznat • U jednom ulaznom koraku može se učitati samo jedan element niza INPUT N FOR i = 1,N INPUT X[i] NEXT
Primjer: Računanje zbira prvih N prirodnih brojeva • Rezultat je u varijabli S • Inicijalizacija sume (S=0) • Podrazumijeva se da je N poznat prije izvršavanja navedenih koraka i da je suma S iskorišćena u nastavku algoritma.
Primjer: Računanje zbira prvih N prirodnih brojeva • Alternativno rješenje bez upotrebe ciklusa • Smanjeni broj računskih operacija • Zahtijeva detaljniju analizu posmatranog problema
Ciklus sa izlazom na početku • Broj ponavljanja ciklusa može biti 0 (na samom početku uslov nije zadovoljen) • Primjena: • Polazimo od mogućeg rješenja problema i popravljamo ga u svakoj iteraciji (ciklusu) sve dok ne budemo zadovoljni WHILE uslov ... ENDWHILE
Ciklus sa izlazom na kraju • Broj ponavljanja ciklusa je najmanje 1 • Primjena: • Unos podataka koji moraju zadovoljiti postavljene kriterijume • Primjer: od korisnika tražimo unos pozitivnog cijelog broja DO ... WHILE uslov
Ciklus sa izlazom u sredini • Dio ciklusa mora biti izvršen a nakon toga se donosi odluka da li nastaviti sa izvršavanjem drugog dijela • Svaki ciklus se može svesti na ciklus sa izlazom na početku DO ... IF uslov THEN EXITDO ... LOOP
Ciklus – Primjer 2 • Kao primjer ciklusa (onog koji se izvršava nepoznat broj puta, odnosno,dok je zadovoljen određeni logički uslov) navodimo Njutnov algoritam za približno određivanje kvadratnog korijena realnog broja. • Korak 1.Neka tražimo kvadratni korijen broja X. Kao početno pogađanje njegovog kvadratnog korijena uzmimo G=X/2. Izračunajmo broj H kaoH=X/G. • Korak 2. Ako su H i G veoma slični to znači da je H*G približno jednako X, odnosno da su G i H približno jednaki kvadratnom korijenu broja X. • Korak 3. Ako nijesu približno jednaki onda treba uzeti da je novo G jednako G=(G+H)/2 i ponovo sračunati H kao H=X/G. • Koraci 2 i 3 se ponavljaju dok se ne dođe do rješenja.
CiklusKvadratni korijen X,G,H realni brojevi X,G,H: FLOAT
Ciklusi i selekcija • Unutar jednog ciklusa se može nalaziti proizvoljna sekvenca naredbi. • Nekoliko ciklusa mogu jedan za drugim da čine sekvencu. • Unutar ciklusa se može nalaziti selekcija. • Unutar selekcije se može nalaziti ciklus. • Unutar selekcije se može nalaziti druga selekcija • Unutar ciklusa se može nalaziti drugi ciklus (to se naziva ugnježdenje ciklusa). • Važno pravilo je da se prvo završava unutrašnji dio (unutrašnji ciklus ili selekcija), pa tek onda spoljašnji, tj. ciklusi i selekcije se ne mogu sjeći.
Primjeri za vježbu - Matrice • Matrice su izuzetno pogodne za uvježbavanje do sada naučenih elemenata algoritama. • Evo vam nekoliko zadataka za vježbanje: • Sabiranje, oduzimanje i množenje dvije matrice, sa provjerom da li im dimenzije omogućavaju ove operacije. • Odrediti sumu (ili proizvod) elemenata matrice; • Odrediti maksimalni (ili minimalni) element matrice; • Kreirati vektor koji se sastoji od zadate vrste (ili kolone) matrice; • Odrediti sumu (ili proizvod) svih kolona (ili vrsta) matrice.
Primjeri za vježbu - Matrice • Kreirati vektor koji se sastoji od elemenata matrice sa glavne (ili sporedne) dijagonale; • Provjeriti da li su učitane kvadratne matrice inverzne; • Sračunati trag matrice (trag matrice je suma elemenata glavne dijagonale matrice); • Provjeriti da li je matrica simetrična; • Odrediti transponovanu matricu date matrice, i slično.
Složenost algoritama • Broj operacija potreban da se algoritam izvrši od početka do kraja • Memorijski zahtjevi algoritma • U najjednostavnijim primjerima broj operacija i memorijski zahtjevi algoritma su konstantni • učitati tri broja A, B i C i izračunati izraz 2A+B/C • broj računskih operacija je 3 • 4 memorijske lokacije su iskorišćene (3 za ulazne podatke i jedna za rezultat) • pod memorijskom lokacijom se smatra memorija dovoljna za pamćenje jednog “broja”
Složenost algoritama • Nijesu svi algoritmi koji rješavaju neki problem jednako kvalitetni. • Mjera kvaliteta algoritama je složenost. • Tipovi složenosti su: • Vremenska složenost • Koje vrijeme je potrebno za izvršavanje algoritma. • Proporcionalno je broju operacija (aritmetičkih, logičkih ili nekih drugih), koje algoritam izvršava. • Dakle, procjena vremenske složenosti se svodi na brojanje operacija u algoritmu.
Složenost algoritama • Prostorna složenost • Podrazumjeva koliko prostora u memoriji zauzimaju podaci u algoritmu. • Određuje se sabiranjem veličine memorijskih lokacija koje zauzimaju promjenljive upotrijebljene u algoritmu. • Komunikaciona složenost • Određuje koliko je potrebno komunikacije procesora sa periferijama, diskovima i memorijom prilikom izvršavanja programa. • Posebno je značajna kod paralelnih kompjutera, kada razni procesori međusobno komuniciraju.
Vremenska složenost • Mi ćemo se detaljnije zadržati na vremenskoj složenosti i donekle na prostornoj, dok komunikacionu nećemo razmatrati. • Pod vremenskom složenošću se podrazumjeva vrijeme izvršavanja algoritma koje je proporcionalno broju operacija u algoritmu vrijeme = broj operacijaxneki konstantni interval.
Vremenska složenost • Teško je odrediti svaku operaciju u algoritmu, a teško je generalno i porediti operacije kao što su sabiranje i npr. operacije poređenja. • Uočeno je da, u pojedinim algoritmima, neka operacija dominira nad svim ostalim i da se češće upotrebljava. • Sada ćemo videti kako se broje aritmetičke operacije.
Vremenska složenost • Kod sekvence se broje operacije na koje se naiđe. Na primjer, ako je dominantna operacija u algoritmu sabiranje:A=B+C+DE=A+FG=A*B • Kod selekcije se uzima varijanta sa više operacija:IF(A>3) B=A+B+3ELSE C=A+1ENDIF 3sabiranja i 1 množenje (kod prve naredbe postoje dva sabiranja). 2sabiranja (uzeta je gora varijanta)
Vremenska složenost • Kod ciklusa se broj operacija tokom jednog izvršavanja ciklusa množi sa brojem ponavljanja ciklusa:I=1WHILE I12 A=A+B I=I+1ENDWHILE • Drugi primjer: I=1WHILE IN A=A+B I=I+1ENDWHILE ukupno 24 operacije (12 ponavljanja po 2 op.) ukupno 2N operacija
Vremenska složenost • Ugnježdeni ciklusi:WHILE INWHILE JN .... J=J+1 ENDWHILE ... I=I+1ENDWHILE broj operacija proporcionalan sa N2
Vremenska složenost • Što raditi kada ne postoji jedinstvena veza ulaznih podataka i složenosti? Postoje dvije strategije: • Analiza najgoreg slučaja (worst case analiza) • Uzme se najgori mogući slučaj i kaže se da algoritam ima toliku vremensku složenost u najgorem slučaju (ovo je češća strategija). • Analiza prosječnog slučaja (average case analiza) • Za svaki mogući obim ulaznih podataka treba znati koliko operacija je potrebno. Takođe, treba znati sa kojom se vjerovatnoćom taj podatak pojavljuje. Prosječan broj operacija je: Vjerovatnoća ulaznog podatka datog obima Obim ulaznog podatka
Vremenska složenost • Za vjerovatnoće važi: • Primjer: Parni i neparni brojevi se pojavljuju u po polovini slučajeva. Obim operacija kod parnih brojeva je reda veličine N,dok je kod neparnih 2N. Što je najgori slučaj, a što je prosječni slučaj? • Odgovor: Najgori slučaj je 2N, dok je prosječni
Vremenska složenost • Najčešće je veoma teško utvrditi kolika je tačna vremenska složenost, ali se može procijeniti red veličine broja potrebnih operacija. • Neka je potreban broj operacija za računanje algoritma g(N). Kaže se da je broj operacija reda W(f(N)) ako važi: Skup pozitivnih realnih brojeva (ne uključuje nulu i beskonačno) je reda W(N 2) Primjer:g(N)=6N2 +3N +1
Složenost algoritama • Postoji i često korišćena oznaka O(f(N)), kod koje je dozvoljeno da konstanta c bude jednaka nuli. • To znači da je red potrebnih operacija manji ili jednak od date procijenjene vrijednosti (ovo dobro odgovara worst case analizi).
Krećemo od 1 i sabiramo sa 2, 3, 4, 5, 6 i dobijamo 21, dakle jedno rješenje je niz 1, 2, 3, 4, 5 i 6. U narednoj iteraciji počinjemo od 2, jer postoji mogućnost da i sa tim brojem kao početnim imamo niz uzastopnih brojeva, koji daju sumu 21. Formiramo zbir 2+3+4+5+6+7 i taj je zbir veći od 21, dakle pošto mu je suma veća od 21 ne postoji niz uzastopnih prirodnih brojeva koji počinje sa 2 i daje zbir 21. Nastavljamo sa narednom iteracijom (broj 3). Zadatak sigurno ima jedno rješenje (niz od samo jednog prirodnog broja N) • Posmatrajmo sljedeći primjer: Za zadati prirodan broj N treba odrediti sve nizove uzastopnih prirodnih brojeva, čija je suma jednakaN. • Na primjer, ako je korisnik zadao N=21, treba da budu prikazani sljedeći nizovi:1, 2, 3, 4, 5, 66, 7, 810, 1121
Analiza prethodnog primjera • Koji su podaci i koja je struktura ovakvog programa? • Učitavamo N. • U jednoj petlji idemo od K=1 do K=N. • Svaki put u petlji inicijalizujemo sumu S na S=K, jer za svako K pretpostavljamo da može da bude prvi element niza uzastopnih prirodnih brojeva čija je suma jednaka N. • U ugnježdenoj petlji na sumu S dodajemo uzastopne brojeve počevši od P=K+1 i ostajemo u petlji sve dok je ta suma S manja od N. • Ako je SN štampamo (prikazujemo) niz brojeva od K do P, a ako je S>N ne štampamo. • Zatim uvećamo K za 1 i ponovimo postupak. • Ovdje ćemo dati pseudokod ovog algoritma.
Primjer - Nizovi koji daju sumu N STARTK,N,P,S,M:INTEGERINPUT NK=1WHILE KNS=K P=KWHILE S<N P=P+1S=S+PENDWHILE IF SN M=KWHILEMPOUTPUT M M=M+1 ENDWHILEENDIFK=K+1ENDWHILEEND
Primjer - Nizovi koji daju sumu N Isti problem se može riješiti korišćenjem IF petlje STARTK,N,P,S,M:INTEGERINPUT NFORK=1,NS=K P=KWHILE S<N P=P+1S=S+PENDWHILE IF SN FOR M=K,POUTPUT M NEXTENDIFNEXTEND Primijetite da je algoritam čitljiviji ukoliko koristimo petlju sa poznatim brojem ponavljanja, kada je taj broj poznat.
Primjer – Efikasnije rješenje • Naš cilj je da nađemo niz cijelih brojeva (K, K+1, ..., P) čija je suma jednaka N. Zapišimo ovaj niz kao: (K,K+1, ..., K+M). Njegova suma je jednaka: • Dakle, naš problem se svodi na rješavanje jednačine: sa parom rješenja (K,M) iz skupa prirodnih brojeva.
Primjer – Efikasnije rješenje • Postavljeni problem se sada može riješiti efikasnije. • Formiramo petlju po M, koja ide od 0 (jer se niz može sastojati i od samo jednog člana K) ka nekom cijelom pozitivnom broju (vidjećemo koji je to broj). • Zatim se za posmatrano M provjerava da li postoji cijeli broj K koji je rješenje jednačine: • Ako postoji, onda se odštampa odgovarajući niz od K do K+M, a ako ne postoji posmatra se sljedeće M. Prethodna jednačina je riješena po K, koji predstavlja prvi u nizu brojeva koji se sumiraju.
Primjer – Efikasnije rješenje • Problem koji trebamo pomenuti, prije nego pređemo na pisanje koda, su granice za M. Očigledno je, da je maksimalno M posljednje M za koje je zadovoljen uslov M(M+1)/2<N. Npr. za N=10 dovoljno je da petlja po M ide do 3, jer već za M=4 nije moguće ispunjenje prethodnog uslova. • Pseudokod realizacije: IF P-[P/(M+1)]*(M+1)0 K=P/(M+1) FOR R=K,K+MOUTPUT R NEXTENDIFM=M+1ENDWHILEEND STARTK,P,M,N,R:INTEGERINPUT NM=0WHILE M*(M+1)/2<NP=N-M*(M+1)/2
Primjer - Komentari • Druga realizacija je, očigledno, znatno efikasnija. Isključujući dio za štampanje niza, čitav kod se odvija u jednoj petlji i npr. za N=10 samo se četiri puta ulazi u ciklus za M=0, 1, 2 i 3. Prva realizacija je zahtjevala dvostruki ciklus i 15 ulazaka u unutrašnju petlju. • Postoje mogućnosti da se još malo popravi efikasnost programa, uz neznatno više analize programa. • Dakle, nijesu sva rješenja jednog problema istog kvaliteta. • Bolja su ona rješenja koja daju manji broj potrebnih operacija. • Posebno je važno da analiza, koja vodi do razvoja “jednostavnijeg” algoritma, nije posebno složena.