Anda di halaman 1dari 154

Algoritmi i strukture podataka

Prof.dr.sc. Damir Kalpi


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];



redak 1 y[0][0] y[0][1] y[0][2] y[0][n-2] y[0][n-1]


redak 2 y[1][0] y[1][1] y[1][2] y[1][n-2] y[1][n-1]
. . .

redak m y[m-1][0] y[m-1][1] y[m-1][2] y[m-1][n-2] y[m-1][n-1]


24
Polje
trodimenzionalno i viedimenzionalno
# define N 100
# define M 50
float z[3][M][N];

z[2][0][0] z[2][0][n-1]
z[1][0][0]
z[0][0][0]


z[2][m-1][n-1]
z[1][m-1][n-1]
z[0][m-1][0] z[0][m-1][n-1]

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

7 7 82560
82560 82562 82564
IndirektnaZamjenaVrijednosti

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.

Primjer: AritmetikaPokazivaca
(long = 4 By, double = 8 By)
Vrijednosti
long dugi; double dupli; pdugi pdupli
long *pdugi; double *pdupli; ? ?
pdugi = &dugi; 128560 ?
pdupli = &dupli; 128560 128564
++pdugi; 128564 128564
pdupli = pdupli + 2; 128564 128580


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

16 4 64 256
32 5 160 1024
1024 10 10240 1048576
1048576 20 20971520 ~10
12


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

Anda mungkin juga menyukai