Prof.dr.sc. Vedran Mornar Doc.dr.sc. Kreimir Fertalj SVEUILITE U ZAGREBU FAKULTET ELEKTROTEHNIKE I RAUNARSTVA Zavod za primijenjenu matematiku Grupa Raunarske znanosti
2 Openito o predmetu U kolskoj godini 2004/2005 gradivo e se prezentirati raunalom i to koristei alat PowerPoint, rad programa e se izravno demonstrirati izvoenjem u Visual C++ okruenju. I tekst i programski kod mogu se stalno poboljavati. Dobar dio dosada obavljenih ispravki i poboljanja dugujemo upozorenjima studenata prethodnih generacija te im ovom prilikom zahvaljujemo. Sigurno jo uvijek ima i pogreaka i nedostataka te molimo studente da nam na njih ukau. Vjebe zapoinju od 12.10.2004. Izvodit e se 3 tjedna po 1h kao auditorne za cijelu grupu, u tjednu iza toga grupa se dijeli na 2 podgrupe i jedna podgrupa ima po 2h laboratorijskih vjebi u tom tjednu, a druga u sljedeemu. Cijeli se ciklus ponavlja 3 puta. Sa stanovita studenta optereenje vjebama je 9*1 + 3*2 = 15h, tj. upravo u skladu s nastavnim planom. U stvarnoj provedbi ima 14 tjedana pa e biti jedne auditorne vjebe manje. Na auditornim vjebama e se prvo ponoviti odreeni dio gradiva iz Programiranja, kao npr. pokazivai, pozivi funkcija, petlje itd., a zatim e se rjeavali odabrani zadaci s bivih ispitnih rokova. Na laboratorijskim vjebama e studenti bili sami na raunalu i prezentirat e rjeenja jednostavnijih zadataka koji e im na auditornim vjebama biti zadani kao domaa zadaa. Na kraju svake od 3 laboratorijske vjebe, pisat e test kao na Programiranju, u trajanju od 30 minuta. 3 Openito o predmetu Prisustvo na laboratorijskim vjebama je obvezatno. Imat emo 2 kontrolne zadae. Na tim zadaama studenti e pisati programe, ali e se izmeu ostaloga traiti i da nacrtaju podatkovne strukture i upiu imena varijabli uz kuice. Na kraju semestra student predaje rijeeni zadatak. Oslobodit emo usmenog dijela ispita najvie 33% populacije, a pismenog dodatnih 33%, ali uz uvjet da zadovolje neke minimume kako slijedi:
Aktivnost Pojedinani maksimum Ukupni maksimum Test na raunalu 130 390 Kontrolne zadae 260 520 Rijeeni zadatak 90 90 Ukupno 1000
4 Openito o predmetu Osloboenje od usmenog najboljih 33% i to: 50% ocjena odlian 50% ocjena vrlo dobar Minimalno potrebno 700 bodova Student osloboen usmenog s ocjenom 4 moe odgovarati za 5, pri emu moe dobiti i niu ocjenu, pa ak i pasti.
Osloboenje pismenog sljedeih 33% i to: 50% ocjena dobar 50% ocjena dovoljan Minimalno potrebno 500 bodova Za dobivanje potpisa student mora skupiti barem 100 bodova. Student osloboen pismenog dijela ispita, na usmenome moe podii ocjenu, ali dakako moe ju i smanjiti, odnosno pasti.
Studenti koji se ne oslobode usmenog niti pismenog dijela ispita, ili nisu zadovoljni ocjenom koju bi tako dobili, polau ispit na klasian nain, kao pismeni i usmeni. Na prvi pismeni ispit ovi studenti mogu doi s istim zavrnim zadatkom koji su bili izradili za oslobaanje od ispita. 5 Openito o predmetu Student koji nema vlastite biljeke s nastave nema pravo dolaska na konzultacije. Vlastita teka s biljekama, odnosno dopunama i komentarima na nastavnim materijalima je nuan uvjet za bilo kakvo osobno obraanje nastavnicima ovog predmeta izvan predavanja ili vjebi. Dio studenata uobiajeno smatra da ne mora pohaati nastavu. Pogreno smatraju da su im ovi materijali i bivi ispitni rokovi dovoljni za pripremanje ispita. Ovi materijali su meutim samo dopuna predavanju. Na usmenom dijelu ispita esto se ustanovi da neke osnovne i relativno jednostavne koncepte, izloene na predavanjima, takvi studenti ne razumiju! 6 Openito o predmetu Pretpostavka ovog predmeta je operativno znanje programiranja u jeziku C. Studenti, koji su eventualno uspjeli poloiti Programiranje ne nauivi C, imat e ozbiljnih problema s polaganjem ovog ispita. Stoga ih upozoravamo da manjkavosti u svom znanju pravovremeno nadoknade. Zahtjevi na znanje iz ovog predmeta poveat e se proporcionalno naoj percepciji poboljanja izvedbe ovog predmeta. Predmet je uveden u nastavni plan kao zajedniki odlukom oba studija i svih smjerova, a ne na temelju nastojanja predmetnih nastavnika (koji su predmet predloili samo za Raunarstvo). Naa je obveza potivati ovu odluku Fakulteta te studentima ne moemo davati nikakve olakice temeljem pozivanja na odabir smjera koji toboe ne treba ovo gradivo. Argumenti da je predmet nekome uvjet za upis na treu ili ak etvrtu godinu, prijetnja gubitka prava studija zbog 8. pada na ispitu i slino nee utjecati na kriterije ispitivaa. Naprotiv, takve situacije ukazuju da dotini student najvjerojatnije studira na pogrenom fakultetu! Ako netko usprkos tome doe zamoliti za "razumijevanje", znai da ak nije upoznat niti s ovim uvodnim poglavljem. Kriterije emo dakle nastojati zadravati jednakima bez obzira na karakter ispitnog roka. 7 Openito o predmetu Konzultacije (donijeti vlastite zabiljeke s nastave!): Prof.dr.sc. Damir Kalpi Prof.dr.sc. Vedran Mornar Doc.dr.sc. Kreimir Fertalj Svaki dan od 12-13h ZPM, Zgrada D/III kat, sjeverozapadno krilo
Sve primjedbe na predmet i oko njega aljite na: damir.kalpic@fer.hr ili vedran.mornar@fer.hr ili kresimir.fertalj@fer.hr Subject:ASP 8 Openito o predmetu Literatura Kalpi, Mornar & Fertalj: Materijali s predavanja http://www.fer.hr/predmet/327 Vlastita teka Weiss: Data Structures and Algorithm Analysis in C, Addison Wesley, 1997 Horowitz & Sahni: Fundamentals of Computer Algorithms, Pitman, London, 1995 Sedgwick: Algorithms in C, Addison-Wesley, 2001 Cormen,Leiserson & Rivest: Introduction to algorithms, 2/e,MIT Press, 2001 Budin: Informatika za 1. razred gimnazije, Element, Zagreb, 1996 Knuth: Fundamental Algorithms, Addison-Wessley, 1973 Wirth: Algorithms + Data Structures = Programs, Prentice-Hall, 1976 Uvod 10 to je algoritam? Abu Ja'far Mohammed ibn Musa al Khowarizmi (Muhamed, otac Jafarov, sin Muse iz Khwarizma) roen u mjestu Khwarizm, danas Khiva, Uzbekistan, oko 780. g. umro u Bagdadu, oko 850 godine. jedan od 10 najcjenjenijih matematiara svih vremena 11 to je algoritam? potie koritenje Hindu-arapskih brojeva (pogreno smatranih arapskim izumom - vee zasluge imaju Indijci), uvodi nulu oko 825 godine napisao knjigu Hidab al-jabr w'al-muqubala (Znanost o prenoenju i ponitenju) jabr (JAH-ber) - prenoenje na suprotnu stranu jednadbe x - 2 = 12 x = 12 + 2 muqubala (moo-KAH-ba-lah) - ponitenje jednakih izraza s lijeve i desne strane jednadbe x + y = y + 7 x = 7 al-jabr -> algebra Nematematiki (maursko porijeklo): algebrista namjeta kostiju 12 to je algoritam? Vjerovao da se bilo koji matematiki problem moe raslaniti na korake, tj. niz pravila. U latinskom prijevodu knjige (12. stoljee) ispred svakog pravila pie Dixit Algorizmi - rekao je Al Kowarzimi
algoritam glasi U poetku algoritmom se nazivaju samo pravila raunanja s brojevima, kasnije i pravila obavljanja ostalih zadataka u matematici u XX stoljeu, pojavom raunala, pojam se proiruje na raunarstvo, a zatim i na druga podruja pravila za postizanje eljenog rezultata 13 Algoritam Precizno opisan nain rjeenja nekog problema Jednoznano odreuje to treba napraviti Moraju biti definirani poetni objekti koji pripadaju nekoj klasi objekata na kojima se obavljaju operacije Kao ishod algoritma pojave se zavrni objekt(i) ili rezultat(i). Konani broj koraka; svaki korak opisan instrukcijom Obavljanje je algoritamski proces Uporabljiv, ako se dobije rezultat u konanom vremenu
Primjeri za nedoputene instrukcije: izraunaj 5/0 uveaj x za 6 ili 7
14 Algoritam Algoritam mora biti djelotvoran: U konanom vremenu moe se dobiti rezultat koristei olovku i papir. Primjeri: Zbrajanje cijelih brojeva je djelotvorno Zbrajanje realnih brojeva nije jer se moe pojaviti broj s beskonano mnogo znamenki Sa znanjem iz predmeta Programiranje i uz razumijevanje problema koji rjeava, student moe napisati djelotvoran (effective) algoritam. Cilj ovog predmeta je nauiti kako se oblikuje i programira uinkovit (efficient) algoritam. Djelotvoran i uinkovit su u hrvatskome gotovo sinonimi. Effective = onaj koji daje rezultat, djelotvoran Efficient = uspjean, uinkovit Mnoenje se moe svesti na ponavljanje zbrajanja djelotorno, ali nije uinkovito! Rjeavanje velikog skupa linearnih jednadbi Kramerovim pravilom - djelotvorno, ali nije uinkovito!
15 Procedura Postupak koji ima sva svojstva kao i algoritam, ali ne mora zavriti u konanom broju koraka jest raunalna procedura. U jeziku C to moe biti void funkcija Primjeri za proceduru: Operacijski sustav raunala Ureiva teksta Vrijeme izvoenja mora biti "razumno" Primjer: Algoritam koji bi izabirao potez igraa aha tako da ispita sve mogue posljedice poteza, zahtijevao bi milijarde godina na najbrem zamislivom raunalu.
Algoritam Procedura 16 Algoritmi i programi Program - Opis algoritma koji u nekom programskom jeziku jednoznano odreuje to raunalo treba napraviti. Programiranje - nauiti sintaksu nekog proceduralnog jezika i stei osnovna intuitivna znanja glede algoritmizacije problema opisanog rijeima. Algoritmi + strukture podataka = PROGRAMI (Wirth) kako osmisliti algoritme kako strukturirati podatke kako formulirati algoritme kako verificirati korektnost algoritama kako analizirati algoritme kako provjeriti (testirati) program Postupci izrade algoritama nisu jednoznani te zahtijevaju i kreativnost. Inae bi ve postojali generatori algoritama. Znai da se (za sada?) gradivo ovog predmeta ne moe u potpunosti algoritmizirati. Koristit e se programski jezik C. Za saeti opis sloenijih algoritama moe se koristiti pseudokod.
Statike strukture podataka 18 Osnovni tipovi char - znakovni tip (1 By) int - cjelobrojni tip (standardno 4 By) float - realni tip (4 By) double - realni tip u dvostrukoj preciznosti (8 By) Razlika je izmeu preciznosti (precision) i tonosti (accuracy). Preciznost se iskazuje brojem prvih vaeih tonih znamenki, a tonost je bliskost stvarnoj (nepoznatoj) vrijednosti. Za dovoljnu tonost potrebna je adekvatna preciznost, ali preciznost ne implicira automatski tonost jer su iskazane znamenke mogle nastati na temelju npr. pogrenog mjerenja.
19 Prefiksi ili kvalifikatori Odnose se na cijele brojeve. Duljina ovisi o procesoru. short - smanuje raspon vrijednosti (2 By) long - eskplicitno definira duljinu od 4 By signed - dozvoljava pridruivanje pozitivnih i negativnih vrijednosti unsigned - dozvoljava pridruivanje samo pozitivnih vrijednosti
20 Memorijske klase memorijska_klasa utvruje postojanost (trajnost) i podruje vaenja varijable ili polja u memoriji ovisno o mjestu deklaracije u programu. Postoje 4 memorijske klase: auto automatska (vrijedi lokalno unutar funkcije) extern vanjska (vrijedi globalno unutar programa) static statika (vrijedi lokalno unutar funkcije ili modula) register registarska (vrijedi lokalno unutar funkcije, ali koristi CPU registre) Obino se kljuna rije auto ne navodi, te su sve lokalne varijable i polja definirani unutar neke funkcije automatske klase. Vanjska klasa ukazuje na varijable i polja koji su globalni (zajedniki) za sve funkcije unutar programa i obino se extern ne navodi jer poloaj izvan funkcije ukazuje na to. Statika klasa se koristi onda kada se vrijednost varijable ili lanova polja treba zadrati nakon izlaska i ponovnog povratka u neku funkciju. U opisu algoritama izbjegavat e se globalne varijable da bi se eksplicitno ukazalo na razmjenu informacija meu funkcijama. 21 Niz znakova; Logika vrijednost Niz znakova
Numerika vrijednost 0 oznaka je kraja znakovnog niza. char ime_niza[duljina_niza+1];
Logika vrijednost U nekim jezicima postoji poseban tip podataka LOGICAL. U C-u se svaki tip podatka moe koristiti kao logiki. #define TRUE 1 #define FALSE 0
Z a g r e b \o 22 Polje Polje je podatkovna struktura gdje isto ime dijeli vie podataka Svi podaci u nekom polju moraju biti istog tipa i iste memorijske klase Elementi (lanovi) polja se identificiraju po indeksom Indeks moe biti nenegativni cijeli broj (konstanta, varijabla, cjelobrojni izraz) x[0] x[9] x[n] x[MAX] x[n+1] x[k/m+5]
Polje moe biti jednodimenzionalno (vektor) #define N 100 float x[N];
x[0] x[1] x[2] ... x[n-2] x[n-1]
23 Polje dvodimenzionalno (matrica, tablica) #define N 100 #define M 50 float y[M][N];
Opi oblik naredbe za deklaraciju polja: memorijska_klasa tip_podatka polje[izraz1][izraz2]... 25 Pokaziva (Pointer) Memorija raunala: zapravo je kontinuirani niz bajtova:
0 1 2 3 4... 4 GB Svaki bajt ima svoj redni broj: adresu 26 Deklaracija "obinih" varijabli i pokazivaa Deklaracijom varijabli rezervira se prostor u memoriji na slobodnim adresama, npr.: short a, b; a b
82560 82562
Deklaracijom pokazivaa rezervira se prostor u memoriji u duljini 4 bytea kako bi se pohranila bilo koja adresa u adresnom prostoru do 4GB, npr.: short *p; a b p
82560 82562 82564
Vano je primijetiti da deklaracijom niti jednoj od varijabli nije inicijalizirana vrijednost
27 Varijable i pokazivai Vrijednost pokazivaa svakako treba postaviti prije uporabe p = &a; a b p 82560 82560 82562 82564
Ovime je ostvareno pokazivanje pokazivaa p na varijablu a a b p 82560 82560 82562 82564
Sada je mogue indirektno postaviti vrijednost varijable a *p = 7; a b p 7 82560 82560 82562 82564 28 Varijable i pokazivai Indirektno se moe i koristiti vrijednost varijable a b = *p; a b p
Vrijednost pokazivaa moe se postaviti i rezervacijom slobodne memorije PrimjerZaMalloc main () { short int *p; p = (short int *) malloc (sizeof (short int)); *p = 7; } Valja razlikovati: p pokaziva veliine 4 bajta na broj tipa short int *p broj tipa short int veliine 2 bajta. Ne mora postojati! 29 Aritmetika s pokazivaima Aritmetika s pokazivaima podrazumijeva koritenje jedinica koje odgovaraju duljini (By) podatkovne strukture na koju pokaziva pokazuje. Uveanje za 1 pokazivaa na strukturu dugaku 4 By znai da se njegova vrijednost uveava za 4. Ako je struktura dugaka 8 By, uveanje pokazivaa za 1 poveava vrijednost pokazivaa za 8 itd.
30 Polja i pokazivai PoljeJePokazivac #include <stdio.h> main () { int x[4] = {1,2,3,4}; printf ("%d %d\n", *x, *(x+1)); f (x); } void f (int *x) { ili void f (int x[]) { printf ("%d %d\n", *x, x[0]); ++x; printf ("%d %d %d\n", *x, x[0], *(x-1)); } Ispis na zaslonu: 1 2 1 1 x[0] x[1] x[2] x[3] 2 2 1
1 2 3 4 31 Zapisi (strukture) Typedef deklaracija typedef stari_tip novi_tip; npr. typedef unsigned size_t; typedef int redni_broj; typedef short logical; redni_broj i, j; size_t velicina; logical da_ne;
Definiranje strukture Strukture podataka iji se elementi razlikuju po tipu: struct ime_strukture { tip_elementa_1 ime_elementa_1; tip_elementa_2 ime_elementa_2; ... tip_elementa_n ime_elementa_n; }; 32 Zapisi (strukture) Primjer struct osoba { char jmbg[13+1]; char prezime[40+1]; char ime[40+1]; int visina; float tezina; }; Ovime nije deklariran konkretan zapis, ve je samo definirana struktura zapisa. Deklaracija konkretnih zapisa: struct ime_strukture zapis1, zapis2, ... , zapisN; npr. struct osoba o1, o2, zaposleni[500]; 33 Zapisi (strukture) Mogue je definiranje statike podatkovne strukture proizvoljne sloenosti jer pojedini element moe takoer biti struct: struct student { int maticni_broj; struct osoba osobni_podaci; struct adresa adresa_roditelja; struct adresa adresa_u_Zagrebu; struct osoba otac; struct osoba majka; }; Alternativno, koritenjem naredbe typedef: typedef struct { char jmbg[13+1]; char prezime[40+1]; char ime[40+1]; int visina; float tezina; } osoba; osoba o1, o2, zaposleni[500];
34 Zapisi (strukture) typedef struct { int maticni_broj; osoba osobni_podaci; adresa adresa_roditelja; adresa adresa_u_Zagrebu; osoba otac; osoba majka; } student;
Referenciranje elemenata zapisa zapis.element = vrijednost; vrijednost = zapis.element; npr: student pero; pero.majka.tezina = 92.5; 35 Zapisi (strukture) Pokaziva na strukturu struct osoba *p; *p - zapis o osobi p - adresa zapisa o osobi Referenciranje na element strukture preko pokazivaa p->prezime ili (*p).prezime
PrimjerZaStruct Elementi izrade programa 37 Normalan slijed; Bezuvjetni skok Normalan programski slijed naredba_1 naredba_2 naredba_3 ... Bezuvjetni skok Pseudokod: C: idi na oznaka_naredbe goto oznaka_naredbe;
38 Grananje S: Oznaka za jednu ili vie naredbi, odnosno programski odsjeak Uvjetno obavljanje naredbi (jednostrana selekcija) Pseudokod: C: ako je (logiki_izraz) onda if (logiki_izraz){ | S S; } Grananje (dvostrana selekcija) Pseudokod: C: ako je (logiki_izraz) onda if (logiki_izraz){ | S_1 S_1; inae } else { | S_2 S_2; } 39 Grananje Viestruko grananje (viestrana selekcija) Pseudokod: C: ako je (logiki_izraz_1) onda if (logiki_izraz_1) { | S_1 S_1; inae ako je (logiki_izraz_2) onda } else if (logiki_izraz_2) { | S_2 S_2; inae ako je (logiki_izraz_3) onda } else if (logiki_izraz_3) { | S_3 S_3; ... ... inae } else { | S_0 S_0; }
40 Grananje Skretnica Pseudokod: C: skretnica (vrijednost) switch(cjelobrojna vrijednost){ sluaj C1 case C1: | S_1 S_1; break; sluaj C2 case C2: | S_2 S_2; break; ... ... sluaj Cn case Cn: | S_n S_n; break; inae default: | S_n+1 S_nplus1; } 41 Grananje Primjer za vjebu: Ostvariti skretnicu naredbom if - else. if (vr == C1) { S1; } else if (vr == C2) { S2; } ... } else if (vr == Cn) { Sn; } else { S_nplus1; } Ako se iz skretnice izbace naredbe break, obavljaju se slijedno sve naredbe iza one gdje je prvi put zadovoljeno: vr == Ci 42 Grananje Skretnica bez break koritenjem naredbe if. nadjen = 0; if (vr == C1) { S1; nadjen = 1; } if (vr == C2 || nadjen) { S2; nadjen = 1; } ... if (vr == Cn || nadjen) { Sn; } S_nplus1;
43 Programska petlja Petlja s ispitivanjem uvjeta ponavljanja na poetku Pseudokod: C: dok je (logiki_izraz) initi while (logiki_izraz) { | S S; } Petlja s ispitivanjem uvjeta ponavljanja na kraju U nekim programskim jezicima postoji oblik: REPEAT...UNTIL Pseudokod: C: ponavljati do { | S S; do (logiki_izraz) } while(!logiki_izraz) Standardna petlja u C-u: Pseudokod: C: ponavljati do { | S S; dok je (logiki_izraz) } while (logiki_izraz); 44 Programska petlja Petlja s poznatim brojem ponavljanja Pseudokod: C: za i := poc do kraj (korak k) initi for(i=poc;i<=kraj;i=i+k){ | S S; } Primjer: Realizacija istog odsjeka petljom while: i = poc; while (i <= kraj) { S; // niz naredbi koje ne mijenjaju vrijednost za i i += k; } ili openitije: i = poc; while ((i - kraj) * k <= 0) { S; // niz naredbi koje ne mijenjaju vrijednost za i i += k; } // U emu je razlika? Pokus: poc = 5; kraj = -20; k = -7; 45 Programska petlja Skok iz petlje Pseudokod: C: izai iz petlje break; skoi na kraj petlje continue; Beskonana petlja Pseudokod: C: ponavljaj while(1) { ,S S; zauvijek }
U algoritmima ovakva petlja nije doputena jer je u suprotnosti sa zahtjevom da postupak bude konaan.
46 Programska petlja U tijelu petlje mora postojati barem jednom ispitivanje uvjeta za izlazak iz petlje: while(1) { S1; if (logiki_izraz) break; S2; ... } ili while(1) { S1; if (logiki_izraz) goto oznaka_naredbe; S2; ... } Naredbu goto treba izbjegavati ako je ikako mogue. Smanjuje se mogunost pogreke i olakava testiranje programa ako svaka programska cjelina (npr. petlja) ima samo jedan ulaz i jedan mogui izlaz. 47 Procedure Programi se sastoje od procedura. Prva pozvana procedura je glavni program. Kad glavni program zavri, slijedi povratak u operacijski sustav. Inae, povratak iz procedure je uvijek na onu proceduru koja ju je pozvala. Uobiajena je podjela na funkcije (function) koje imaju od nula do vie ulaznih argumenata i vraaju jedan rezultat, te na openite potprograme (subroutine) koje rezultat predaju argumentima. U jeziku C sve procedure su funkcije koje daju rezultat nekog od tipova podataka, ali mogu mijenjati i vrijednost argumenata. Posebni sluajevi: Glavni program: main Potprogram koji u imenu ne vraa vrijednost: void
48 Razmjena podataka izmeu funkcija globalne varijable argumenti navedeni u zagradi, prenose se vrijednosti (call by value) za prijenos vrijednosti u pozivajuu funkciju koriste se kod poziva funkcije kao argumenti adrese, a u definiciji funkcije argumenti su pokazivai (call by reference). Ako funkcija mora predati rezultat preko argumenata, nuno se koristi call by reference.
Primjer: zamjena vrijednosti dvije cjelobrojne varijable KomunikacijaSFunkcijama 49 Ulazno-izlazne operacije Za slijedno itanje/pisanje preko standardnih ulazno-izlaznih jedinica koristit e se odgovarajue C funkcije ili naredbe pseudokoda: ulaz (lista adresa argumenata) izlaz (lista argumenata) Kod itanja je dakle nuan call by reference, dok kod ispisa moe posluiti i call by value. 50 Dvodimenzionalna i viedimenzionalna polja kao argumenti funkcije Polje u funkciji treba prihvatiti kao jednodimenzionalno polje ili pokaziva. Primjer: int polje[3][4] = { { 1, 2, 3, 4}, { 5, 6, 7, 8}, { 9, 10, 11, 12} }; u memoriji raunala spremljeno je kao
tj. jednako kao jednodimenzionalno polje od 12 elemenata. Razlikuju se fizike dimenzije polja od logikih, koje mogu biti i manje. Za pozicioniranje je potrebno znati fiziki broj stupaca (MAX_broj_stupaca). Za dohvat elementa iz i-tog retka treba preskoiti i-1 punih redaka. Kako prvi redak ima indeks 0, drugi 1, trei 2 itd., za dohvat elemenata retka s indeksom i treba preskoiti i*MAX_broj_stupaca lanova polja. Openito: dvodim_polje[i][j] jednodim_polje[i * MAX_broj_stupaca + j] Primjer koritenja dvodimenzionalnog polja u potprogramu: DvodimenzionalnoPolje
1 2 3 4 5 6 7 8 9 10 11 12 51 Pisanje strukturiranih programa Osnovni naputci specifikacija ulaznih i izlaznih varijabli ( u C obvezatno!) definicija lokalnih varijabli tok programa prema dolje, osim petlji i neizbjene goto naredbe poravnati naredbe iste razine za poveanje itkosti (indentation) dokumentacija kratka ali smislena koristiti potprograme gdje je to primjereno Izbor vrste petlje Primjer: itati lanove nekog skupa nenegativnih brojeva sve dok njihova suma ne premai neki predvieni iznos n. y = 0; do { ulaz(&x); y += x; } while (y <= n); Programi nisu funkcionalno identini jer u prvom sluaju se uvijek obavlja barem jedno itanje, pa program ispravno radi samo za n>0. U drugom sluaju, ako je n<0, smatra se da je bez itanja ijednog podatka postupak zavren. y = 0; while (y <= n){ ulaz(&x); y += x; } 52 Pisanje strukturiranih programa Primjer: Proitati n vrijednosti i obraditi ih procedurom PROCES. Koritenjem petlje while: i = 0; while (i < n) { ulaz(&x); PROCES(x); i++; } S obzirom da je unaprijed poznat broj ponavljanja, primjerenije je koristiti petlju s poznatim brojem ponavljanja: for (i = 0; i < n; i++) { ulaz(&x); PROCES(x); } Ne radi se samo o manjem broju naredbi, nego se smanjuje i mogunost pogreke u pisanju programa. 53 Pisanje strukturiranih programa Primjer: Treba proitati i obraditi skup podataka sve dok ne naie oznaka kraja podataka (EOF). Realizacija petljom while: ulaz(&x); while (x != EOF) { PROCES(x); ulaz(&x); } Treba dakle proitati prvi podatak, obrauje ga se samo ako postoji, a nakon obrade ita se sljedei podatak koji se obradi u iduem prolasku kroz petlju. Bolje je rjeenje skokom iz petlje: while (1) { ulaz(&x); if (x == EOF) break; PROCES(x); } Ne naruava se eljeni princip da iz jednog programskog bloka postoji samo jedan izlaz. 54 Pisanje strukturiranih programa Ako ima dva kriterija za zavretak petlje: kraj podataka ili da rezultat procedure PROCES, pohranjen u varijabli y bude nula: do { ulaz(&x); if (x == EOF) break; PROCES(x, &y); } while (y != 0); if (x != EOF) { ... } else { ... } Na izlasku iz programskog segmenta ne zna se zbog ega je petlja zavrila pa se to mora ispitivati. Koritenje naredbe case Uvijek se moe uprabiti elementarnija naredba if-else. Naredba case je u prednosti kad ima mnogo ravnopravnih grananja. 55 Vieoblije; Logike operacije Razlika izmeu opisa algoritma i realizacije - vieoblije Deklarirat e se tip varijable tamo gdje je to jednoznano za algoritam. C ne podrava vieoblije (polimorfizam). Umjesto nekog od elementarnih tipova moe se (zahvaljujui naredbi typedef), koristiti openiti tip. Primjer: Traenje najveeg lana u jednodimenzionalnom polju MaxClanStd
Obavljanje logikih operacija U analizi algoritama pretpostavljat e se obavljanje logikih operacija na najkrai nain (reducirano ispitivanje, short-circuit evalation). Npr. logiki izraz (logiki_izraz1 v logiki_izraz2) daje odmah rezultat true ako je logiki_izraz1 = true, bez vrednovanja za logiki_izraz2. Analogno (logiki_izraz1 . logiki_izraz2) daje odmah rezultat false ako je logiki_izraz1 = false.
Rekurzija 57 Osnovna ideja Procedura poziva samu sebe Mora postojati zavretak. Pitanje: Zato se dug napravljen kreditnom karticom ne moe platiti istom kreditnom karticom?
Neki jezici (npr. stare verzije jezika FORTRAN) ne podravaju rekurziju. Rekurzivni programi su krai, ali izvoenje programa je dulje. Koristi se struktura podataka stog za pohranjivanje rezultata i povratak iz rekurzije.
58 Stog Struktura podataka kod koje se posljednji pohranjeni podatak prvi uzima u obradu. Moe se realizirati statikom strukturom podataka. U jednodimenzionalno polje zadane strukture dodaju se ili briu pojedine stavke po principu LastInFirstOut (LIFO). Dodavanje (push) i brisanje (pop) elemenata s vrha (top):
Pojedina operacija dodaj ili brisi zahtijeva jednako vremena bez obzira na broj pohranjenih podataka. Situacija da je stog pun moe zahtijevati alociranje dodatne memorije i ponovno izvoenje programa. Prazan stog ne mora znaiti pogreku.
Primjer: Stog ostvaren poljem StogPoljem 59 Stog - zadaci za vjebu Napisati funkciju za skidanje elementa sa stoga realiziranog statikim poljem. Podatak koji se pohranjuje je realni broj. Ako operacija nije uspjela, funkcija vraa 0, inae 1. Napisati funkciju za dodavanje elementa u stog realiziran poljem u koje stane najvie MAXZ zapisa. Zapis koji se pohranjuje na stog je jedan cijeli broj i polje od 10 realnih brojeva. Ako je dodavanje uspjelo, funkcija vraa vrijednost 1, a ako zbog bilo kojeg razloga dodavanje nije uspjelo, funkcija vraa 0. Prototip funkcije: int stog (struct cvor Stog[], int *vrh, int maxz, struct cvor *element); Na magnetskom disku postoji neformatizirana datoteka datoteka koja je organizirana kao stog. Na poetku datoteke upisan je maksimalni doputeni kapacitet stoga izraen u broju zapisa (int) i adresa zadnje upisanog elementa na stogu (long). Element stoga je zapis o poloenom ispitu studenta: matini broj (long) ime i prezime (24+1 znak) sifra predmeta (int) ocjena (short) Napisati funkcije za upis i za skidanje sa stoga. 60 Elementarna rekurzija i stog ElementarnaRekurzija void f(int i){ f f(i+1); int v; return; } void f(int i){ f f(i+1); int v; return; } void f(int i){ f(i+1); int v; return; } f ... ... f(1); STOG void f(int i){ f f(i+1); int v; return; } 1 p.a. BP v 1 p.a. BP v 2 p.a. BP v 1 p.a. BP v 2 p.a. BP v 3 p.a. BP v 1 p.a. BP v 2 p.a. BP v 3 p.a. BP v 4 p.a. BP v ... 61 Izraunavanje faktorijela Jedan od jednostavnih rekurzivnih algoritama jest izraunavanje n! za n >= 0. 0! = 1 1! = 1 n! = n* (n-1)! int fakt(int n){ if (n <= 1) { return 1; } else { return n * fakt(n-1); } } Primjer: 4! k = fakt (4); = 4 * fakt (3); = 3 * fakt (2); = 2 * fakt (1); = 1
62 Izraunavanje faktorijela ... ... i=fakt(3); STOG (n) 3 int fakt(int n){ fakt return 1; if (n <= 1) { } else { return n*fakt(n-1); } } int fakt(int n){ fakt return 1; if (n <= 1) { } else { return n*fakt(n-1); } } int fakt(int n){ fakt return 1; if (n <= 1) { } else { return n*fakt(n-1); } } 3 2 3 2 1 1 6 2 Faktorijeli 63 Fibonaccijevi brojevi 1,1,2,3,5,8,13,21,34,... (koji je sljedei?) F 0 =F 1 =1 F i =F i-2 +F i-1 ; i>1
int F(int n) { if (n <= 1) return 1; else return F(n-2) + F(n-1); } Program je vrlo kratak i potpuno odgovara matematikoj definiciji. Efikasnost je vrlo niska. 64 Fibonaccijevi brojevi
F(0) se izraunava 5 puta F(1) se izraunava 8 puta F(2) se izraunava 5 puta F(3) se izraunava 3 puta F(4) se izraunava 2 puta F(5) se izraunava 1 puta F(6) se izraunava 1 puta Ukupno izraunavanja: 25
Fibonacci F(6) F(4) F(5) F(2) F(3) F(0) F(1) F(1) F(2) F(0) F(1) F(3) F(1) F(2) F(0) F(1) F(4) F(3) F(1) F(2) F(0) F(1) 1 1 1 1 1 1 1 1 1 1 2 2 2 2 3 3 3 5 5 13 8 1 2 4 5 6 10 12 18 19 20 21 13 7 3 22 14 8 9 23 25 24 1 1 11 F(2) F(1) 1 2 16 17 1 F(0) 15 65 Najvea zajednika mjera Jedan od najstarijih algoritama je Euklidov postupak za pronalaenje najvee zajednike mjere (nzm) dva nenegativna cijela broja: ako je b = 0 , nzm = a inae , nzm = najvea zajednika mjera od b i ostatka dijeljenja a sa b Primjer: nzm(22,8) = nzm(8,6) = nzm(6,2) = nzm(2,0) = 2 nzm(21,13) = nzm(13,8) = nzm(8,5) = nzm(5,3) = nzm(3,2) = nzm(2,1) = nzm(1,0) = 1 nzm (21,0) = 21 nzm (0,21) = nzm (21,0) = 21 Rekurzivna funkcija: int nzm (int a, int b) { if(b == 0) return a; return nzm (b, a % b); }
Euklid 66 Traenje lana polja Rekurzivni postupak za traenje indeksa prvog lana jednodimenzionalnog polja od n lanova koji ima vrijednost x. Ako takvoga nema, rezultat je -1. int trazi (tip A[], tip x, int n, int i) { if(i >= n) return -1; if(A[i] == x) return i; return trazi (A, x, n, i+1); } Pretraivanje poinje pozivom funkcije trazi(A, x, n, 0). Pretraivanje je bre ako se prethodno u polje proireno za jedan lan stavi tzv. ograniiva (sentinel) A[n] = x; int trazi1 (tip A[], tip x, int i){ if(A[i] == x) return i; return trazi1 (A, x, i+1) } Poziv: tip i; A[n] = x; if ((i = trazi1 (A, x, 0)) == n) ...
Rekurzija 67 Traenje najveeg lana polja Odreivanje indeksa najveeg lana u polju od n lanova int maxclan (int A[], int i, int n) { int imax; if (i >= n-1) return n-1; imax = maxclan (A, i + 1, n); if (A[i] > A[imax]) return i; return imax; } Nije zadovoljen princip strukturiranog programiranja da iz nekog modula vodi samo jedan izlaz! maxclan1 (strukturirano) Odreivanje najveeg lana u polju od n lanova #define maxof(a,b) ((a) > (b) ? (a) : (b)) int maxclan2 (int A[], int i, int n) { if (i >= n-1) return A[i]; else return maxof(A[i], maxclan2 (A, i + 1, n)); } Rekurzija 68 Karakteristike rekurzije Osnovni sluajevi: uvijek moraju postojati osnovni sluajevi koji se rjeavaju bez rekurzije Napredovanje: Za sluajeve koji se rjeavaju rekurzivno, svaki sljedei rekurzivni poziv mora biti pribliavanje osnovnim sluajevima. Pravilo projektiranja: Podrazumijeva se da svaki rekurzivni poziv funkcionira. Pravilo ne ponavljanja: Ne valja dopustiti da se isti problem rjeava odvojenim rekurzivnim pozivima. (To rezultira umnaanjem posla, vidi npr. Fibonaccijevi brojevi). Primjer za pogreku int los (int n) { if (n == 0) return 0; return los (n / 3 + 1) + n - 1; } Pogreka jest u tome to za vrijednost n = 1 rekurzivni poziv je opet s argumentom 1. Nema znai napredovanja prema osnovnom sluaju. Program meutim ne radi niti za druge vrijednosti argumenta. Npr. za n = 4, rekurzivno se poziva los s argumentom 4/3 +1 = 2, zatim 2/3 +1 = 1 i dalje stalno 1/3 +1 = 1.
Rekurzija 69 Uklanjanje rekurzije Prednosti rekurzije: koncizniji opis algoritma lake je dokazati korektnost Nedostatci: uveano vrijeme izvoenja neki jezici ne podravaju rekurziju
Formalna pravila za uklanjanje rekurzije: 1. Na poetku funkcije umetne se deklaracija stoga, inicijalno praznog. Stog slui za pohranu svih podataka vezanih uz rekurzivni poziv: argumenata, vrijednosti funkcije, povratne adrese 2. Prva izvrna naredba dobije oznaku L1. Svaki rekurzivni poziv zamijenjen je naredbama koje obavljaju sljedee: 3. Pohrani na stog vrijednosti svih argumenata i lokalnih varijabli. 4. Kreiraj i-tu novu oznaku naredbe Li i pohrani i na stog. Vrijednost i e se koristiti za izraun povratne adrese. U pravilu 7. je opisano gdje se u programu smjeta ta oznaka.
70 Uklanjanje rekurzije 5. Izraunaj vrijednosti argumenata ovog poziva i pridrui ih odgovarajuim formalnim argumentima. 6. Umetni bezuvjetni skok na poetak funkcije. 7. Oznaku kreiranu u toki 4. pridrui naredbi koja uzima vrijednost funkcije s vrha stoga. Dodaj programski kod koji tu vrijednost koristi na nain opisan rekurzijom. Ovime su uklonjeni svi rekurzivni pozivi. Umjesto svake naredbe return dolazi: 8. Ako je stog prazan, obavi normalnu naredbu return. 9. Inae, uzmi vrijednosti svih izlaznih argumenata i stavi ih na vrh stoga. 10. Odstrani sa stoga povratnu adresu ako je bila stavljena, i pohrani je u neku varijablu. 11. Uzmi sa stoga vrijednosti za sve lokalne varijable i argumente. 12. Umetni naredbe za izraun izraza koji slijedi neposredno iza naredbe return i pohrani rezultat na stog. 13. Idi na naredbu s oznakom povratne adrese.
Primjer: Uklanjanje rekurzije iz strukturiranog programa za traenje indeksa najveeg lana u polju UklanjanjeRekurzije ANALIZA SLOENOSTI ALGORITAMA 72 Osnovni pojmovi Svrha intelektualna razonoda? predvianje vremena izrauna pronalaenje efikasnijih algoritama Pretpostavke: sekvencijalno jednoprocesorsko raunalo fiksno vrijeme dohvata sadraja memorijske lokacije vrijeme obavljanja operacija (aritmetike, logike, pridruivanje, poziv funkcije) je ogranieno nekom konstantom kao gornjom granicom Izbor skupova podataka za iscrpno testiranje algoritma: najbolje najloije tipino ponaanje A priori analiza daje trajanje izvoenja algoritma kao vrijednost funkcije nekih relevantnih argumenata. A posteriori analiza je statistika dobivena mjerenjem na raunalu.
73 Analiza a priori A priori: procjena vremena izvoenja, nezavisno od raunala, programskog jezika, prevoditelja (compiler)
Primjeri: a) x += y; 1
b) for(i = 1; i <= n; i++) { n x += y; } c) for(i = 1; i <= n; i++) { n 2
for(j = 1; j <= n; j++) { x += y; } }
74 O-notacija f(n) = O(g(n)), ako i samo ako postoje dvije pozitivne konstante c i n 0 takve da vrijedi ,f(n), s c,g(n), za sve n> n 0 . Trai se najmanji g(n) za koji to vrijedi. A priori analizom se dobije vrijeme izvoenja algoritma O(g(n)).
Ako je broj izvoenja operacija nekog algoritma ovisan o nekom ulaznom argumentu n oblika polinoma m-tog stupnja, onda je vrijeme izvoenja za taj algoritam O(n m ). Dokaz: Ako je vrijeme izvoenja odreeno polinomom: A(n) = a m n m + ... + a 1 n + a 0 onda vrijedi: ,A(n), s ,a m ,
n m + ... +,a 1 ,n +,a 0 , ,A(n), s (,a m , + ,a m-1 ,/
n + ... +,a 1 , /n m-1 +,a 0 ,/
n m )
n m
,A(n), s (,a m ,
+ ... +,a 1 , +,a 0 ,)
n m , za svaki n>1 Uz : c = ,a m ,
+ ... +,a 1 , +,a 0 , i n 0 = 1 tvrdnja je dokazana.
75 O-notacija Moe se kao c koristiti bilo koja konstanta vea od ,a m , ako je n dovoljno velik: Ako neki algoritam ima k odsjeaka ija vremena su: c 1 n m1 , c 2 n m2 ,...,c k n mk onda je ukupno vrijeme c 1 n m1 + c 2 n m2 +... + c k n mk
Znai da je za taj algoritam vrijeme izvoenja jednako O(n m ), gdje je m = max{m i }, i =1,...,k Za dovoljno veliki n vrijedi: O(1) < O(log n) < O(n) < O(nlog n) < O(n 2 ) < O(n 3 )< ... < O(2 n ) O(1) znai da je vrijeme izvoenja ogranieno konstantom. Ostale vrijednosti, osim zadnje, predstavljaju polinomna vremena izvoenja algoritma. Svako sljedee vrijeme izvoenja je vee za red veliine. Zadnji izraz predstavlja eksponencijalno vrijeme izvoenja. Ne postoji polinom koji bi ga mogao ograniiti jer za dovoljno veliki n ova funkcija premauje bilo koji polinom. Algoritmi koji zahtijevaju eksponencijalno vrijeme mogu biti nerjeivi u razumnom vremenu, bez obzira na brzinu slijednog raunala. 76 O-notacija Donja granica za vrijeme izvoenja algoritma f(n) =O(g(n)), ako i samo ako postoje dvije pozitivne konstante c i n 0 takve da vrijedi ,f(n), > c ,g(n), za sve n > n 0. Trai se najvei g(n) za koji to vrijedi. Ukoliko su gornja i donja granica jednake (O = O), koristi se notacija: f(n) = O(g(n)) ako i samo ako postoje pozitivne konstante c 1 , c 2 i n 0 takve da vrijedi c 1 ,g(n), s ,f(n), s c 2 ,g(n), za sve n > n 0 . Na primjer: maxclan3 (UklanjanjeRekurzije.c) - petlja se uvijek obavi n-1 puta O (n) = O(n) = O (n) trazi (Rekurzija.c) - vrijeme izvoenja je O(n), ali je donja granica O (1). U najboljm sluaju u prvom koraku nae traeni lan polja, a u najgorem mora pregledati sve lanove polja.
77 Asimptotsko vrijeme izvoenja Asimptotsko vrijeme izvoenja je f(n) ~ o(g(n)) (ita se: "f(n) je asimptotsko funkciji g(n)") ako je lim f(n)/g(n) = 1 n
Precizniji je opis vremena izvoenja nego O-notacijom. Zna se i red veliine vodeeg lana i konstanta koja ga mnoi. Ako je na primjer f(n) = a k n k + ... + a 0 tada f(n) = O(n k ) i f(n) ~ o(a k n k )
78 Asimptotsko vrijeme izvoenja U izraunu uestalosti obavljanja nekih naredbi esto se javljaju sume oblika: n E i = n(n+1)/2 = O (n 2 ) i=1
n E i 2 = n(n+1) (2n+1)/6 = O (n 3 ) i=1
n E i k = n k+1 /(k+1) + n k /2 + lanovi nieg reda = O(n k+1 ) i=1
~ o( n k+1 /(k+1))
79 Primjer za razliite sloenosti istog problema (M.A. Weiss) Zadano je polje cijelih brojeva A0, A2,,An-1. Brojevi mogu biti i negativni. Potrebno je pronai najveu vrijednost sume niza brojeva. Pretpostavit e se da je najvea suma 0 ako su svi brojevi negativni. RazneSlozenosti MaxPodSumaNiza3 O(n 3 ) Ispituju se svi mogui podnizovi. U vanjskoj varira se prvi lan podniza od nultog do zadnjeg. U srednjoj petlji varira se zadnji lan podniza od prvog lana do zadnjega lana polja. U unutranjoj petlji varira se duljina niza od prvog lana do zadnjeg lana. Sve 3 petlje se za najgori sluaj obavljaju n puta. Zbog toga je apriorna sloenost O(n3). MaxPodSumaNiza2 O(n 2 ) Ako uoimo da vrijedi:
sloenost se moe reducirati uklanjanjem jedne petlje.
= = + = 1 j i k k j j i k k A A A 80 Primjer za razliite sloenosti istog problema MaxPodSuma O(nlog 2 n) Relativno sloeni rekurzivni postupak. Kad ne bi bilo i boljeg (linearnog) rjeenja, ovo bi bio dobar primjer snage rekurzije i postupka podijeli-pa-vladaj (divide-and-conquer). Ako se ulazno polje podijeli priblino po sredini, rjeenje moe biti takvo da je maksimalna suma u lijevom dijelu polja, ili je u desnom dijelu polja ili prolazi kroz oba dijela. Prva dva sluaja mogu biti rijeena rekurzivno. Zadnji sluaj se moe realizirati tako da se nae najvea suma u lijevom dijelu koja ukljuuje njegov zadnji lan i najvea suma u desnom dijelu koja ukljuuje njegov prvi lan. Te se dvije sume zbroje i usporeuju s one prve dvije. Na primjer: Lijevi dio Desni dio
Najvea lijeva suma je od lanova 0 do 2 i iznosi 6. Najvea desna suma je od lanova 5 do 6 i iznosi 8. Najvea lijeva suma koja ukljuuje zadnji lan na lijevo je od 0 do 3 lana i iznosi 4, a desno od 4 do 6 lana i iznosi 7. Ukupno to daje sumu 11 koja je onda i najvea. Pozivni program za poetne rubove zadaje 0 i n-1.
4 -3 5 -2 2 -1 6 -2 0 1 2 3 4 5 6 7 81 Primjer za razliite sloenosti istog problema Programski kd je relativno sloen, ali daje za red veliine bolje rezultate od prethodnoga. Znai da krai kd ne implicira i bolji kd! Ako bi n bio potencija od 2 intuitivno se vidi da e sukcesivnih raspolavljanja biti log 2 n. To e se detaljnije dokazivati kasnije kod binarnih stabala. Budui da kroz postupak prolazi n podataka, imamo O(n log 2 n). Openito se moe rei da je trajanje algoritma O(log 2 n) ako u vremenu O(1) podijeli veliinu problema (obino ga raspolovi). Ako u pojedinom koraku reducira problem za 1, onda je njegovo trajanje O(n).
MaxPodSumaNiza1 O(n) zbrajaju svi lanovi polja redom, a pamti se ona suma koja je u cijelom tijeku tog postupka bila najvea 82 Analiza a posteriori Stvarno vrijeme potrebno za izvoenje algoritma na konkretnom raunalu. #include <sys\timeb.h> gdje je deklarirano struct timeb { time_t time; // broj sekundi od ponoi, 01.01.1970 prema UTC unsigned short millitm; // milisekunde short timezone; // razlika u minutama od UTC short dstflag; // <>0 ako je na snazi ljetno raunanje vremena }; void ftime(struct timeb *timeptr); U programu: struct timeb vrijeme1, vrijeme2; long trajanjems; ftime (&vrijeme1); ... ftime (&vrijeme2); trajanjems = 1000 * (vrijeme2.time - vrijeme1.time) + vrijeme2.millitm - vrijeme1.millitm; coordinated universal time (UTC): novi naziv za Greenwich Mean time (GMT)
83 Analiza a posteriori Primjer: izraunati mod sortiranog cjelobrojnog polja, tj. odrediti lan polja koji se najee pojavljuje i prebrojati njegovu uestalost. ModPolja mode0 izravno rjeavanje rmode0 rekurzivni postupak Zamislimo da je u polju od n lanova a[0:n-1] izraunat mod i uestalost f za prvih n-1 lanova polja. Pod kojim uvjetima zadnji lan polja moe promijeniti mod? Ako je a[n-1] != a[n-2] niti mod niti uestalost se ne mijenjaju. Ako jest jednak, kako razlikovati izmeu 3 mogua sluaja: a) naen je novi mod b) mod je isti, ali se poveava uestalost f c) nema promjene ni moda niti uestalosti Odgovor ovisi o tome da li je a[n-1] == a[n-1 - f]. Ako jest, onda ima n-1 - (n-1 - f) +1 = f + 1 pojavljivanja vrijednosti koje je u a[n-1]. To znai da je ta vrijednost sigurno ili novi mod ili stari mod s uveanom uestalou f. rmode1 rekurzivni postupak transformiran u iterativni sva tri postupka imaju vrijeme izvoenja O (n). Koji je najbolji? 84 Zadaci za vjebu Primjeri rekurzivnih poziva funkcije PrimjeriRekurzije Za algoritam for (i = 0; i < n; i++) { if (a[i] == b) { printf ("i = %d\n", i); break; } } odrediti: a) apriorno vrijeme izvoenja b) prosjeno asimptotsko vrijeme izvoenja c) asimptotsko vrijeme izvoenja za najbolji sluaj d) asimptotsko vrijeme izvoenja za najgori sluaj e) za kakvu vrijednost varijable b nastupa najgori sluaj? U obzir se uzima trajanje izvoenja samo masno otisnutih naredbi.
85 Zadaci za vjebu Napisati rekurzivnu funkciju koja e odrediti koji se znak u nekom sortiranom znakovnom polju dimenzije n+1 najee pojavljuje. Izlazni argument je naeni znak, a funkcija vraa broj pojavljivanja tog znaka. Prototip funkcije je: int mode (char *tekst, int n, char *znak); Treba napisati funkciju za odreivanje indeksa najmanjeg lana u cjelobrojnom polju: a) rekurzivno b) nerekurzivno Napisati program za raunanje binomnog koeficijenta koristei izraz: a) BINOM(n, m) = n!/(m!(n-m)!) b) BINOM(n, m) = BINOM(n-1, m) + BINOM(n-1, m-1); BINOM(n, 0) = BINOM(n, n) = 1 BinomniKoeficijenti Nainiti funkciju koja e na zaslon ispisati prvih n redaka Pascalovog trokuta. BinomniKoeficijenti
Liste 87 Osnovni pojmovi Linearna lista A=(a 1 ,a 2 ,...a n ) je struktura podataka koja se sastoji od ureenog niza elemenata odabranih iz nekog skupa podataka. Za linearnu listu kaemo da je prazna ako ima n=0 elemenata. Elementi liste a i nazivaju se jo i atomi. Moe se realizirati statikom strukturom podataka - poljem. Dinamika podatkovna struktura za realizaciju liste sastoji se od pokazivaa na prvi element liste i od proizvoljnog broja vorova. Svaki se vor sastoji od od podatkovnog dijela i pokazivaa na sljedei element liste. Memorija za svaki vor liste zauzme se u trenutku kad je potrebna za pohranu podataka, a oslobaa kad se podatak brie. Granulacija je veliine vora. Prazna lista Neprazna lista 88 Prikaz stoga pomou liste Stog, prije realiziran statikom strukturom polje, moe se realizirati i linearnom listom kod koje se umetanje i brisanje iz liste rade na jednom kraju liste koji se naziva vrh stoga. StogListom Prikaz stoga pomou liste zahtijeva vie memorije po podatku (jer postoji i pokaziva), meutim daje veu fleksibilnost. Vie stogova moe paralelno koristiti isti memorijski prostor. Koritenje memorije je proporcionalno broju podataka na stogu, a nije odreeno maksimalnim kapacitetima stogova. S druge strane, kapacitet pojedinog stoga ogranien je samo raspoloivom memorijom.
89 Red Red (queue) je linearna lista kod koje se umetanje u listu izvodi na jednom, a brisanje iz liste na njenom drugom kraju. To je princip FirstInFirstOut (FIFO). Kraj reda na kojem se vri umetanje naziva se ulaz (stranji kraj - rear), a drugi kraj je izlaz (prednji kraj - front). Efikasan nain realizacije reda statikom strukturom je jednodimenzionalno polje zadane podatkovne strukture koje se koristi cirkularno. Koriste se dva indeksa (ulaz i izlaz), a cirkularnost se ostvaruje uporabom operatora modulo (%) RedPoljem Problem kod realizacije poljem jest mogunost popunjenja. U stvarnosti veliina reda nije ograniena. Realnija je realizacija listom.
90 Red RedListom Neprazan red Izlaz Ulaz Prazan red Izlaz Ulaz 91 Openita linearna jednostruko povezana lista Podatak je mogue u listu umetnuti: a) na poetak liste (isto kao na stog) b) iza nekog elementa na listi Primjer: Napisati program koji e proitati niz cijelih brojeva i od njih oblikovati linearnu jednostruko povezanu listu tako da podaci budu u rastuem nizu. Ispisati redom sadraj liste. Uitavati podatke koje se eli brisati iz liste. Program se zavrava kad se upie podatak koji ne postoji u listi. Lista glavap sadri adresu pokazivaa na prvi lan liste, tj. &(cvor*) ili &(&(cvor)) *glavap sadri pokaziva na prvi lan liste, tj (cvor*) ili (&cvor) **glavap je prvi lan liste, tj. cvor glavap *glavap = glava **glavap = *glava = cvor 92 Liste s vie kljueva Primjer: Proitati matine brojeve (cijeli broj) i prezimena studenata (14+1 znakova). Oblikovati listu po rastuem matinom broju i listu po abecedi. Podaci su upisani samo jednom! Za zadani matini broj pronai pripadno prezime.
glavambr glavaprez 93 Liste s vie kljueva Za razliku od prethodnog zadatka ovdje e se kod oblikovanja liste koristiti adrese pokazivaa (adresa adrese vora) za modificiranje pokazivaa na slijedei vor: VisestrukaLista
(*glavap)->smbr je pokaziva smbr u voru na koji pokazuje *glavap &((*glavap)->smbr) je adresa tog pokazivaa alternativno rjeenje s varijablom pom (pom je isto to i glavap) pom sadri adresu pokazivaa na lan liste (vor) s kojim se usporeuje novi el. *pom je pokaziva na prethodni vor (*pom)->smbr je pokaziva na aktuelni vor Kad se ustanovi da treba ubaciti novi, prekida se pretraga po listi i izmijeni se pokaziva upisan u prethodnom voru (ili glavi) tako da on sada pokazuje na novi vor. glavap *glavap = glava **glavap = *glava = cvor 94 Dvostruko povezana lista
Radi breg traenja u oba smjera kretanja po listi, ona moe biti dvostruko povezana. Svaki vor osim elementa s podacima, sadri pokaziva na sljedei vor i pokaziva na prethodni vor. Lista ima glavu i rep.
Primjer: RedListom2 funkcije za dodavanje i skidanje rukuju pokazivaima na glavu (glavap) i rep (repp) glava rep glavap repp 95 Zadaci za vjebu U memoriji oblikovati jednostruko povezanu listu. Pojedini element sadri matini broj (8 znamenki), ime i prezime (24+1 znak) i prolazne ocjene iz do 10 predmeta (cijeli brojevi). Listu oblikovati sortirano po matinom broju studenta. Napisati funkciju koja e ispisivati matine brojeve, ime i prezime i prosjek ocjena studenata: Maticni broj Ime i prezime Prosjecna ocjena xxxxxxxx AAAAAAAAAAAAAAAAAAAAAAAA x.xx xxxxxxxx AAAAAAAAAAAAAAAAAAAAAAAA x.xx
Prototip funkcije je: void ispisi (cvor *glava); U memoriji oblikovati linearnu listu. U pojedini vor liste upisati: matini broj studenta (4 znamenke) ime i prezime (30+1 znakova) ocjena (cijeli broj) pokaziva na sljedei vor Napisati funkciju koja e iz liste izbrisati sve zapise koji sadre ocjenu 1. Prototip funkcije je: void brisi (cvor **glava);
96 Zadaci za vjebu Strukturu red realizirati kao memorijski rezidentnu listu. Jedan element sadri ifru (cijeli broj) i naziv (15+1 znakova). Treba napisati funkciju koja dodaje i funkciju koja brie element iz reda. Ako je operacija uspjela, funkcija vraa vrijednost 1, a ako nije, vraa 0. Napomena: Novi element dodaje se na kraj liste i pamti se pokaziva na zadnji element, a elementi se skidaju iz reda od glave liste.
Napisati funkciju za oblikovanje memorijski rezidentne linearne jednostuko povezane liste u koju su upisani: ifra artika (cijeli broj) i naziv artikla (15+1 znakova). Lista je poredana po ifri artikala. Napisati funkciju za pronalaenje lana liste sa zadanom ifrom artikla. Ulazni argumenti su glava liste i ifra artikla, a izlazni argument je naziv artikla. Funkcija vraa rezultat 0 ako ifra nije naena, a 1 ako jest. 97 Zadaci za vjebu Napisati funkciju za oblikovanje uzlazno poredane liste. Listu pohraniti u neformatiziranu datoteku lista. Napisati funkciju za logiko brisanje vora sa zadanim kljuem. Ulazni podatak je zadana vrijednost kljua. Ulazno-izlazni podatak je glava liste. Funkcija vraa vrijednost 1 ako je brisanje uspjelo, a vrijednost 0 ako vor sa zadanim kljuem nije bio pronaen. Pojedini vor sadri: Kuni telefonski broj (4 znamenke) Prezime (15+1 slovo) Ime (15+1 slovo) Kuni telefonski broj jest klju. Zadnji lan liste ima pokaziva s vrijednosti -1.
6. Napisati funkciju za oblikovanjem jednostruko povezane silazno poredane liste. Lista je pohranjena u neformatiziranom obliku u datoteci. Glava liste je zapisana na poetku datoteke. Funkcija vraa vrijednost 1 ako je dodavanje uspjelo, a vrijednost 0 ako nije. Pojedini vor sadri ifru (4 znamenke) i naziv artikla (15+1 slovo). ifra jest klju. Prototip funkcije je: int dodaj (int sifra, char* naziv, const char *ime_dat);
98 Zadaci za vjebu Zadan je niz ulaznih podataka tipa int: 11, 15, 12, 5, 4, 10 Treba napisati sadraj datoteke u kojoj su ovi ulazni podaci pohranjeni kao jednostruko povezana lista sortirana rastuim redosljedom. Upisati adrese i vrijednosti pojedinih zapisa. Pretpostaviti da je glava liste upisana na poetku datoteke.
Napisati program za oblikovanje i brisanje dvostruko povezane liste, analogno onome za jednostruko povezanu listu.
Stabla 100 Osnovni pojmovi Stablo je konaan skup vorova sa svojstvima: postoji poseban vor koji se naziva korijen (root) ostali vorovi su podijeljeni u n disjunktnih podskupova T 1 ..T n , od kojih je svaki stablo. T 1 ..T n se nazivaju i podstabla. Primjer:
a je korijen stabla Stupanj vora a je 2 (stupanj je broj podstabala nekog vora, npr. vor c ima stupanj 3) Skup {h,i,e,f,j,k} je skup krajnjih vorova (listova) Korijeni podstabala nekog vora su djeca tog vora (npr. vorovi e,f,g su djeca od c), a taj vor nazivamo roditeljem (npr. g je roditelj od j). Slini pojmovi se koriste i za ostale odnose (djed, braa, pretci). Stupanj stabla je maksimalni stupanj od svih vorova tog stabla, u ovom primjeru 3. Razina (level) nekog vora se odreuje iz definicije da je korijen razine 1, a da su razine djece nekog vora razine n jednaki n+1. Dubina (depth) stabla je jednaka maksimalnoj razini nekog vora u stablu.
a b c d e f g j i h k 101 Binarna stabla Binarno stablo je stablo koje se sastoji od nijednog, jednog ili vie vorova drugog stupnja. Kod binarnog stabla razlikujemo lijevo i desno podstablo svakog vora. Nazivlje uvedeno za stabla na isti se nain koristi i kod binarnih stabala.
a b c d Koso stablo a b c g Potpuno stablo c d f e h 102
Iz definicije binarnog stabla slijede zakljuci da je: maksimalni broj vorova na k-toj razini jednak je 2 k-1
maksimalni broj vorova binarnog stabla dubine k jednak je 2 k -1 za k>0 Stablo koje je visine k i ima 2 k -1 elemenata naziva se puno (full) binarno stablo. Binarno stablo s n vorova dubine k je potpuno (complete) ako i samo ako njegovi vorovi odgovaraju vorovima punog binarnog stabla dubine k koji su numerirani od 1 do n. Posljedica je u tome da je razlika razina krajnjih vorova potpunog stabla najvie jedan.
Binarna stabla
1 Razina 2 1 3 k k+1 2 3 4 i/2 6 7 2 k
2 k-1 +1 2 k-1
2 k +1 2 k -1 2 k -2 2 k+1 -1 i i+1 2i 2i+1 ... ... ... ... ... 103 Potpuno se binarno stablo jednostavno prikazuje jednodimenzionalnim poljem, bez podataka za povezivanje i koristi se pravilima za odreivanje odnosa u stablu. Koritenje polja poet e od lana s indeksom 1 radi jednostavnosti izraza. Pravila za potpuno binarno stablo sa n vorova, za i-ti vor su: roditelj(i)= i/2 za i= 1; kada je i=1, vor i je korijen pa nema roditelja lijevo_dijete(i)=2*i ako je 2*is n; kad je 2*i>n vor i nema lijevog djeteta desno_dijete(i)=2*i+1 ako je 2*i+1sn; kad je 2*i+1>n vor i nema desnog djeteta Ovako se mogu prikazati sva binarna stabla, ali se tada efikasno ne koristi memorija. Najgori sluaj su kosa (skewed) stabla koja koriste smo k lokacija od 2 k -1 lokacija predvienih za to stablo.
Problem kod prikaza stabla statikom strukturom polje je i teko umetanje i brisanje vorova jer ti zahtjevi mogu traiti pomicanje puno elemenata.
Prikaz stabla statikom strukturom polje
a b c d e Koso stablo Potpuno stablo a b d h p c e f g i j k l m n o 104 Prikaz stabla dinamikom strukturom Koso stablo a b c d Problem se rjeava korienjem strukture s pokazivaima. Ovakova struktura se esto upotrebljava i zadovoljava veinu potreba. Ponekad se dodaje pokaziva na roditelja. struct cvor{ tip podaci; struct cvor *lijevo_dijete; struct cvor *desno_dijete; struct cvor *roditelj; /* kad je potrebno */ };
Potpuno stablo a b d h c e f g i 105 Prikaz stabla dinamikom strukturom Prirodna generalizacija binarnih stabala su k-stabla, gdje k predstavlja stupanj stabla, k>2, sa istim mogunostima prikazivanja. Openita stabla, s raznim stupnjevima, se mogu transformirati u binarna stabla to rezultira manjim i efikasnijim algoritmima, te manjim potrebama za memorijom.
Moe se oblikovati stablo za traenje (sortirano, ureeno stablo) po nekom od podataka (kljuu) koji se upisuju u pojedini vor. Upis novog vora poinje pretragom od korijena stabla. Usporeuje se ve upisani podatak u vorovima s novim podatkom: ako je klju novog vora manji od kljua upisanog vora usporedbe, nastavlja se usporedba u lijevom podstablu. ako je klju novog vora vei ili jednak od kljua upisanog vora usporedbe, nastavlja se usporedba u desnom podstablu. ako upisani vor nema podstablo u traenom smjeru, novi vor postaje dijete upisanog vora.
SortiranoStablo 106 Obilazak stabla 3 standardna naina obilaska stabla kojima se osigurava da je svaki vor bio "posjeen". Radi se o rekurzivnim postupcima koji seu do listova stabla, a zatim povratci iz rekurzije predstavljaju kretanje prema korijenu stabla. inorder: lijevi vor - korijen - desni vor preorder: korijen - lijevi vor - desni vor postorder: lijevi vor - desni vor - korijen
poseban sluaj inorder: ispis strukture stabla desni vor - korijen - lijevi vor SortiranoStablo
Dohvat podataka iz stabla s izraunavanjem ProsjekUStablu 107 Zadaci za vjebu Na magnetskom disku u slijednoj formatiziranoj datoteci studenti nalaze se zapisi sljedeeg sadraja: matini broj 8 znamenki prezime i ime 40+1 znakova ocjene 10*1 znamenka a ) Napisati program koji e formirati novu neformatiziranu datoteku index u kojoj e podaci radi brzog dohvata po matinom broju biti organizirani kao ureeno binarno stablo. b) Napisati program koji za zadani matini broj, redni broj ocjene i ocjenu aurira zapise u datoteci index sve dok je matini broj vei od nule.
Napisati funkciju za ispis elementa memorijski rezidentnog ve oblikovanog sortiranog binarnog stabla u ije vorove su upisani: cijena artikla (cijeli broj) i naziv artikla (15+1 znakova). Stablo je sortirano po cijeni artikala; lijevi jeftiniji, desni skuplji. Ulazni argument je korijen stabla. Ispis treba biti poredan po cijeni od najjeftinijeg do najskupljeg artikla.
108 Zadaci za vjebu U binarno stablo pohranjuje se niz podataka: 12, 15, 5, 3, 7, 2, 18, 11 a) treba nacrtati sortirano binarno stablo (lijevi manji, desni vei) ako je stablo popunjavano redom kako su dolazili podaci b) poredati ulazne podatke tako da nastupi neki od najgorih sluajeva c) nacrtati binarno stablo koje predstavlja najbolji sluaj d) koliko je apriorno vrijeme izvoenja za pronalaenje pojedinog vora za b) e) koliko je apriorno vrijeme izvoenja za pronalaenje pojedinog vora za c)
U neko memorijski rezidentno binarno stablo upisane su ifre duljine 10+1 znakova. Napisati funkciju koja e provjeriti postojanje neke zadane ifre. Ulazni argumenti su korijen stabla i zadana ifra, a izlaz je 0 ako podatak ne postoji, a 1 ako postoji. U pojedinom voru stabla upisana je ifra i pokazivai na lijevi i na desni vor.
U neko memorijski rezidentno sortirano binarno stablo (lijevi vor manja vrijednost, desni vor vea vrijednost) upisani su matini brojevi (cijeli broj kao klju) i teine osoba. Napisati funkciju koja e izraunati ukupnu teinu osoba iji se podaci nalaze upisani u stablu. Prototip funkcije je: float tezina (struct cvor* korijen);
109 Zadaci za vjebu
U neko memorijski rezidentno binarno stablo upisani su matini brojevi (cijeli broj) i teine osoba (realni broj). Napisati funkciju koja e izraunati prosjenu teinu osoba iji se podaci nalaze upisani u stablu, naenu maksimalnu teinu i broj upisanih osoba. Prototip funkcije je: float prosjek (struct cvor *korijen, float *tezina, int *broj, float *maxtez);
U memoriji je oblikovano binarno stablo koje sadri ifru (cijeli broj) i naziv predmeta (15+1 znakova). Treba ispisati nazive predmeta tako da bude vidljiv oblik stabla. Razina vora neka odgovara broju praznina od lijevog ruba. Prototip funkcije je: void pisi (cvor *glava, int razina); Gomila, hrpa (heap) 111 Osnovni pojmovi Jednostavno umetanje novih podataka i nalaenje nekog elementa u skupu podataka omoguuje struktura podataka koja se naziva prioritetni red. Ako se koristi struktura red, dodavanje novog lana je jednostavno, ali pronalaenje zadanog elementa zahtijeva prolaz kroz prosjeno n/2 podataka u redu od n lanova. Sortirana lista zahtijeva prosjeno n/2 traenja za umetanje lana, a isto toliko i za traenje. Situacija je ista za traenje u nesortiranoj listi ukoliko traeni podatak postoji. Ako ne postoji, obavlja se n traenja. Za stvaranje prioritetnog reda najee se koristi gomila. Gomila je potpuno binarno stablo sa svojstvom da je podatak u nekom voru vei ili jednak podacima u vorovima svoje djece (ako postoje). Relacija vei ili jednak moe se zamijeniti proizvoljnom relacijom.
112 Oblikovanje strukture gomila Najee se n elemenata sloi u gomilu, pa je najjednostavnije koristiti potpuno binarno stablo za prikazivanje gomile, makar bi i druga binarna stabla mogla zadovoljavati. To se ostvaruje ubacivanjem jednog po jednog elementa u gomilu, uvajui svojstvo gomile. Poinje se od prazne gomile. Na "dno" (list) gomile dodaje se lan koji se onda usporeuje i zamjenjuje sa svojim roditeljem, praroditeljem, prapraroditeljem itd. dok ne postane manji ili jednak nekoj od tih vrijednosti.
GomiluStvori 113 Oblikovanje strukture gomila Za analizu najgoreg sluaja algoritma uzmimo n elemenata. Na i-toj razini potpunog binarnog stabla ima najvie 2 i-1 vorova. Na svim niim razinama do tada ima ukupno 2 i-1 - 1 vorova, za i > 1. Stablo s k razina ima najvie 2 k -1 vorova. Stablo s k-1 razinom ima najvie 2 k-1 -1 vorova. Ako je stablo potpuno, zapoeta je posljednja razina, pa vrijedi 2 k-1 - 1 < n 2 k - 1 Iz ovoga slijedi: 2 k-1 < n + 1 (k 1) log 2 < log (n + 1) k < log 2 (n + 1) + 1 n + 1 2 k log (n+1) k log 2 log 2 (n+1) k log 2 (n+1) k < log 2 (n + 1) + 1 odnosno k = log 2 (n+1)( Na primjer: za n = 14 treba log 2 15( = ln
15/ln 2( = 2.70805/0.693147( = 3.9( = 4 razine za n = 15 treba log 2 16( = 4( = 4 razine za n = 16 treba log 2 17( = 4.087( = 5 razina
114 Ubrzanje algoritma U najgorem sluaju, while petlja se izvrava proporcionalno broju razina u gomili. Skup podataka koji predstavlja najgori sluaj za ovaj algoritam je polje s rastuim podacima. Tada svaki novi element, onaj koji se ubacuje u gomilu pozivom funkcije ubaci, postaje korijen pa se kroz k razina obavlja zamjena. Vrijeme izvoenja je tada O(n log 2 n). Za prosjene podatke vrijeme za stvaranje gomile iz skupa podataka je O(n), to je za red veliine bolje. Za poboljanje brzine obavljanja zadanih operacija stvoren je algoritam koji kree od krajnjih vorova prema korijenu, razinu po razinu. Samo podatak u korijenu moe naruavati svojstvo gomile, dok podstabla zadravaju to svojstvo. Tada je samo potrebno tu nepravilnost ispraviti i opet dobivamo eljenu gomilu. To ini funkcija podesi u slijedeem primjeru. Za krajnje vorove svojstvo gomile je zadovoljeno, pa treba u stvori_gomilu funkciji provesti popravljanje svojstva gomile samo za korijen stabla. GomiluPodesi
115 Ubrzanje algoritma Stvaranje gomile za ulazni niz podataka: 10,19,18,71,12,51,32
10 19 18 71 12 51 32 10 19 51 71 12 18 32 71 19 51 10 12 18 32 10 71 51 19 12 18 32 116 Ubrzanje algoritma Za n podataka, 2 k-1 s n < 2 k , broj razina je k = log 2 (n+1)( . Za najgori sluaj broj iteracija u podesi iznosi k-i za vor na razini i gdje ima najvie 2 i-1 vorova. Prema tome, vrijeme izvoenja za stvori_gomilu je:
k E 2 i-1 (k-i) . Uoimo da se eksponent mijenja od 0 do k -1, a faktor od k -1 do 0. i=1
Slijedi ekvivalentni izraz kad se izbaci faktor 0 i obrne redosljed sumacije:
k-1 k-1 = E i 2 k-i-1 = E 2 k -1 i 2 -i
i=1
i=1
S obzirom da je 2 k-1 s n,
k-1
s n E i/2 i s 2 n = O(n), jer suma reda tei prema 2. i=1
117 Ubrzanje algoritma Vrijeme izvoenja za najgori sluaj algoritma stvori_gomilu je O(n), to je za red veliine bolje od O(n log 2 n) za uzastopno koritenje ubaci funkcije. Funkcija stvori_gomilu trai da su svi elementi za stvaranje gomile ve prisutni, dok ubaci moe ubaciti novi element u gomilu bilo kada. Funkcije koje gomila treba brzo obaviti i radi kojih je napravljena ta struktura podataka su ubacivanje novih i brisanje najveeg elementa iz skupa podataka. Brisanje najveeg podatka se obavlja izbacivanjem korijena i pozivanjem funkcije podesi, a ubacivanje novih se radi funkcijom ubaci. Tako se postie da se obje eljene funkcije obavljaju u O(log 2 n) vremenu.
Gomila moe, kao to je reeno, biti napravljen za razne relacije njenih elemenata. Tako gomilu s relacijom vei od zovemo max heap, a s relacijom manji od min heap. Sortiranje 119 Postupci sortiranja Sortovi Bubble sort : najvei lan u polju postavlja se na kraj polja, a u ostatku polja se na jednak nain trai najvei lan. Izravna realizacija ima vrijeme izvoenja O(n 2 ). Sort umetanjem: obavlja se n-1 prolaza kroz polje. U prolazu i, i=1,...,n-1 postie se ureenost prvih i+1 elemenata tako da se na pravoj poziciji napravi slobodno mjesto za element s indeksom i. Vrijeme izvoenja je O(n 2 ). Heap sort: element s vrha gomile zamjenjuje se s posljednjim elementom polja, gomila se skrauje za 1 element i podeava. Sloenost podeavanja je O(log 2 n). To se obavlja n puta pa je sloenost sorta O(nlog 2 n). Razlika u vremenu izvoenja za razliite redove veliine sloenosti postane znaajna za veliki n: n log 2 n nlog 2 n n 2
120 Postupci sortiranja Sortiranje oko milijun podataka nije u praksi rijetko. Ako bi jedno obavljanje programske petlje trajalo 1 s, klasini sort bi trajao reda veliine 10 6 s, odnosno vie od 11 dana, dok heap sort traje reda veliine 20 s. To bi trebalo ukazati da se ne treba uvijek traiti rjeenje u kupnji brih i skupljih raunala, nego da se moe isplatiti investicija u razvitak i primjenu boljih algoritama. Shell sort: Autor: Donald Shell. Koristi se inkrementalni slijed brojeva h 1 , h 2 , h 3 , ,h t . U k-toj fazi uzlaznog sortiranja polja A za h k postie se A[i] s A [i + h k ], i Za takvo polje kae se da je h k sortirano. Ako se takvo polje sad h k-1 sortira, ono ostaje i dalje h k sortirano. Sort zavrava s h 1 =1
121 Postupci sortiranja Analiza sloenosti Shell sorta: Prosjeno vrijeme izvoenja je ve dugo otvoreni (nerijeeni) problem. Najgori sluaj O(n 2 ). Hibbardov slijed: {1, 3, 7, , 2 k -1} rezultira najgorim sluajem O (n 3/2 ). Prosjeno O(n 5/4 ) utvreno je simulacijom; nitko to nije uspio dokazati! Sedgwickov slijed: {1, 5, 19, 41, 109,}, odnosno 9*4 i - 9*2 i + 1 alternira s 4 i - 3*2 i +1 Najgori sluaj O(n 4/3 ), a prosjeno O(n 7/6 ). Ne zna se da li postoji bolji slijed. Jednostavan algoritam, a krajnje komplicirana analiza sloenosti. Algoritam je dobar za umjerenu koliinu ulaznih podataka (desetci tisua). Mergesort (Uparivanje i sortiranje) Na temelju dva sortirana polja (A i B) puni se tree (C). Koristi se strategija "podijeli pa vladaj" uz rekurziju. Grananjem nastane log 2 n razina, a u svakoj od razina obavlja se O(n) posla. Trajanje je, dakle, O(n log 2 n)
122 Postupci sortiranja Rijetko se koristi za sortiranje u sredinjoj memoriji zbog zahtjeva za dodatnom memorijom i mnogo kopiranja. To je kljuni algoritam za sortiranje na vanjskoj memoriji. Quicksort Quicksort jest, kako mu ime kae, do sada najbri poznati algoritam za sortiranje. Prosjeno vrijeme izvoenja je O(n log 2 n). Postupak je vrlo brz, uglavnom zbog visokooptimirane unutranje petlje. Najgori sluaj je O(n 2 ), ali se moe postii da vjerojatnost da on nastupi eksponencijalno pada. Algoritam se moe lako shvatiti i dokazati da je korektan. Radi se o rekurzivnom algoritmu zasnovanom na strategiji "podijeli pa vladaj". Osnovni algoritam za sortiranje polja S sastoji se od sljedea etiri jednostavna koraka: Ako je broj lanova polja S jednak 0 ili 1, povratak u pozivni program. Odabrati bilo koji lan v u polju S. To je stoer. Podijeli preostale lanove polja S, S \ {v} u dva odvojena skupa: S 1 = { x e S \ {v} , x s v} i S 2 = { x e S \ {v} , x > v} Vrati {quicksort (S 1 ), v, quicksort (S 2 )}
123 Postupci sortiranja Budui da izbor stoera nije jednoznano odreen, niti je jednoznano odreeno to uiniti s lanovima polja jednakim stoeru, to postaje pitanje realizacije algoritma. Dio dobre ugradnje je efikasno rijeiti ovo pitanje. Tema je detaljno obraena u Weiss: "Data Structures and Algorithm Analysis in C".
Indirektno sortiranje Ako treba sortirati velike strukture, npr. matini broj studenta, prezime, ime, adresa, upisani predmeti i ocjene itd., tada nema smisla obavljati mnogo zamjena velikog broja podataka. Ako se podaci sortiraju npr. po matinom broju, tada se izdvoje u posebno polje matini brojevi s pripadnim pokazivaima na ostale podatke. Sortira se (bilo kojim od postupaka) samo takvo izdvojeno polje.
124 Zadaci za vjebu Zadan je niz ulaznih podataka: 12, 15, 5, 3, 7, 2 18, 11, 4, 10 treba nacrtati potpuno binarno stablo koje je nastalo slijednim upisom ulaznih podataka treba nacrtati podatkovnu strukturu gomila u koju su pohranjeni ulazni podaci koliko iznosi apriorno vrijeme izvoenja za pretvorbu potpunog binarnog stabla u strukturu gomila?
Zadan je niz ulaznih podataka tipa int: 12, 5, 4, 10, 7, 8 11 Treba nacrtati stablo koje predstavlja strukturu gomila, takvu da omoguuje rjeenje zadatka pod b) Treba ilustrirati kako radi silazno sortiranje koritenjem strukture gomila (heap sort) Koliko je apriorno vrijeme potrebno za sortiranje n podataka?
125 Zadaci za vjebu Napisati program koji e u cjelobrojnom polju od n lanova pronai k-ti najvei lan polja. a ) Uitano polje sortirati po padajuim vrijednostima i ispisati lan s indeksom k-1. b) Uitati k lanova polja, sortirati ih po padajuim vrijednostima. Uitavati preostale lanove polja. Ako je pojedini lan manji od onoga s indeksom k-1, ignorirati ga, ako je vei umetnuti ga na pravo mjesto, a izbaciti lan polja koji bi sad imao indeks k. c) Varirati postupke sortiranja te odrediti pripadna apriorna vremena i izmjeriti aposteriorna vremena izvoenja.
Odrediti apriorna vremena trajanja, a izmjeriti aposteriorna vremena. Varirati postupak sortiranja. Tehnike adresiranja 127 Osnovni pojmovi Poznavajui klju nekog zapisa postavlja se problem pronalaenja tog zapisa. Primarni klju jednoznano odreuje neki zapis (npr. MaticniBrojStudenta). Ulanani (kompozitni) kljuevi su potrebni za jednoznano odreivanje nekih vrsta zapisa (npr. MaticniBrojStudenta & SifraPredmeta & DatumIspita jednoznano odreuju zapis o odranom ispitu). Sekundarni klju ne mora jednoznano odreivati zapis, ali ukazuje na neki atribut (npr. GodinaStudija u zapisu s podacima o predmetu).
128 Postupci pretraivanja Slijedno pretraivanje Najprimitivniji nain je pregledavanje datoteke zapis po zapis. Koristi se kod onih slijednih datoteka kod kojih se ionako svi zapisi moraju itati.
Blokirano itanje Kod direktnih datoteka (svi zapisi su jednake duljine!) sortiranih po primarnom kljuu nije neophodno pregledavati sve zapise. Moe se pregledavati npr. svaki stoti zapis. Kad se ustanovi poloaj zapisa s traenim kljuem, pripadni blok se slijedno pretrai. U sluaju kad ima N f stavaka, a veliina bloka je N b , ima N f /N b vodeih zapisa blokova. Za oekivati je da je prilikom traenja bloka potrebno obaviti itanje polovice postojeih vodeih zapisa blokova. Unutar ustanovljenog bloka ima N b
zapisa pa je za oekivati da e se traeni zapis nai nakon prosjeno N b /2 itanja unutar tog bloka. Prema tome ukupni oekivani broj itanja jest N f /(2*N b ) + N b /2. Deriviranjem po N b i izjednaenjem derivacije s nulom dobije se optimalna veliina bloka: N b = N f
1/2 129 Postupci pretraivanja Binarno pretraivanje Binarno pretraivanje zapoinje na polovici datoteke/polja i nastavlja se stalnim se raspolavljanjem intervala u kojem bi se mogao nai traeni zapis. Prosjeni broj pretraivanja je log 2 n -1. Postupak je neprikladan za diskovne memorije s direktnim pristupom zbog dugotrajnog pozicioniranja glava. Preporua se za pretraivanje u brzim poluvodikim memorijama (RAM). Algoritam je sloenosti O(log 2 n). BinarnoPretrazivanje Indeks-sekvencijalne datoteke Ako je datoteka sortirana po kljuu, prikladno je formirati tablicu za pretraivanje. Ulazni podatak za tablicu je klju traenog zapisa, a izlazni rezultat je informacija koja poblie locira traeni zapis. Takva tablica naziva se indeks. Indeks ne mora pokazivati na svaki zapis nego samo na blok ime se smanjuje veliina indeksa. Kod velikih datoteka postoje indeksi na vie razina. Nakon odreenog broja izmjena sadraja datoteke, ona se mora reorganizirati, tj. upisati slijedno prema vrijednosti kljua i ponovno indeksirati (tzv. odravanje datoteke). 130 Postupci pretraivanja Ubacivanje i brisanje Kod tradicionalne slijedne (sekvencijalne) datoteke (magnetska traka) ubacivanje novih zapisa radi se tako da se cijela datoteka prepie uz dodavanje novih zapisa. Kod direktnih datoteka brisanje zapisa obavlja se logiki, tj. upie se znaka da su logiki izbrisani. Indeksne nesekvencijalne datoteke Ukoliko se eli pretraivanje po vie kljueva ili kad se esto dodaju i briu zapisi, nemogue je odnosno teko ostvariti da zapisi budu sortirani. U takvom sluaju indeks mora sadravati adresu, relativnu ili apsolutnu, svakog pojedinog zapisa. Klju sadri adresu Najjednostavniji sluaj je kad se formira klju tako da neki njegov dio sadri adresu zapisa. (Npr. kod obrade klasifikacijskog ispita broj prijave je klju, a ujedno to je i redni broj zapisa u direktnoj datoteci). esto ovako jednostavan postupak nije mogu jer se sustav ifriranja ne moe prilagoditi nekom pojedinanom programu.
131 Raspreno adresiranje (hashing) U nekim primjenama mogue je propisati postupke za transformaciju kljua u adresu, ili to je jo bolje u neki redni broj. Pod tim rednim brojem nalazi se zapisan poloaj zapisa. Ova modifikacija poboljava fleksibilnost. Inae je nedostatak u tome to dio prostora za zapise ostaje neiskoriten. Vrlo povoljna tehnika je raspreno adresiranje. Odreenim postupkom se iz vrijednosti kljua izraunava pseudo-sluajni broj iz intervala od 0 do M-1. Taj broj je adresa grupe podataka (pretinca) koji svi daju isti pseudo-sluajni broj. M je broj predvienih takvih pretinaca. Ako se neki pretinac popuni, moe se u njega upisati pokaziva na preljevno podruje ili se prelazi na susjedni pretinac. Kod primjene rasprenog adresiranja variranju su podloni sljedei elementi: Kapacitet pretinca Transformacijom kljua nastaje pseudo-sluajni broj koji daje adresu pretinca. Ako je kapacitet pretinca 1, est je sluaj preljeva. to je vei kapacitet pretinca, preljev je manje vjerojatan, ali je itanje pojedinog pretinca dulje i raste potreba za slijednim pretraivanjem unutar pretinca. Ako se podaci nalaze u brzoj memoriji, izabire se veliina pretinca 1. Povoljno je veliinu pretinca uskladiti s fizikom veliinom zapisa na vanjskoj memoriji (BLOK). 132 Raspreno adresiranje (hashing) Gustoa pakiranja Nakon to je odabrana veliina pretinca, moe se odabrati gustoa pakiranja, tj. broj takvih pretinaca za pohranjivanje predvienog broja zapisa. Da bi se smanjio broj preljeva, izabire se vei kapacitet: Gustoa pakiranja = (Broj zapisa) / (Ukupni kapacitet) N = Broj zapisa koje treba pohraniti M = Broj pretinaca C = Broj zapisa u jednom pretincu Gustoa pakiranja = N / (M *C) Vjerojatnost da e u neki pretinac biti upueno x zapisa ravna se po binomnoj razdiobi: P(x) = N!/(x! (N - x)!) (1/M) x (1 - 1/M) N - x
Vjerojatnost da e biti Y preljeva: P(C + Y) Oekivani broj preljeva iz zadanog pretinca:
s = E ( P(C+Y) Y) Y=1 Ukupni oekivani postotak preljeva: 100-s -M/N
133 Transformacija kljua u adresu Openito se klju transformira u adresu pretinca u 3 koraka: Ako klju nije numeriki, treba ga transformirati u broj i to bez gubitka informacije. Nad kljuem se upotrebi algoritam koji ga transformira, to je mogue ravnomjernije, u pseudo-sluajni broj reda veliine broja pretinaca. Rezultat se mnoi s odgovarajuom konstantom s 1 zbog transformacije u interval relativnih adresa koji je jednak broju pretinaca. Relativne adrese se konvertiraju u apsolutne na konkretnoj fizikoj jedinici i to je u pravilu zadatak sistemskih programa. Primjer: 6 znamenkasti klju, 7000 pretinaca. Klju: 172148 Sredinje znamenke kvadrata kljua Kvadrat kljua daje 12 znamenkasti broj. Koriste se 5. do 8. znamenka. Kvadrat: 029634933904 Sredinje 4 znamenke treba transformirati u interval [0, 6999]. Budui da pseudosluajni broj poprima vrijednosti iz intervala [0, 9999], a adrese pretinaca su iz intervala [0, 6999], faktor kojim ga se mnoi je 6999/9999 ~ 0.7 Adresa pretinca = 3493 * 0.7 = 2445 Rezultati odgovaraju onima za roulette. 134 Transformacija kljua u adresu Korijen iz sredinjih znamenki kvadrata kljua Za prethodni primjer nakon kvadriranja se izvadi korijen iz 8 sredinjih znamenki, odbace se decimale da bi se dobio etveroznamenkasti broj: (96349339) 1/2 = 9815 Dijeljenje Klju se dijeli s prim brojem priblino jednakim broju pretinaca (npr. 6997). Ostatak dijeljenja je adresa pretinca. Adresa pretinca = 172148 mod (6997) = 4220 Dobro se rasporeuju kljuevi koji su u nizu. Posmak znamenki i zbrajanje Npr. klju = 17207359
1720 + 7359 9079 135 Transformacija kljua u adresu Preklapanje Preklapanje je slino posmaku, ali je prikladnije za dugake kljueve Npr. klju = 172407359 407 953 +271 1631 Izmjena baze brojanja Broj se izrauna kao da ima drugu bazu brojanja B. Npr. B = 11, klju = 172148 1*11 5 + 7*11 4 + 2*11 3 + 1*11 2 + 4*11 1 + 8*11 0 = 266373 Odabere se potreban broj najmanje znaajnih znamenki i transformira u raspon adresa: Adresa pretinca = 6373 * 0.7 = 4461
Izbor najboljeg postupka se postie simulacijom za konkretnu primjenu. Dijeljenje je openito najbolje.
136 Postupak s preljevom Ulanavanje Postupak je jednostavan kad preljevni pretinac ima kapacitet 1. Kod preljeva u primarni pretinac koji je popunjen upie se adresa preljevnog pretinca. Ako se ponovno javi preljev, u 1. preljevni pretinac se upie adresa 2. preljevnog pretinca itd. Kad preljevni pretinac ima vei kapacitet, vie primarnih pretinaca koristi isti preljev. Koritenje primarnog podruja Ako je neki pretinac popunjen, koristi se sljedei itd. Iza zadnjega cikliki dolazi prvi. Postupak je efikasan kod veliina pretinca iznad 10. Koritenje preljevnog podruja Ako je neki pretinac popunjen, postupkom transformacije kljua izrauna se adresa u preljevnom podruju, koje je obino manje to ako se dogodi preljev u preljevnom podruju ulanavanje, koritenje istog preljevnog podruja (upis u sljedei pretinac),...
137 Odreivanje parametara Primjer: Na Fakultetu ima oko 350 studenata. Treba pohraniti njihov JMBG (13 znakova) i prezime (14 znakova), s tim da ih se moe pronalaziti brzo po JMBG. Rjeenje: JMBG se sastoji od 13 znamenki. Zadnja znamenka je kontrolni broj i moe se, ali i ne mora pohranjivati ako se zna pravilo po kojem je izraunata. Jedan zapis sadri 13+1 + 14+1 = 29 By. Fiziki blok na disku neka je veliine 512 By. To znai da bi veliina pretinca trebala biti manja ili jednaka tom iznosu. 512/29 = 17.655. Slijedi da e pretinac sadravati podatke o 17 studenata i 19 By neiskoritenog prostora. Predvidjet e se kapacitet tablice neto vei da se smanji broj oekivanih preljeva, npr. za 30%. To znai da ima 350/17 *1.3 = 26 pretinaca. JMBG treba transformirati u adresu pretinca iz intervala [0, 25]. JMBG je vrlo dugaak pa bi dola u obzir tehnika preklapanja. Postupci se mogu i kombinirati, pa nakon preklapanja obaviti dijeljenje. Adresa e se raunati dijeljenjem s prim brojem bliskim broju pretinaca, npr. 23. 138 Odreivanje parametara Primjeri transformacije kljua: JMBG = 150797433006x 9743 7051 6003 22797 mod (23) = 4 JMBG = 140797533007x 9753 7041 7003 23797 mod (23) = 15 ... Ako pretinac bude popunjen, prelazi se na susjedni pretinac, cikliki (bad neighbour policy).
JMBG = 130797533007x 9753 7031 7003 23787 mod (23) = 5 JMBG = 130797533008x 9753 7031 8003 24787 mod (23) = 16 139 Programsko rjeenje Kreiraj na disku praznu tablicu itaj slijedno JMBG i prezime, dok ima podataka Ako je kontrolna znamenka nije ispravna "Neispravan JMBG" inae Stavi oznaku da zapis nije upisan Izraunaj adresu pretinca Upamti izraunatu adresu kao poetnu Ponavljaj itaj iz pretinca upisane zapise Ponavljaj za sve zapise iz pretinca Ako zapis nije prazan Ako je upisani JMBG identian ulaznom "Zapis vec postoji" Stavi oznaku da je zapis upisan Skok iz petlje Inae
140 Programsko rjeenje Upii ulazni zapis Stavi oznaku da je zapis upisan Skok iz petlje Ako zapis nije upisan Poveaj adresu pretinca za 1 i izraunaj mod (broja pretinaca) Ako je dobivena adresa jednaka poetnoj adresi Tablica je puna Dok ne bude zapis upisan ili tablica puna Kraj
Hash
141 Zadaci za vjebu Napisati funkciju koja e u neformatiziranoj datoteci artikli organiziranoj po principu rasprenog adresiranja prebrojiti koliko ima upisanih zapisa o artiklima. Jedan zapis sadri ifru (cijeli broj), naziv (50+1 znakova), koliinu (cijeli broj) i cijenu (realni broj). Zapis je prazan ako je na mjestu ifre vrijednost nula. Veliina fizikog bloka na disku je BLOK, a oekivani maksimalni broj zapisa je MAXZAP. Ovi su parametri upisani u parametri.h.
Napisati funkciju koja e u neformatiziranoj datoteci organiziranoj po principu rasprenog adresiranja odrediti gustou pakiranja. Jedan zapis sadri naziv (50+1 znakova), koliinu (cijeli broj) i cijenu (realni broj). Zapis je prazan ako je na mjestu koliine vrijednost nula. Veliina fizikog bloka na disku je BLOK, to je definirano u parametri.h. Protototip funkcije je: float gustoca (const char *ime_datoteke);
142 Zadaci za vjebu Napisati funkciju za upis ifre (cijeli broj) i naziva (20+1) u memorijski rezidentnu tablicu rasprenih adresa s 500 pretinaca. Pretinac sadri jedan zapis. Ako je pretinac popunjen, prelazi se cikliki na susjedni. Ulazni argumenti su ve izraunata adresa pretinca, ifra i naziv. Funkcija vraa vrijednost 1 ako je upis obavljen, 0 ako podatak ve postoji, a -1 ako je tablica popunjena pa se podatak nije mogao upisati.
Napisati funkciju za pronalaenje ifre (cijeli broj) i naziva poduzea (30+1) iz memorijski rezidentne tablice rasprenih adresa s 200 pretinaca. Pretinac sadri jedan zapis. Ako je pretinac popunjen, a ne sadri traenu vrijednost kljua, prelazi se cikliki na susjedni. Ulazni argumenti su ve izraunata adresa pretinca i ifra. Izlazni argument je naziv poduzea. Funkcija vraa vrijednost 1 ako je zapis pronaen, a 0 ako nije.
Napisati funkciju za transformaciju kljua koji je telefonski broj od 7 znamenki u rasprene adrese. Tablica rasprenih adresa sadri M pretinaca. Koristiti postupak dijeljenja. Prototip funkcije je: int adresa (int m, long telef);
143 Zadaci za vjebu
Napisati funkciju za izraun adrese pretinca u tablici s 500 pretinaca. Klju je ifra od 4 znamenke, a metoda je korijen iz srednjih znamenki kvadrata.
7. Napisati funkciju za pranjenje neformatizirane datoteke artikli organizirane po principu rasprenog adresiranja. Jedan zapis sadri ifru (etveroznamenkasti cijeli broj), naziv (do 30 znakova) i cijenu (realni broj). Zapis je prazan ako je na mjestu ifre vrijednost nula. Veliina fizikog bloka na disku je BLOK, a oekivani maksimalni broj zapisa je MAXZAP. Ovi su parametri upisani u parametri.h. 144 Organizacija ispita Ispit se sastoji od sljedeih dijelova: Rijeen dobiveni zadatak Pismeni ispit Usmeni ispit Dobiveni zadatak Svaki student je kao preduvjet za pristupanje ispitu duan izraditi jedan od zadataka koji se nalaze na http://www.fer.hr/predmet/327 Zadatak student predaje na poetku pismenog dijela ispita. Na popisu ima N zadataka. Student izrauje zadatak s rednim brojem koji se izraunava kao:
(Zadnje 2 znamenke studentovog matinog broja + redni broj izlaska na ispit - 1) % N + 1
145 Organizacija ispita Primjer, uz pretpostavku N=20: Student s matinim brojem 36304179 izlazi prvi put na ispit. Izrauje zadatak broj (79 + 1 -1) % 20 +1 = 19 +1 = 20 Ako padne na ispitu, sljedei put izrauje zadatak (79 + 2 -1) % 20 +1 = 1 Prilikom treeg izlaska na ispit izrauje zadatak (79 + 3 -1) % 20 +1 = 2, itd. Novi zadatak izrauje se i onda kad student nije pristupio ispitu na koji se prijavio, ako se nije na vrijeme odjavio.
Zadatak treba rijeiti u potpunosti u jeziku C. Oekuju se rjeenja izraena na raunalu s izvoenjem na test podacima. Za sluaj da student nema pristupa do pisaa, prihvatljiva su i uredno rukom napisana programska rjeenja, s rezultatima koji bi se dobili u izlaznoj datoteci ili datotekama na temelju test podataka. Obvezatno obaviti a priori analizu vremena izvoenja programa.
146 Primjer za rjeenje zadatka
Izraditi program za punjenje i ispis jednostruko povezane uzlazno sortirane liste koja se kao struktura pohranjuje na disk. Element liste sadri jedan cijeli broj kao klju. ListaNaDisku1 A priori analiza vremena izvoenja Kad se dodaje novi podatak uz ve postojeih k podataka, obvezatno se proita glava i, osim za praznu listu, prvi podatak. Ako je novi podatak manji od prvoga, mijenja se glava i upisuje zapis. Ako je vei od prvoga, usporeuje se s oekivano k/2 postojeih zapisa. ita se glava i k/2 zapisa. Mijenja se glava (zbog evidencije broja zapisa) i prethodnik te upisuje novi zapis: Za veliko k: 3 + k / 2 ~ k / 2 ulazno/izlaznih operacija. asimptotsko oekivano vrijeme za veliko n je: n
E k/2 = n(1/2 + n/2)/2 = n/2 + n 2 /4 ~ n 2 /4 k=1 Najgori sluaj su ulazni podaci poredani u rastuem nizu. Tada ima uvijek k usporedbi pa je asimptotsko vrijeme za najgori sluaj n 2 /2. 147 Primjer za rjeenje zadatka
Najpovoljniji sluaj su ulazni podaci poredani u padajuem nizu kad se za svakoga obavlja samo jedna usporedba, znai ukupno n. Vrijeme izvoenja algoritma je O (n 2 ).
Varijanta b) kao u prethodnom primjeru, ali treba dodati i brisanje iz liste. Obrisani element dodaje se na poetak liste brisanih elemenata. Novi element dodaje se na kraj datoteke samo ako je lista brisanih prazna, inae zauzima mjesto prvog iz liste brisanih, ime se modificira lista brisanih. ListaNaDisku2
Doputena je odreena sloboda u izboru algoritma i u pretpostavkama za analizu vremena izvoenja. Ne zahtijeva se optimalno rjeenje, ali student mora biti u stanju obrazloiti ono to je izradio i da to funkcionira!
148 Pismeni ispit Pismeno se rjeava 5 kraih zadataka. Vrijeme rjeavanja je 2 sata. Na poetku pismenog ispita studenti predaju rjeenja dobivenog zadatka. Ocjena iz pismenog dijela ispita oblikuje se na temelju rjeenja odabranog zadatka i rjeenja pismenog ispita. Oba ova elementa moraju biti pozitivno ocijenjena (vie od 50% bodova) za prolaz na pismenom ispitu. Na ispitu se od pomagala smije imati samo popis C-funkcija iz materijala za ASP. Primjer prelagane zadae Napisati void funkciju za ispis sadraja memorijski rezidentne ve oblikovane linearne jednostuko povezane liste u koju su upisani: prezime, ime, prosjek ocjena. Ulazni argument u funkciju je adresa glave liste. Napisati funkciju za izraun adrese pretinca u tablici s 500 zapisa. Klju je ve provjereni matini broj od 6 znamenki bez kontrolne znamenke, a metoda je dijeljenje. Napisati funkciju za upis na stog u statikom polju. Podatak koji se pohranjuje je cijeli broj. U slijednoj formatiziranoj datoteci ulaz su upisani nesortirano: redni broj [1:1000], naziv [do 20 slova]. Treba oblikovati direktnu neformatiziranu datoteku izlaz koja sadri iste podatke, ali sortirane po rednom broju. 149 Pismeni ispit Za algoritam for (i = 0; i < n - 1; i++) { // sortiranje polja for (j = i; j < n; j++) { if (a[i] > a[j]) { pom = a[i]; a[i] = a[j]; a[j] = pom; } } } odrediti apriorno vrijeme izvoenja, prosjeno asimptotsko vrijeme izvoenja i asimptotsko vrijeme izvoenja za najgori sluaj. Kad nastupa najgori sluaj? Pretpostavka je da izvoenje svake pojedine masno otisnute naredbe traje jednako, a vrijeme ostalih da je zanemarivo.
Primjer normalne zadae U binarnom stablu upisani su matini broj (cijeli broj), ime i prezime (30+1 znakova) i prosjek ocjena studenata (realni broj). Treba ispisati podatke o studentu ili studentima koji imaju najvei prosjek ocjena.
150 Pismeni ispit Napisati funkciju za pranjenje neformatizirane datoteke artikli organizirane po principu rasprenog adresiranja. Jedan zapis sadri ifru (etveroznamenkasti cijeli broj), naziv (30+1 znakova) i cijenu (realni broj). Zapis je prazan ako je na mjestu ifre vrijednost nula. Veliina fizikog bloka na disku je BLOK, a oekivani maksimalni broj zapisa je MAXZAP. Ovi su parametri upisani u parametri.h.Datoteka je dimenzionirana priblino za 20% vie od oekivanog maksimalnog broja zapisa. Na magnetskom disku postoji neformatizirana datoteka stog_dat koja je organizirana kao stog. Na poetku datoteke upisan je maksimalni doputeni kapacitet stoga izraen u broju zapisa (int) i adresa zadnje upisanog elementa na stogu (long). Element stoga je zapis o poloenom ispitu studenta: matini broj (long) ime i prezime (24+1 znak) sifra predmeta (int) ocjena (short) Napisati funkcije za upis i za skidanje sa stoga.
151 Pismeni ispit U memoriju su upisani elementi jednostruko povezane liste. Pojedini element sadri iste podatke kao zapis iz prethodnog zadatka. Lista je sortirana po matinom broju studenta. Napisati funkciju koja e ispisivati matine brojeve, ime i prezime i prosjek ocjena studenata: Maticni broj Ime i prezime Prosjecna ocjena xxxxxxxx AAAAAAAAAAAAAAAAAAAAAAAA x.xx xxxxxxxx AAAAAAAAAAAAAAAAAAAAAAAA x.xx
Prototip funkcije je: void ispisi (cvor *glava); Zadan je niz ulaznih podataka tipa int: 12, 5, 4, 10, 7, 8 11 a) Treba nacrtati stablo koje predstavlja strukturu gomila, takvu da omoguuje rjeenje zadatka pod b) b) Treba ilustrirati kako radi silazno sortiranje koritenjem strukture gomila (heap sort) c) Koliko je apriorno vrijeme potrebno za sortiranje n podataka?
152 Pismeni ispit
Primjer preteke zadae U rekurzivnom programu za pronalaenje zadanog zapisa u sortiranom binarnom stablu otkloniti rekurziju prema formalnim pravilima. Realizirati sve funkcije za posluivanje dvostruko povezane linearne liste na disku. Realizirati u memoriji sve funkcije rasprenog adresiranja s automatskom realokacijom memorije i modifikacijom adresa kad se ustanovi da broj preljeva premauje odreeni iznos. Realizirati funkcije strukture gomila koristei dinamiku podatkovnu strukturu stablo. Napisati nerekurzivni program za dodavanje i brisanje zapisa sortiranog binarnog stabla. 153 Usmeni ispit; Ostalo Usmeni ispit Na usmenom ispitu ispituje se ispredavano gradivo. Za prolaz je nuno (ne i dovoljno!) dobro razumijevanje kod kue rijeenog zadatka. Ako se pokae da student nije zadatak samostalno rijeio, on(a) pada na ispitu bez obzira na ostale elemente ispita. Ponavljanje ispita Namjera je stimulirati studente da poloe ispit u prvom pokuaju. Student koji nije poloio ispit, za sljedei izlazak na ispit izrauje zadatak koji cikliki slijedi. Potpisi Uvjet za potpis: Obavljene i kolokvirane laboratorijske vjebe i skupljenih 100 bodova Konzultacije Vrijedi podatak s poetka materijala. Student mora donijeti svoje folije i/ili zabiljeke i tono oblikovana pitanja. Na upite tipa "nita mi nije jasno u svezi binarnih stabala" ili "nisam imao volje ii na predavanja, pa mi sad na brzinu ispriajte saetak", nee se odgovarati!
154 Primjedbe Ponavljamo: Sve primjedbe na predmet i oko njega su dobrodole (smiju biti subjektivne i ne moraju nuno zvuati dobronamjerno). aljite ih na: damir.kalpic@fer.hr ili vedran.mornar@fer.hr ili kresimir.fertalj@fer.hr Subject:ASP