Professional Documents
Culture Documents
o sintaksa
o semantika
o pragmatika
Sintaksa sadri pravila za graenje konstrukcija programskog jezika. Ta pravila su unapred odreena
(definisana). Sintaksa programskog jezika je mnogo jednostavnija od sintakse govornog jezika, ali je
zato krajnje stroga.
vrsto je vezana za kompajler, iji je osnovni zadatak (pored prevoenja programa na mainski jezik) da
proveri da li je program napisan u skladu sa sintaksnim pravilima. Drugaije reeno, kompajler proverava
da li je neka struktura pravilno napisana i na taj nain proverava da li je ta struktura uopte deo programskog
jezika.
Semantika se bavi znaenjem onoga to je napisano. To je interpretacija sintaksno pravilno napisane
strukture.
Pragmatika predstavlja nain korienja jezikih konstrukcija da bi se reio zadati problem.
Metajezik slui za formalan prikaz sintakse. To je jezik za opis programskog jezika. Metajezik je
formalan i postoji u mnogo razliitih varijanti. Tri najpoznatija su: BNF, EBNF i sintaksni dijagram.
Prva dva predstavljaju linearnu formu i koriste se za formalno zadavanje sintakse (bazirani su na
metaformulama), dok se trei prikazuje dvodimenzionalno i slui za prezentovanje sintakse.
Terminali su samoobjanjavajue konstrukcije nekog programskog jezika, dok su neterminali
konstrukcije koje treba dalje razjanjavati (treba ih definisati).
Karakteristike:
1. neterminali se prikazuju izmeu < i >. Naziv neterminala je mnemoniki, ukazuje na prirodu
definisanog neterminala;
2. terminali se prikazuju originalnim simbolima, bez ikakvih dodatnih znakova;
3. metaoperacija (tanije metarelacija) dodele prikazuje se simbolom ekvivalencije :: . Sa leve
strane nalazi se terminal (neterminal), a sa desne njegov opis u vidu kombinacije terminala i
neterminala;
4. ekskluzivna disjunkcija eksplicitno navedenih elemenata prikazuje se simbolom | ;
5. lananje simbola vri se tako to ih piemo jedan za drugim;
6. ako konstrukti ne moraju uvek imati istu duinu, koristimo rekurziju;
7. postoji mogunost ponavljanja simbola jednom ili vie puta x i mogunost ogranienog
ponavljanja x m , gde m predstavlja najmanji, a n najvei mogui broj ponavljanja.
n
1
Poboljana Bekus-Naurova forma EBNF
Karakteristike:
1. neterminali se prikazuju bez ikakvih dodatnih znakova. Ako se neterminal sastoji od vie rei,
izmeu njih se stavlja crtica ili donja crta;
2. terminali se prikazuju originalnim simbolima (kao i u ciljnom jeziku), izmeu navodnika;
3. metaoperacija dodele prikazuje se znakom jednakosti, ;
4. ekskluzivna disjunkcija eksplicitno navedenih elemenata prikazuje se simbolom | ;
5. lananje simbola vri se tako to ih piemo jedan za drugim;
6. ako konstrukti ne moraju uvek imati istu duinu, koristimo rekurziju;
7. postoji mogunost ponavljanja simbola nula ili vie puta x i mogunost ogranienog
Sintaksni dijagram
Sintaksni dijagram kao celina ima jednu ulaznu granu, na kojoj pie naziv konstrukcije koju
definiemo.
Karakteristike:
2
Primeri
neterminal identifikator
6
terminal
ekskluzivna disjunkcija
cifra
0 1 2 3 4 5 6 7 8 9
rekurzija
ponavljanje
kard_broj
cifra
3
Osnovi teorije algoritma
W* skup svih rei (nizova simbola), ukljuujui i praznu re, nad jednim apstraktnim alfabetom.
Tri algoritamska sistema su najpoznatiji i sva tri su ekvivalentna, tj. mogu se svesti jedan na drugi. To su:
- rekurzivne funkcije,
- Tjuringove maine i
- Markovljevi normalni algoritmi.
4
Tjuringove maine
o beskonana traka ima ulogu memorije, moe ih biti jedna ili vie, ali su sve ekvivalentne.
Beskonana traka podeljena je na elije, u kojima se nalaze neki simboli. Na
beskonanoj traci nalazi se ulazna re na kojoj se izvode sve transformacije. Na
poetku rada na beskonanoj traci nalazi se neka ulazna re od slova, a levo i desno od
nje su prazne elije.
o upisno-itajua glava vri operaciju uitavanja nekog slova sa ili upisivanja nekog slova na
trenutnu poziciju. Ima mogunost da se pomeri za jedno mesto ulevo ili udesno. U
poetnom trenutku nalazi se iznad prvog slova ulazne rei.
o upravljaki blok upravlja radom Tjuringove maine i uvek se nalazi u nekom stanju. Skup
stanja upravljakog bloka naziva se unutranji alfabet Tjuringove maine. Kad se
upravljaki blok nae u jednom od zavrnih stanja, sesija je zavrena. Na poetku rada,
upravljaki blok je u poetnom stanju.
- prazan simbol (prazno slovo) kada ga upiemo u eliju, skraujemo izlaznu re za jedno slovo.
Nemogue je unapred znati da li e za neku ulaznu re, posle konanog broja koraka, Tjuringova
maina doi u jedno od zavrnih stanja.
Formalna definicija
spoljanji alfabet (skup svih simbola koji se mogu nai na beskonanoj traci ukljuujui i B i );
skup ulaznih slova (podskup skupa , u optem sluaju \ {B}, tj. sigurno {B} , ali
moda i neki drugi element iz takoe ne pripada );
funkcija prelaza (obavlja pokrete, a odluka o pokretu se donosi na osnovu stanja upravljakog
bloka i simbola iznad kojeg se trenutno nalazi upisno-itajua glava, tj.
: ( ) ( \ {B}) {L, R});
Konfiguracija Tjuringove maine je ureena trojka (q, , i) i ona odreuje njeno ukupno stanje.
q trenutno stanje upravljakog bloka (tekue stanje)
aktuelna re na beskonanoj traci
i poloaj upisno-itajue glave, tj. njeno rastojanje od poetka aktuelne rei (redni broj slova iznad
kojeg se glava nalazi).
Funkcija prelaza
Funkcija prelaza se zadaje kao skup pseudonaredbi oblika qa q ' a ' P . Ova pseudonaredba
odgovara notaciji (q, a) ( q ', a ', ) .
q, q ' K
a
a ' ( \ {})
{L, R}
6
Drugi nain za njihovo zadavanje (ne iskljuuje prvi) je u vidu funkcionalne sheme. To je tablica ije
vrste odgovaraju stanjima iz skupa K, kolone slovima spoljanjeg alfabeta , a elementi vrednostima
funkcije prelaza (ureene trojke ( q ', a ', ) ).
Primer
= {S1, S2, S3} ulazni alfabet Funkcionalna shema ove Tjuringove maine je:
konfiguracija pseudonaredba
(S1, 11100, 1) S11 > S21R
(S2, 11100, 2) S21 > S20R
(S2, 10100, 3) S21 > S20R
(S2, 10000, 4) S20 > S21R
(S2, 10010, 5) S20 > S21R
(S2, 10011, 6) S2B > S3R
S obzirom na to da je S3 zavrno stanje, rad se zaustavlja. Rezultat je 10011, to je efektivno isto kao
10011, jer je prazno slovo.
7
Normalni algoritmi Markova
Markovljevi normalni algoritmi tretiraju algoritme sa stanovita izvravanja. Njihov osnovni problem
je kako prikazati alfabetski operator G na neki standardan nain.
Operator obrade se, u optem sluaju, predstavlja kao smena nad tekuom rei.
Na poetku algoritma pojavljuje se poetna vrednost tekue rei na kojoj se izvrava strogo definisana
sekvenca smena na sledei nain:
U tekuoj rei locira se prva sleva pojava podrei i zatim se ona zameni sa . Ako podrei
nema, nita se nee dogoditi.
Ako smena ima vie, mora se voditi rauna o redosledu njihovog izvravanja. Tako intuitivno
podrazumevamo strogo ureen niz smena koje se primenjuju u tekuoj rei, jer razliiti nizovi smena
mogu da vode ka razliitim rezultatima.
Kod normalnih algoritama postoje zavrne smene, po ijem se izvoenju smatra da je procedura
zavrena. Njih oznaavamo tako to stavimo taku iza strelice. .
Definicija
Neka je i smena, a X re. Normalne algoritme Markova definiemo koristei sledee metaformule:
K(i) je isto predikat, a pokazuje ako je i zavrna smena, tj. ako nije.
8
Opti oblik Markovljevih normalnih algoritama
Opti oblik (blok dijagram) Markovljevih normalnih algoritama prikazan je sledeom shemom:
poetak
ulaz:
X
DA NE
P(1, X) X := 1(X) K(1)
NE DA
1
DA NE
P(2,X) X := 2(X) K(2)
NE DA
1
DA NE
P(i, X) X := i(X) K(i)
NE DA
1
1
izlaz:
X
kraj
9
Fundamentalne osobine algoritama
10
Strukturirano programiranje
Strukturirano programiranje predstavlja metodologiju za razvoj softvera (skup postupaka, koji prate
razvoj softvera).
Pod strukturiranim programiranjem podrazumeva se skup tehnika za razvoj softvera, koje koriste
strogo definisane upravljake strukture i strukture podataka.
Osnovno sredstvo za analizu algoritma jeste graf toka programa (GTP). To je digraf (orjentisani
graf), koji pokazuje redosled izvravanja operacija u programu. Graf toka programa moemo definisati
i kao blok dijagram algoritma redukovan na najosnovnije elemente.
P
2. predikat ima jedan ulaz i dva izlaza;
Pravilni programi
Klasa programa koja se razmatra kao ciljna klasa zove se pravilni program. Graf pravilnog programa
zadovoljava tri uslova:
1. ima tano jednu ulaznu granu
3. kroz svaki vor prolazi najmanje jedan put od ulazne do izlazne grane.
Prva dva uslova nalau da ceo pravilni program moemo zameniti tano jednim vorom, a trei uslov
eliminie mogunost beskonanih ciklusa i izolovanih (nedostupnih) delova programa.
11
Primer
Pravilni potprogram
Pravilni potprogram je sastavni deo nekog programa, koji je takoe pravilan. Dobija se kad
iskljuimo ulazne i izlazne grane. Na datom primeru grafa toka programa zaokruen je jedan podgraf
koji je takoe i pravilan program.
Potprograme uvodimo zbog naina uoavanja dekompozicije programa na prostije delove.
Dekompoziciju vrimo dokle god je mogue potovati pravilnost potprograma. Dakle, pronalazimo
potprograme koji ne mogu da se dekomponuju na pravilne potprograme. Takvi potprogrami su prosti
potprogrami.
Prost program je pravilan program iji svaki pravilan potprogram ima tano jedan vor. Dakle, prost
program moe da sadri druge pravilne programe, ali to su samo procesi i nita vie.
Odavde vidimo da prosti programi predstavljaju neke od osnovnih naredbi jednog programskog jezika.
Analiza algoritama
Analiza algoritama direktno se bavi problemom koji iskazi treba da postoje u nekom programskom
jeziku. Izgraena je oko dva centralna pojma: pojma pravilnog programa i pojma prostog programa.
Ekvivalentni programi
Kao i dva algoritma, isto i dva programa mogu biti funkcionalno ekvivalentni (za isti ulaz generiu
isti izlaz) i ekvivalentni po izvravanju (imaju isti graf toka, tj. ulazne podatke obrauju na isti nain
do izlaznih).
Baza strukturiranih programa
Baza strukturiranih programa je skup prostih programa ijom se superpozicijom (kombinovanjem)
moe realizovati svaki pravilan program. Ona po definiciji nije minimalna, tj. ona moe da sadri i
viak prostih programa.
12
Strukturirani program je program sastavljen od prostih programa iz zadate baze. Dakle sledi da je
strukturiran program pravilan program, ali to ne znai da u njemu po definiciji nema skokova.
Pojam strukturiranog progama je relativan, jer se definie u odnosu na zadatu bazu. Tako je jedan
program u odnosu na jednu bazu strukturiran, ali ne mora biti strukturiran u odnosu i na neku drugu
bazu.
Kao kandidati za sastavljanje baze razmatraju se programi sa jednim, dva, tri i etiri vora, ali naravno
ne svi koji zadovoljavaju ovaj kriterijum (npr. oni koji nemaju funkcionalne vorove nisu od interesa
za bazu, jer ne rade nita).
Ovakvih programa ima sedam:
1. f funkcionalni vor
2. f g sekvenca
3. f
T
IF-THEN
P
4. f
T WHILE-DO
P
5.
T REPEAT-UNTIL
f P
6. T f
P IF-THEN-ELSE
g
7. g T
DO-WHILE-DO
f P
Izdvaja se jedna posebna baza strukturiranih programa. Nju ine sekvenca, iteracija tipa while-do i
selekcija tipa if-then-else. Pomou ove baze moe se izvesti svaki program i na osnovu nje pravimo
druge baze koje su nam potrebne.
Godine 1966. C. Boehm i G. Jacopini izveli su strukturnu teoremu koja pokazuje da se svaki pravilan
program moe ostvariti superpozicijom ove tri strukture, tj. da se moe ostvariti bez upotrebe skokova,
to je bilo kljuno za reavanje problema koji su traili uvoenje strukturiranih programa.
Za dokaz teoreme uzeemo jedan pravilan program prikazan sledeim grafom toka programa:
Na cilj je da definiemo program funkcionalno ekvivalentan ovom
0 koji se moe sastaviti upotrebom samo pomenute tri strukture.
Uoiemo redosled izvravanja vorova sa GTP i pokazaemo da se
1
moe obezbediti mehanizam za odreivanje sledeeg vora koji e
A
biti izvren, a da taj mehanizam sadri samo tri date strukture.
2 3 Da bismo to postigli, prvo emo na GTP proizvoljnim simbolima
T obeleiti vorove (na primeru, uzeti su celi nenegativni brojevi).
P B
Okolinu (ono to se na grafu nalazi pre ulaza i posle izlaza) isto
0 obeleavamo proizvoljnim simbolom (uzeta je 0). Kolektore ne
oznaavamo, jer su to pomoni simboli GTP. Oznaavanjem
vorova se u stvari omoguava da svaka ta oznaka bude argument pomenutog mehanizma iji je
rezultat takoe oznaka vora.
Zatim, definiemo matricu prelaza koja ini osnovu za odreivanje koji e se vor sledei izvriti. To
je kvadratna matrica koja ima onoliko vrsta i kolona koliko ima oznaka vorova ukljuujui i oznaku
okoline. Realizujemo je kao logiku matricu, tako to je popunjavamo po vrstama. Za svaki vor u
nekoj vrsti upisujemo i . upisujemo u onoj koloni koja odgovara voru koji neposredno sledi
voru iz date vrste. Zbog toga u svakoj vrsti postoji samo jedno .
Poto dva vora mogu da slede neki predikat (ili jedan ili drugi, ne oba) u odgovarajue kolone
neemo staviti oznake i , ve stavljamo P i P , od kojih opet samo jedna moe biti tana i ona
nam pokazuje koji se vor sledei izvrava.
Matrica prelaza za gornji graf toka programa izgleda ovako:
0 1 2 3
2 P P
14
Sada, definiemo funkciju next, koja preslikava skup oznaka vorova na samog sebe:
function next(n: integer): integer;
begin
j := 0;
while not L[n, j] do j := j + 1;
next := j;
end;
Sad moemo napraviti prelaznu strukturu koja vodi krajnjoj strukturi. Koristiemo jo jednu teoremu,
to je teorema o kanonikoj formi. Ona kae:
Za svaki pravilan program postoji ekvivalentan program koji se sastoji od jedne iteracije while-do
unutar koje se nalazi struktura case sa onoliko paralelnih grana koliko ima procesa i predikata u
grafu toka programa.
Dakle, kanonika forma za na primer je:
begin
n := 1; {oznaka prvog vora koji se izvrava}
while n <> 0 do {0 je oznaka okoline}
case n of
1: begin {obraditi n}; n := next(n) end;
2: begin {obraditi n}; n := next(n) end;
...
k: begin {obraditi n}; n := next(n) end;
end
end;
q : p; r : not p;
if P then A else B while q do begin A, q : not q end;
while r do begin B, r : not r end;
q = p; r p;
while (q) { A, q q ; }
while (r) { B, r r ; }
15
Uzroci nestrukturiranosti programa
Strukturiran program je relativan pojam, jer se odnosi na bazu. Ukoliko ne postoji referenca na neku
bazu, pojam strukturiranog programa odnosi se na programe koji su pisani bez upotrebe skokova ili
uopte koji se odnose na bazu izgraenu od sekvence, iteracije tipa while-do i selekcije tipa if-then-
else.
Postoji pet uzroka za nestrukturiranost programa, tj. postoji pet struktura takvih da ako se neka od njih
pojavi kao podgraf GTP onda je program nestrukturiran i mora se koristiti goto.
To su sledee strukture:
16
iteracija sa vie ulaza
17
paralelne iteracije (ovo je inae i nepravilan program)
T T
Strukturiranje programa
Strukturiranje programa bavi se problemom eliminisanja skokova. Oni ostaju kao opcija jedino za
eventualno iskakanje iz nekog ciklusa. Skokove eliminiemo transformacijom programa, koji ih
koristi, u funkcionalno ekvivalentni, koji ih nema.
Postoje dva naina za ovu transformaciju: moemo napisati program iz poetka izbegavajui skokove
ili koristiti neku od metoda za transformaciju. Ovaj drugi metod je vie korien. Najpoznatija metoda
je metoda Aschroft-Manna i bazira se na dokazu strukturnih teorema.
Metoda Aschroft-Manna
Primer
18
Evo kako izgleda algoritam tog programa:
n1
T
n=1
A
n2
T T
n=2 P n1
n3
T
n=3
B
n4
T T
n=4 Q n2
n0
n=0
T
19
Pisanje programa bez upotrebe skokova
Ovo ostvarujemo hijerarhijskom (ili sukcesivnom) dekompozicijom programa. Najee se koristi top-
down razvoj programa, koji predstavlja vrlo prirodan nain za pisanje programa i uopte reavanje
kompleksnih problema. Program razbijamo na jednostavnija reenja koja se sukcesivno izvravaju.
Primer
odrediti odrediti
A-1 x = A-1b
20
Strukture podataka
Pojam podatka
Najosnovniji pojam u raunarstvu uopte jeste pojam podatka. U memoriji raunara ne nalazi se nita
osim podataka (Van Neumann-ova koncepcija). Tu se misli na podatke u uem smislu rei (vrednosti
nekih promenljivih) i uputstva kako se ti podaci obrauju (programi). Pre konstruisanja ENIAC-a,
program je bio realizovan mehaniki.
Jedinice posmatranja zovemo entiteti. Entitet predstavlja stvar, subjekt, pojam ili dogaaj. Svaki
podatak vezuje se za neki entitet, pa podatak definiemo kao ureenu etvorku: (naziv entiteta, naziv
osobine, vrednost osobine, vreme). Na primer (Petar, teina u kg, 70, decembar 2002.).
Da bismo mogli manipulisati podacima, oni moraju biti ureeni. Podatke moemo definisati kao
skupove. Na primer, treba proveriti da li je data ulazna vrednost 10 elemenat skupa S = {-5, 10, 11, 12,
25}. Znai, treba kreirati odgovarajui algoritam koji e porediti datu vrednost sa elementima skupa,
tj. sa njegovim prvim, drugim itd. elementom. Postavlja se pitanje kako odrediti redosled elemenata,
ako znamo da je skup neureena struktura. Dakle, mora postojati bar jedno ureenje podataka. Ako
skup S snabdemo ureenjem, to vie nee biti skup. Ureen skup zove se struktura.
Bez strukture podataka nema programa.
Prvi programski jezici (Fortran, BASIC, Cobol) su bili prilino siromani strukturama podataka.
Strukture podataka i tipovi podataka su vrlo bliski pojmovi.
U Pascalu, Wirth je izjednaio po znaaju algoritamski i deklarativni deo (u kojem su date strukture
podataka). On je pokazao da je struktura podataka potpuno ravnopravna u odnosu na algoritam i da je
to stabilniji deo programa.
A1 A2 Ai An
21
Znaaj struktura podataka
Znaaj struktura podataka ilustrovaemo na primeru. Tu se jasno vidi koliki je uticaj struktura
podataka na algoritam.
Treba napisati Pascal program za manipulaciju sa matricama. Program treba da omogui pristup
elementima matrice, obradu tih elemenata, brisanje, dodavanje novih itd.
Postavlja se pitanje koju strukturu podataka e koristiti na program. Uzeemo da je matrica
definisana kao izvedeni pascalski tip array:
var A: array[1..m, 1..n] of <tip>;
Postavlja se pitanje, kako manipulisati matricom ako su m i n veliki brojevi. Npr, ako su m i n 1000,
naa matrica ima milion elemenata, to trai prilino velik memorijski prostor za smetanje tih
elemenata. Takoe, pristup i obrada elemenata moe trajati prilino dugo. Dakle, uiniemo znatno
ozbiljniji zahvat i razmotriemo druge naine za realizaciju strukture podataka.
U inenjeriji je vrlo est sluaj da u matricama sa velikim brojem elemenata, vrednost najveeg broja
tih elemenata je nula. Takve matrice se zovu retke matrice. Zato onda ne bismo obratili panju samo
na one elemente ija je vrednost razliita od nule?
Prvo, memorisaemo samo one ija je vrednost razliita od nule. Time smo matricu pretvorili u niz
slogova (p je mnogo manje od m i n.):
var B: array[1..p] of record
vrednost: T;
vrsta, kolona: integer
end;
Ovim smo smanjili trokove memorije i vreme obrade, ali sada pristup elementima A vie nije
jednostavan. Pristup elementu A[i,j] moemo reiti na primer na sledei nain:
k := 1; nadjen := false;
while (k <= p) and (not nadjen) do
if (B[k].vrsta = i) and (B[k].kolona = j) then
nadjen := true
else k := k + 1;
if nadjen then x := B[k].vrednost else x := 0;
22
Definicija strukture podataka
Postoji mnogo definicija strukture podataka, od onih intuitivnih do sloenih, strogo matematikih
definicija (npr. ureen skup podataka).
Elemente jedne strukture podataka ine:
Ureeni par (p, ) jeste skalar, gde je p podatak, a relacija. Poto je p izolovan podatak, ova relacija
jeste prazna relacija.
Relacije kojima su meusobno povezani elementi strukture mogu biti sasvim jednostavne ili pak vrlo
sloene. Na primer, niz je ureen relacijom susedstva definisanom izmeu dva elementa na sledei
nain {(xi, xi+1) | i = 1, 2, ..., n 1 }. Sloena relacija je na primer relacija predmet-nastavnik, gde jedan
predmet moe da predaje vie razliitih nastavnika, a sa druge strane svaki nastavnik moe da predaje
vie razliitih predmeta.
U daljem razmatranju posmatraemo relaciju elemenata nekog niza. Uzeemo da je ova relacija
netranzitivna. Definisaemo neposredno susedstvo kao (xi, xi+1) ili posredno kada je xi prethodnik xi+1 i
xi+1 je sledbenik xi.
Grafovi
Za grafiko prikazivanje struktura podataka koriste se grafovi. Graf je skup
snabdeven jednom binarnom relacijom, tj. ureeni par (S, r). Sastoji se od
a1 a2
vorova (elementi skupa S). Relacije meu tim vorovima se prikazuju tako
to ih povezujemo granama koje ne moraju biti orjentisane. Orjentisan graf
zove se digraf (directed graph).
a3 a4
Digrafi su modeli jedne velike klase struktura podataka. Ne svih, jer se ne
mogu sve strukture prikazati na ovaj nain. U matematici, vorove grafa
oznaavamo kruiima, dok je kod struktura podataka uobiajeno da se za
oznake koriste pravougaonici. Za svaki vor na digrafu definie se ulazni Digraf
stepen vora, a to je broj grana koje ulaze u vor, i izlazni stepen vora, tj.
broj grana koje izlaze iz njega.
X1 X2 X3 ... Xn-1 Xn
Graf niza
23
Operacije nad strukturama podataka
Definicije ovih operacija nisu obuhvaene definicijom strukture podataka, jer ih intuitivno
pridruujemo toj definiciji. Razlog zbog ega podatke stavljamo u strukturu (strukturiramo ih,
ureujemo) je da bismo nad njima vrili neke operacije.
Postoje tri grupe operacija:
24
c. dodavanje se izvodi slino kao uklanjanje, jedina razlika je to se novi element
umee u strukturu, a veze se auriraju kako bi se i novi element naao rasporeen
na pravo mesto.
Sve tri osnovne operacije mogu biti definisane sa odreenim ogranienjima, a uklanjanje i
dodavanje uopte ne moraju biti definisane za neku strukturu.
Kod sekvencijalne realizacije neke strukture, zauzima se kompaktan memorijski prostor u koji se
smetaju elementi strukture.
Spregnuta realizacija neke strukture podataka izvodi se tako to se sprega izmeu elementa te strukture
i mesta njihovog smetanja u memoriji ostvaruje pokazivaima. Dakle elementi jedne strukture se
mogu smestiti na razliitim lokacijama u memoriji.
Jasno je da je kod sekvencijalne realizacije neke strukture maksimalni broj elemenata te strukture
ogranien, dok kod spregnute ista struktura teoretski moe imati neogranien broj elemenata. (U
stvarnosti nas ograniava samo koliina raspoloive memorije.) Sa druge strane, osnovne operacije se
obavljaju mnogo bre na strukturama koje su realizovane sekvencijalno, nego na onim realizovanim
spregnuto.
Svaka struktura podataka snabdevena je jednom dopunskom strukturom, koja sadri podatke o toj
osnovnoj strukturi i naziva se deskriptor. Deskriptore najee kreira kompajler, a ako oni ne postoje
u programskom jeziku, kreira ih sm programer.
25
Klasifikacija struktura podataka
Nije isto kako logiki definiemo neku strukturu i kako je posle realizujemo u memoriji raunara. Za
jednu logiku strukturu moe da postoji vie naina njene fizike realizacije.
Primer
Uzeemo primer strukture matrice. Njena logika struktura sastoji se od vrsta i kolona. Sa druge
strane, memorija raunara je po svojoj prirodi jednodimenzionalna (linijska) struktura. Zbog toga
moramo smisliti odreeni nain kako da dvodimenzionalnu strukturu transformiemo u
jednodimenzionalnu i kasnije tu jednodimenzionalnu opet u dvodimenzionalnu. U Fortranu, na primer,
to je bilo reeno tako to se matrica razdvajala na vrste i onda su one upisivane sekvencijalno jedna iza
druge u memoriju.
a b c d
e f g h a b c d e f g h i j k l
i j k l
1. linearne strukture imaju digraf, koji zadovoljava dva uslova: svi vorovi osim tano
jednog imaju ulazni stepen jedan i svi osim tano jednog imaju izlazni stepen jedan.
Drugaije reeno, svaki element osim jednog ima tano jednog prethodnika i svaki element
osim jednog ima tano jednog sledbenika. Ovaj odnos prethodnik-sledbenik je
fundamentalan za linearne strukture podataka.
Posebna varijanta linearnih struktura su tzv. cirkularne strukture, gde svi vorovi imaju ulazni
stepen jedan i izlazni stepen jedan.
2. strukture tipa stabla njihov digraf zove se stablo. U stablu postoji tano jedan vor s
ulaznim stepenom nula. U sve ostale vorove ulazi tano jedna grana. Takoe, ovaj digraf
je slabo povezan, to znai da su svaka dva vora povezana nekim putem bez obzira na
orjentaciju grana. Bitna karakteristika je da svaki element strukture osim jednog (korena)
ima tano jednog prethodnika, a svaki (osim listova) ima jednog ili vie sledbenika. Dakle,
prethodnik jeste funkcija, dok sledbenik nije.
27
Statike strukture podataka
Nizovi
Nizovi su jedinstvene linearne strukture. Oznaavamo ih kao ureen par A = (S(A), r(A)),
gde je S(A) skup, a r(A) binarna relacija definisana nad tim skupom.
Uklanjanje i dodavanje nisu definisani, dok je pristup dozvoljen svakom elementu niza. Pristup
elementima je fleksibilan i brz, jer je pozicija elementa unapred poznata. Mogue su sve tri vrste
pristupa. Pristup prema poziciji je najznaajniji i ostvaruje se prema indeksu pozicije.
Kod nizova postoji podgrupa koja se naziva multi-indeksna (vieindeksna) struktura i nju
definiemo rekurzivno na sledei nain:
Fizika realizacija
Niz se u programskim jezicima realizuje sekvencijalno.
Deskriptor niza moe da sadri indikator tipa strukture, naziv tog niza i tip elementa, a mora da sadri
adresu poetka niza, opseg niza i veliinu jednog elementa niza u osnovnoj adresnoj jedinici.
X: array[-5..4] of char;
V X
adr(X[-5])
x[-5] x[-4] ... x[3] x[4]
-5 4
Realizacija niza u memoriji char 1
Deskriptor niza
28
Neka je niz B definisan na sledei nain:
B: array[p..k] of T; (p je najmanja, a k najvea vrednost indeksa niza)
Adresa elementa kojem pristupamo u optem sluaju odreuje se tako to se sabere adresa poetka
niza sa proizvodom rastojanja tekueg elementa od poetka niza i veliine jednog elementa.
adr(B[i])=adr(B[p])+adr(i-p)*l(T).
Pristup elementima multi-indeksne strukture moe se ubrzati ako je adresa unapred poznata. Za to se
koriste dve metode, metoda linearizacije i metoda Iliffe-ovih vektora.
Metoda linearizacije svodi se na seenje matrice na vrste ili kolone. Ovaj metod predvia da se
primeni jedna formula, koja nam odmah daje adresu elementa.
Metodu Iliffe-ovih vektora koristimo ako elimo veliku brzinu obrade, a pri tom to to ova struktura
trai neto vie memorije ne predstavlja problem. Ovu strukturu programer mora sam da realizuje, jer
nije sastavni deo nijednog programskog jezika.
X: array[2..3, -1..1, -2..-1] of T;
Iliffe-ovi vektori se retko programiraju na Pascalu, ve na nekom drugom programskom jeziku tipa
Assemblera. To se radi, na primer, na C-u koji ima brzinu priblinu brzini Assemblera. C nudi i tu
prednost to se za donji indeks niza podrazumeva 0, a ne 1 kao kod Pascala.
Kao i nizovi, Iliffe-ovi vektori najee imaju dve dimenzije, a retko kad vie od tri. Jedina razlika u
odnosu na strukturu niza je u tome to Iliffe-ovi vektori ne sadre adrese, ve samo vrednosti
elemenata.
Za svaki nivo indeks se odvaja jedan Iliffe-ov vektor koji se svaki stvara na bazi raspona indeks.
Ako nivo indeks ne obuhvata nulu, stvaraju se pseudoelementi u kojima ne postoji nita. Za svaki
sledei nivo indeksa formiramo skup Iliffe-ovih vektora. Za poslednji nivo, ovaj se skup opet
dopunjava do nule.
29
deskriptor 0
1 a2 = a1 + 3l(T)
a1 2
3 x[3, 1, -2]
-1 -1 a3 = a2 + 1l(T)
0 0
1 1
2 2 2 2 2 2 3 3 3 3 3 3
x[2, -1, -2] -1 -1 0 0 1 1 -1 -1 0 0 1 1
-2 -1 -2 -1 -2 -1 -2 -1 -2 -1 -2 -1
Slogovi
- podseaju na nizove, svaki skalar moemo shvatiti kao slog sa jednim elementom.
- vrlo retko se pojavljuju izolovani, najee su elementi neke druge sloenije strukture.
o semantika konvergencija element sloga sam za sebe nema semantiku. Postoji takva
meuzavisnost elemenata sloga, da oni samo zajedno imaju znaenje. Zbog te
meuzavisnosti, elemente sloga drugaije zovemo polja.
o pitanje relacije relaciju meu elementima sloga treba definisati tako da slog oslikava realni
model. Na primer, ako relaciju definiemo kao binarnu, a uzmemo da slog opisuje
taku u Dekartovom koordinatnom sistemu dolazi do neslaganja sa modelom. Ime
take je u relaciji sa apscisom, ali ne i sa ordinatom (ili obrnuto).
Slog R je ureeni par (S(R), r(R)), gde je S(R) skup polj, a r(R) relacija koja se sastoji od jedne
ureene n-torke u koju ulaze svi elementi iz S(R).
r( R) {( x1, ..., xn )}, n S ( R) (xi , x j S ( R)) i j xi x j
.
Dodavanje i uklanjanje elemenata nisu definisani, dok je pristup omoguen svakom elementu.
U optem sluaju, polja sloga su razliitog tipa.
Pristup poljima je definisan kao pristup po poziciji, dok druga dva pristupa nema. U skupu pozicija ne
postoji ureenje. Pristup prema poziciji obavlja se putem oznake pozicije. Ostvarujemo ga bijektivnim
preslikavanjem naziva polja nekog sloga na poziciju.
30
Fizika realizacija
Mogue su obe fizike realizacije. Sekvencijalna realizacija je osnovna. Jedina fizika realizacija,
podrana direktno od programskog jezika jeste sekvencijalna. Tipian primer izolovanog spregnuto
realizovanog sloga jeste deskriptor.
Sekvencijalna
Za sekvencijalnu realizaciju vezuje se problem razliitih vrsta polja u jednom slogu, pa na primer
polja mogu da imaju razliite duine. Dakle, svako polje se opisuje na razliit nain, pa se zato svako
opisuje posebno. Zbog ovoga je deskriptor sloga znatno sloeniji od deskriptora bilo koje druge
strukture podataka. Programski jezici po pravilu direktno podravaju strukturu sloga, tako da
programer najee ne dolazi u dodir sa deskriptorom.
Tipian deskriptor sadri podatke na nivou celog sloga. Na primer, moe da sadri indikator tipa
strukture (koji pokazuje da se radi o slogu), naziv sloga, adresu poetka memorijskog prostora
rezervisanog za skladitenje sloga, moe da sadri ukupnu duinu sloga, ali mora da sadri broj polja u
slogu.
A0 A0 + 30 A0 + 40 A0 + 42 A0 + 44
prezime ime indeks god_upisa god_studija
R STUDENT 5 A0
Informacije o svakom polju memoriu se posebno i to: indikator tipa
polja, duina u osnovnim adresabilnim jedinicama, naziv i adresa S 30 prezime 0
S 10 ime 30
polja. Adresa se moe dati relativno (u odnosu na poetak I 2 indeks 40
memorijskog prostora odvojenog za slog) ili apsolutno. Ako je tip I 2 god_upisa 42
nekog od polja slog, onda se ceo deskriptor tog sloga smeta u opis I 2 god_studija 44
datog polja. Ovo vai za svako polje.
Spregnuta
Kod spregnute realizacije, u opisu polja ne stoje adrese tih polja u memoriji, ve pokazivai na
dinamiku memoriju.
Kad se u programu trai pristup polju, prevodilac za dato ime polja pregleda deskriptor, trai opis
odgovarajueg polja, i tu proita njegovu adresu. Ako je ona data apsolutno, vraa njenu vrednost ili
rauna poetnu adresu polja, ako je adresa data relativno.
Primena
Primena sloga je kranje iroka i teko je izdvojiti neku za koju se moe rei da preovladava. Slogovi
su najee upotrebljavana struktura podataka. Pojavljuju se na svim nivoima obrade podataka, od
operativnih sistema do baza podataka. ak se i datoteka izvodi iz koncepta sloga.
31
Tabele
Struktura tabele predstavlja niz iji su elementi slogovi. Ova struktura ima posebne primene, jer
objedinjuje slogove.
Zavisno od tipa niza, tabela moe biti statika ili dinamika.
Tipine obrade su sortiranje i traenje na osnovu zadatog kljua (dakle pristup je po informacionom
sadraju). Traenje moe biti od prvog na dalje ili neka specifina vrsta traenja.
32
Poludinamike strukture podataka
Stek
Stek je linearna struktura, tj. ureeni par L = (S(L), r(L)), gde je r(L) binarna relacija
definisana nad skupom S(L).
x , x i 1, 2, n 1 n 2
S L x1, x2 , ..., xn r L i 1 i
n2
Digraf steka:
Xn Xn-1 ... X1
Definisane su sve tri osnovne operacije i vre se iskljuivo na vrhu (poslednje upisanom elementu).
Osnovne operacije:
- Top pristup
- Pop uklanjanje
- Push dodavanje
Sloene operacije:
- operacija pranjenja steka uklanjanje svih elemenata, dok Empty ne pokae true.
- funkcija za odreivanje broja elemenata
33
Fizika realizacija
Fizika realizacija obavlja se na oba standardna naina, i sekvencijalno i spregnuto.
Sekvencijalna
Osnovni nain realizacije je sekvencijalni, jer je bri to se i najvie oekuje od steka. Ovaj nain
uvodi ogranienje maksimalnog broja elemenata na steku. Podrazumeva se deskriptor koji se ne vidi.
Deskriptor sadri identifikator tipa strukture, naziv steka, najveu i najmanju adresu adresnog
prostora steka, adresu elementa na vrhu steka.
ST L
Amin vrh Amax
Amax Amin
vrh
Realizacija steka u memoriji opis elemenata
Deskriptor steka
Stek se protee od minimalne adrese do aktuelnog vrha.
Naini izvravanja operacija:
- Top proverava se da li je stek prazan (vrh<Amin) i ako nije, pomou primitivne funkcije
Prvi(L) pristupi se elementu na vrhu i on se oita. ( Empty(L), Prvi(L) )
- Pop proverava se da li je stek prazan i ako nije, vrh se umanji za veliinu jednog elementa
steka
- Push vrh se povea za veliinu jednog elementa steka, a zatim se upie sadraj novog
elementa
Spregnuta
Spregnuta fizika realizacija koristi se samo ako je neophodno da se izbegne overflow stanje. Ovakva
realizacija steka zove se fizika lista. Deskriptor mora da sadri adresu vrha, a elementi su
pokazivaima spregnuti po listi. Sve tri osnovne operacije su sporije.
S1
Primena S2
S3
Stek se primenjuje gde god se pojavljuje neka vrsta rekurzije. Na primer
kod prevoenja izraza na mainski jezik, izrazi se prvo prevode iz
infiksne (a+b) u postfiksnu (ab+) ili prefiksnu (+ab) notaciju (najee
u postfiksnu, jer je taj zapis izraza najsliiniji onom na mainskom
jeziku). Kod poslednje dve, za naznaavanje redosleda izvravanja
operacija, nisu potrebne zagrade. Standardni algoritam za prevoenje S3
izraza iz jedne u drugu notaciju ne moe da funkcionie bez steka. S2
S1
34 stek
Prilikom rekurzije, potprogramu se mora proslediti tzv. adresa povratka (na koju se upisuje rezultat
tog potprograma). Bez obzira koliko se duboko zalazi u rekurziju, da bi se vratili na prethodni nivo
uvek se koristi poslednja upisana adresa koja se potom ukloni. Zbog toga se koristi stek.
Dakle, druga veoma vana primena steka jeste razmena podataka meu programima i potprogramima.
Skup podataka, koji sadri stvarne parametre, i adresa povratka smetaju se na stek, odakle ih ita
potprogram. On rezultate obrade upisuje na stek, a povratni parametar na datu adresu.
potprogram A'
A A
A' P A' param.
kd
program param. program potprogram
A'
stek
Red
- drugi naziv red ekanja ili FIFO red (First In First Out)
- vrlo vana struktura podataka, formalno veoma lii na stek, ali je primena potpuno drugaija.
Red je linearna struktura, tj. ureeni par F = (S(F), r(F)) gde je S(F) skup, a r(F) binarna
linearna relacija definisana nad tim skupom.
x , x i 1, 2,, n 1 n 2
S F x1 , x2 , ..., xn r F i i 1
n2
Digraf reda:
Xn Xn-1 ... X1
Fizika realizacija
Fizika realizacija obavlja se na oba standardna naina, i sekvencijalno i spregnuto.
Sekvencijalna
Osnovni nain realizacije je sekvencijalni, jer je bri to se i najvie oekuje od reda. Ovakvom
realizacijom izdvaja se kompaktan memorijski prostor, koji e sluiti za smetanje elemenata reda.
Deskriptor sadri identifikator tipa strukture, naziv reda, najveu i najmanju adresu adresnog prostora
reda, adrese elemenata na poetku i na kraju reda.
Uzeemo za primer red sa prethodne slike koji sadri jedan element x. Posle izvravanja operacije
umetanja Push(F,a) red sadri dva elementa, i novi element a se nalazi levo od elementa x.
Izvriemo Pop(F) ime smo uklonili element x. Izvriemo Push(F,b), pa Pop(F) i ako bismo sad
hteli da izvrimo Push(F,c) poto se nalazimo na poslednjoj raspoloivoj adresi element c ne moe da
se upie u red. Ispada da je red popunjen, a oigledno da sadri samo jedan element.
b
36
Zbog toga pribegavamo reenju da novi element upiemo na poetak reda. To obezbeuje mehanizam
za neometano pomeranje reda, koji se naziva cirkularna realizacija reda. Red moe da krui po
memorijskom prostoru, bez opasnosti da dodje do lane prepunjenosti. Na ovaj nain smo reili
problem lane prepunjenosti, ali pojavio se novi problem.
Za njegovo ilustrovanje, definisaemo funkciju Prethodni(x,F) na sledei nain:
x l (F) x A min
Prethodni ( x, F)
A max x A min
Ponimo da sukcesivno uklanjamo elemente iz reda sve dok ne bude Prvi(F) = Poslednji(x,F). Sada
red sadri jedan element i ako jo jednom izvrimo Pop(F) red e postati prazan. Sada je
Prethodni(Poslednji(F),F) = Prvi(F).
Ukoliko uradimo suprotno, tj. u red upisujemo nove elemente jedan za drugim dok ga ne popunimo,
opet emo dobiti da je Prethodni(Poslednji(F),F) = Prvi(F), ali u ovom sluaju to znai da je red pun.
Dakle, sada postoji nemogunost razlikovanja potpuno praznog od potpuno punog reda. Postoji
nekoliko naina da se rei ovaj problem.
1. U deskriptoru emo u svakom momentu memorisati aktuelni broj elemenata. Ovaj nain
usporava operacije, jer je posle svakog upisa ili brisanja elementa potrebno pristupiti
deskriptoru i aurirati broj elemenata. Dodue ova operacija nam omoguava da nam je u
svakom momentu na raspolaganju informacija o aktuelnoj duini reda.
2. U deskriptor se smeta statusno polje S koje moe da ima dve vrednosti, 0 i 1. Ako je S = 0 red
je prazan, u suprotnom red nije prazan. Tako statusno polje i funkcija Prethodni(x,F) zajedno
daju informaciju o tome da li je red prazan ili ne. Ovaj nain takoe usporava obradu reda, jer
se polje S mora aurirati posle svakog upisa ili brisanja.
3. Ovaj nain predvia da se upis onemogui na jednu memorijsku lokaciju koja se uvek nalazi
iza lokacije Poslednji(F). Ako se ta lokacija zove Prazna, onda je Prethodni(Poslednji(F),F) =
Prazna. Ukoliko sada elimo da ispraznimo niz, elemente briemo dokle god se
Prethodni(Poslednji(F),F) ne poklopi sa lokacijom Prvi(F). U red moemo dodavati elemente
sve dok Prethodni(Prazna,F) nije Prvi(F), tj. Prethodni(Prethodni(Poslednji(F),F),F) nije prvi.
Ovo znai da je red pun.
Spregnuta
Kod spregnute realizacije ne postoji problem prepunjenosti reda. Red se spregnuto realizuje u
deskriptoru, a elementi su meusobno povezani pokazivaima. Sve tri osnovne operacije su sporije.
Primena
Primena redova vrlo je iroka. Prilikom prenosa poruka na daljinu veoma je bitno da one stiu istim
redom kojim su poslate. Na raunaru redovi postoje kod ulaznih ureaja (npr. bafer tastature i mia),
red ekanja za tampa. Jo neki primeri su alteri sa redovima ekanja i benzinske pumpe sa
redovima automobila.
37
Dek
Digraf deka:
...
Definisane su sve tri operacije i to na oba kraja, pa su krajevi ravnopravni. Oznaavamo ih kao levi i
desni kraj.
Fizika realizacija
Moe se realizovati i sekvencijalno i spregnuto.
Sekvencijalna
Kod sekvencijalne realizacije nastaju problem lane prepunjenosti deka, kao i nemogunost
razlikovanja potpuno praznog od potpuno punog deka. Dek cirkulie u oba smera.
Spregnuta
Osnovna realizacija deka je spregnuta realizacija, jer tada krajevi nisu ravnopravni, ve se kretanje
vri u jednom smeru. Kod spregnute realizacije nastaje problem uklanjanja krajnjeg elementa. Dok je
levi lako ukloniti, da bismo uklonili desni moramo proi kroz celu strukturu kako bismo doli do
njega.
Logika struktura deka je strogo simetrina, dok fizika nije. Kretanje se vri pomou dva pokazivaa,
a u sprezi su dva susedna elementa.
Sekvenca
- linijska struktura
Sekvenca je linearna struktura, tj. ureeni par D = (S(D), r(D)), gde je S(D) skup, a r(D)
binarna relacija.
Definisane su sve tri osnovne operacije. Pristup je dozvoljen svakom elementu, a uklanjaju se samo
svi elementi od jednom ili svi elementi poev od zadate pozicije. Dodavanje se uvek vri iza
poslednjeg elementa.
Definisane su sve tri vrste pristupa, ali najvie se koristi navigacija. Sekvenca uvek ima definisan
tekui element.
38
Dinamike strukture podataka
Jednostruko spregnuta lista je ureeni par P = (S(P), r(P)), gde je r(P) binarna relacija
definisana na skupu S(P).
...
Element bez (neposrednog) prethodnika nazivamo prvi, a element bez (neposrednog) sledbenika,
poslednji u listi.
39
Ako postoji sistem navigacije, kod uklanjanja i dodavanja treba voditi rauna o tekuem elementu.
Jednostruko spregnuta lista mora se projektovati, tj. moramo imati u vidu za ega e se koristiti. Ako
napravimo jednu listu za vie namena, lista e biti sporija.
Fizika realizacija
Iskljuivo je spregnuta.
Primena
Upotrebljavaju se u najrazliitijim oblastima raunarskih nauka, od operativnih sistema do aplikativnih
programa. Mnogi redovi ekanja sa prioritetima (koriste se u operativnim sistemima) imaju strukturu
liste.
Dinamiki niz
Fizika realizacija
Iskljuivo je sekvencijalna. Moe doi do prepunjenosti.
Posle svakog uklanjanja i dodavanja moramo aurirati pozicije elemenata (iza ukonjenog ili dodatog
elementa), kako bismo imali pristup po poziciji kao i kod statikog niza. Zbog toga su ove dve
operacije relativno spore.
Primena
Najvanija primena vezana je za mehanizme rukovanja tekstom u programskim jezicima. Tip
podataka string ima osobine dinamikog niza.
40
Dvostruko spregnute liste
Dvostruko spregnuta lista je ureeni par: DP = (S(DP), r(DP)), gde r nije linearna relacija,
r r1 r2 , r1 r2 i a, b r 1 b, a r2 . Vidimo da su (S, r1) i (S, r2) jednostruko
spregnute liste.
...
Fizika realizacija
Iskljuivo je spregnuta, pa se svaki element proiruje sa dva pokazivaa.
Treba voditi rauna da dvostruka lista (tj. lista sa dve relacije) nije isto to i dvostruko spregnuta lista.
Poto se relacija uspostavlja na bazi nekog kriterijuma, kod ovih drugih, jedna relacija je taj kriterijum,
a druga suprotan kriterijum. Kod dvostruke liste, jedan i drugi kriterijum ne moraju imati nikakve
veze.
Viestruko spregnuta lista je ureena n+1-orka VP = (S(VP), r1, r2, ..., rn) gde je svaki ureeni
par (S, ri) jednostruko spregnuta lista i Si S(VP).
Svaki element ima onoliko pokazivaa, kojeg je reda lista. Unapred se zadaje koliki je red.
Logika struktura viestruko spregnute liste:
Primena
Koriste se kada treba vriti pretraivanje prema nekom kriterijumu.
41
Stabla
- drvo
- vana struktura podataka.
- modelira vie fundamentalnih odnosa iz realnog sveta (hijerarhijski odnosi, odnos opte-pojedinano,
postupak dekompozicije itd.).
Osnovna osobina stabla je da ono nije linearno. Stablo kao digraf zadovoljava sledee osobine:
u svaki vor osim jednog ulazi po jedna grana (svaki ima tano jednog prethodnika) i
Element u stablu ulaznog stepena nula zove se koren stabla. vorovi digrafa iz kojih ne izlazi nijedna
grana zovu se listovi. Put u stablu je ureena n-torka (x1, x2, ..., xn), gde su xi vorovi. Duina puta
jednaka je broju grana (n-1). Visina stabla odgovara broju vorova na najduem putu (n). Dakle,
visina stabla je duina najdueg puta uveana za jedan. U stablu postoji tano jedan put od korena do
bilo kog vora, tj. koren je povezan sa svim vorovima tano jednim putem. Najdui put u stablu uvek
poinje od korena i zavrava se u listu. Nivo vora jeste udaljenje vora od korena. Za stabla se ne
koriste termini prethodnik i sledbenik, ve nadreeni i podreeni. Red stabla odgovara najveem
broju podreenih u stablu. Podstablo ini vor sa svim svojim
podreenim vorovima.
1
Za ovo stablo koren je element 1, a listovi su elementi 3, 4, 5, 6 i 7. Jedan
2 3 4 od puteva ine elementi 1, 2 i 5, duina ovog puta je 2 i ovo je jedan od
najduih puteva. Visina stabla je 3. Nivo korena je 0, nivo elemenata 2, 3
5 6 7 i 4 je 1, a nivo elemenata 5, 6 i 7 je 3. Red ovog stabla je 3.
Postoje dva specijalna stabla, to su puno i kompletno stablo. Kompletno stablo reda n je takvo da svi
vorovi stabla (osim listova) imaju izlazni stepen n. Kod punog stabla su svi putevi od korena do
nekog lista iste duine. Ove dve osobine niti ukljuuju niti iskljuuju jedna drugu, tj. nisu ni u kakvoj
korelaciji. Najbolje je da je stablo tako konstruisano da je to blie punom i kompletnom stablu. Tada
je operacija pristupa najbra.
Stablo koje pokazuje dobre osobine (tj. priblino je puno i kompletno) zove se balansirano stablo. Za
bilo koja dva vora istog nivoa balansiranog stabla vai da se broj elemenata u njihovim podstablima
razlikuje najvie za jedan element. Postoje algoritmi za balansiranje stabla i oni zavise od konkretnog
stabla. Primenom ovih algoritama ubrzavamo pristup elementima stabla.
Teorijski, pristup stablu mogu je na sva tri naina. Meutim, pristup po poziciji je specifian i redak,
jer stablo nije linearna struktura. Zbog toga se koristi pristup po informacionom sadraju ili
navigacija.
Najee se elementima stabla pristupa po informacionom sadraju i ovaj se pristup obavlja po kljuu.
Poinje se od korena i na bazi argumenta traenja (kljua) i informacionog sadraja elementa odluuje
se kojem se sledeem elementu pristupa. Sutinski problem koji se ovde javlja je taj da podreeni
elementi istog nivoa ine skup koji nije ureen i ne moemo odrediti prvi, drugi itd. element. Dakle,
ne moe se formirati algoritam koji bi proverio da li se u tom skupu nalazi dati klju.
Zbog toga u strukturi podataka mora postojati ureenje skupa podreenih nekog elementa. Ovo
ureenje moe biti eksplicitno i tada je definisano na nivou logike strukture podataka i moe biti
implicitno kada se definie na nivou fizike realizacije. Na osnovu ove osobine stabala, vri se njihova
osnovna podela. Eksplicitno ureenje imaju tzv. n-arna stabla, a implicitno tzv. generalisana
(uoptena) stabla. Jedina zajednika osobina za ove dve vrste je ve pomenuti digraf tipa stabla.
n-arna stabla
n-arna stabla reda n su ona gde svaki element ima tano nula ili n podreenih. U svakom trenutku,
postoji n mesta rezervisanih za smetanje podreenih elemenata nekog elementa, ali ta mesta ne
moraju biti uvek popunjena (mogu biti nezauzeta). Zbog toga skup podreenih nivoa n ima osobine
statikog niza.
X X X
A B B A A B C
Prva dva stabla su binarana i razlikuju se po rasporedu elemenata, a tree je ternarno, ali pozicija C
nije zauzeta
Ureenje postoji da bi se mogao formirati algoritam prolaska kroz stablo. Kod definisanja reda stabla
mora se rei koliko je n.
43
Iz ovih definicionih osobina sledi definicija n-arnog stabla.
n-arno stablo je ureena n+1-orka Tn = (S(Tn), r1, r2, ..., rn) sledeih karakteristika: (S(Tn), r1
r2 ... rn) ima osobine digrafa stabla i [(a,b) ri (a,c) ri] (b = c), i = 1, 2, ..., n.
Iz prve osobine vidimo da grane koje vode iz istog nadreenog u podreene su rasporeene u n
relacija.
Druga osobina n-arnih stabala govori da razliiti podreeni ne mogu biti u istoj relaciji sa jednim
nadreenim, tj. sve relacije n-arnog stabla su funkcije. Tako je samim zadavanjem relacije za svaki
element odreen njegov podreeni.
Pristup je u svakom trenutku dozvoljen svakom elementu. Nema pristupa prema poziciji. Najvanija
vrsta pristupa je prema informacionom sadraju. Dodavanje i uklanjanje mogu uvek da se izvre, s tim
to kada se dodaje, mora se voditi rauna da je broj podreenih manji od n. Slino vai i kod
uklanjanja.
Meu n-arnim izdvajaju se binarna stabla.
Binarna stabla
Binarna stabla su posebna vrsta n-arnih, to su n-arna stabla reda dva. Broj pristupa je log2 n . Za ova
stabla postoji jedna vrlo karakteristina izvedena operacija. To je obilazak binarnog stabla.
A
B C
D E F
G H I
Za obilazak, u principu, postoji est algoritama od kojih su po dva dualna. Svaka od ovih metoda jeste
rekurzivna i svaka se rekurzija bazira na tri stavke:
1. pristup datom elementu;
44
Poto je redosled stavki proizvoljan, dobijamo est algoritama.
Obilazak sleva udesno izvodi se tako to se prvo pristupa levom podstablu (2), zatim elementu (1), pa
desnom podstablu (3). Proces uvek poinje od korena. Dakle, pristupa se korenu, ali se ovaj element
ne obrauje, ve se memorie u neku strukturu L (za nae stablo, memorie se A). Zatim se prelazi u
levo podstablo i opet se izvravaju koraci 2, 1 i 3. (Sada se memorie B, a u sledeem koraku D). Kada
smo stigli do elementa koji nema levo podstablo (G), obraujemo ga. Zatim obraujemo element koji
je poslednji memorisan u strukturi L (to je D za na primer). Obraujemo desno podstablo tog
elementa. (Posle ovog koraka potpuno je obraeno podstablo D.) Nastavimo li ovim algoritmom,
potpuno emo obraditi celo stablo. Dakle, redosled obrade je sledei: GDHBAECIF.
Oigledno je da je pomenuta struktura L LIFO red, tj. stek. Njega moemo kreirati sami (sporiji
nain) ili se ono kreira implicitno, zbog rekurzija.
Obilazak sa vrha ka dnu pretpostavlja da je redosled obrade: element, levo podstablo, desno
podstablo. Za na primer, elemente obraujemo sledeim redosledom: ABDGHCEFI.
Obilazak sa dna ka vrhu se vri na sledei nain: levo podstablo, desno podstablo, element. Na
primeru, redosled je: GHDBEIFCA.
Fizika struktura
Poto je logika struktura stabla data na bazi fizike, fizika struktura stabla je odreena definicijom.
Zbog nelinearnosti, n-arna stabla realizujemo iskljuivo spregnuto. Svi elementi imaju isti oblik i
svaki od njih proirujemo sa tano n pokazivaa. Deskriptor stabla, izmeu ostalog, mora sadrati
adresu korena. Za realizacuju binarnog stabla koristi se specijalna tehnika proivki (niti).
B C
D E F
G H I
45
Kod jednostrukih niti bira se jedan od pokazivaa pridruenih elementu (npr. desni). Ako taj
pokaziva ima vrednost (pokazuje na neki podreeni element), ostavlja se kakav jeste. Ako je njegova
vrednost NULL (ne pokazuje ni na ta, na slici oznaeno *) onda se koristi za obilazak i u njega se
upie adresa sledeeg kojem treba pristupiti. Dakle, prilikom obilaska prate se pokazivai i proivke.
A
B * C
D * E * F *
* G * * H * * I *
46
Binarno stablo pristupa
Binarno stablo pristupa obezbeuje brz pristup prema informacionom sadraju (svi elementi imaju
klju).
Definiciona karakteristika je da za svaki element vai:
U njegovom levom podstablu su elementi sa kljuem manjim od njegovog, a u desnom su oni sa
kljuem veim od njegovog.
Dodavanje se vri na mestu lista i novododati element je uvek list (postaje list). Ako element ve
postoji u stablu, dodavanje se ili zabranjuje ili se izvri neki alternativni postupak. Element 24 bi bio
dodat u levo podstablo broja 25.
Uklanjanje je mogue za svaki element, ali ne sme doi do prevezivanja grana. Ako bismo uklonili
element 19, moemo ga samo iskljuiti, jer ne moemo prevezati 17 i 25 na 13. Za uklanjanje postoje
dve metode:
1. logiko brisanje svaki element se snabdeva binarnim statusnim poljem vai - ne vai. Broj
elemenata ne moe da opada bez dodatnih mehanizama funkcije, koja ponovo formira stablo
3) element koji se uklanja ima oba podreena pronae se element koji treba da se ukloni, u
prvoj fazi pree se u njegovo levo podstablo, a onda se prate desni pokazivai sve dok je to
mogue i sadraj elementa koji sigurno nema desni pokaziva, njegov sadraj se prepie u
onaj koji treba da se ukloni, a on se izbacuje iz strukture (dualno, kada se pree u njegovo
desno podstablo).
47
Uoptena (generalisana) stabla
Fizika realizacija
Svaka veza iz logike strukture direktno modeluje pokazivaima. Format elementa bi bio promenjiv,
to predstavlja problem. Reenje je da se ogranii broj pokazivaa. Unutar jednog elementa, svaki
element realizujemo sekvencijalno. Do overflow-a moe da doe na nivou svakog elementa (ako smo
stavili mali broj pokazivaa. Prirodna realizacija obezbeuje bre realizacije nego binarna, ali to nije
dovoljan razlog da se u praksi opredelimo za nju.
2. Binarna realizacija
Binarna realizacija po cenu neto sporijih operacija eliminie problem prekoraenja. Jednostruko
spregnuta lista reava taj problem (skup podreenih se organizuje u listu). Svaki element ima dva
pokazivaa. Osnovna ideja binarne realizacije je obezbediti pristup listi polazei od nadreenog.
Nadreeni se proiri jednim pokazivaem na listu svojih podreenih i drugim, koji pokazuje na listu
podreenih kojoj taj element pripada. U ovom sluaju pristup je neto sporiji, jer se svaki put mora
proi kroz celu listu podreenih.
48
Testiranje programa
Testiranje programa je jedna od najvanijih i najskupljih aktivnosti u toku ivotnog ciklusa programa.
Netestirani program nije zavren.
Pod testiranjem programa podrazumevaju se dve meusobno nezavisne delatnosti:
1. provera usklaenosti implementacije (realizacije) programa sa njegovom specifikacijom
2. provera ponaanja programa u eksplatacionim uslovima
Greka (error) predstavlja aktivnost unoenja koda koji je pogrean. Rezultat greke je defekt (fault)
pogrean kod. Izvravanje pogrenog koda vodi ka otkazu (failure). Otkaz moe, a ne mora da se
manifestuje. Manifesetacija otkaza zove se incident. Sve ovo zajedno zove se greka (bug).
Program se pokree odreenim skupom ulaznih podataka, koji nazivamo testna stavka (test case).
Prilikom testiranja od svih moguih testnih stavki biramo jedan skup kojim proveravamo program i
njega nazivamo test skup (test set).
Destruktivno testiranje
Kod analize programskih segmenata program delimo prema nekom kriterijumu na logiki zaokruene
celine. Obavlja se timski, po sesijama. Tim ine 4 osobe: moderator (priprema i vodi sesije), autor
programa i dva iskusna programera (vre testiranje). Testiranje sopstvenog programa treba izbegavati.
Kod metode simulacije izvravanja programa, proveravaju se trase izvravanja programa. Obavlja se
timski, a tim ine 3 do 5 lanova: moderator, sekretar (vodi evidenciju), izvoa testa i jo eventualno
dva iskusna programera. Jedan lan tima je i autor programa.
Primer
if ( (A>1) && (B==0) ) X=X/A;
50
Blok dijagram algoritma:
Test skup:
1. A=2 B=0 X proizvoljno
51
Testiranje metodom graninih vrednosti
Kod testa graninih vrednosti (1. i 2.) svrha je da se umanji test skup. Za svaku ulaznu promenljivu
izdvajaju se 5 karakteristinih vrednosti:
1) ymin najmanja vrednost
2) ymin+ vrednost koja je vea od ymin, ali joj je bliska sa dozvoljene strane
3) ynom nominalna vrednost (ima ulogu neutralne vrednosti)
4) ymax vrednost koja je manja od ymax, ali joj je bliska sa dozvoljene strane
5) ymax najvea vrednost
Totalni test graninih vrednosti podrazumeva da se svakoj od ulaznih promenljivih dodeli ovih 5
vrednosti. Ukupan broj testnih stavki za svaku promenljivu iznosi 5 n, gde je n broj promenljivih. Ako
je ovo preveliko predvien je parcijalni test graninih vrednosti. On podrazumeva da se uoi jedna
promenljiva, koja dobija svih 5 vrednosti, dok preostale n-1 imaju nominalnu vrednost. Ovo se ponovi
za svaku promenljivu. Svaka od promenljivih kad proe kroz ovih 5 vrednosti generisae 5 stavki.
Ukupan broj testnih stavki je 5n(n1)=4n+1 (izbacujemo sluajeve kada su sve vrednosti nominalne,
tj. n1 sluaj, dok jedan ostaje).
Test robustnosti (3. i 4.) slian je testu graninih vrednosti, s tim to podrazumeva i dva invalidna
ulazna podatka (u blizini granice, ali sa nedozvoljene strane).
1) ymin-
2) ymin
3) ymin+
4) ynom
5) ymax-
6) ymax
7) ymax+
Totalni test robustnosti ima 7n testnih stavki, dok parcijalni test robustnosti ima 6n+1 testnu stavku.
52
Primer
Na ulazu se zadaju tri vrednosti (a,b,c), koje su celobrojne i u rasponu od 1 do 100. Proveriti da li one
ine trougao i kakav.
1 a, b, c 100 Postoji 4 mogua izlaza: jednakostranini, jednakokraki, raznostrani, nije trougao.
redni broj t.s. a b c rezultat
1 1 50 50 jednakokraki
2 2 50 50 jednakokraki
3 50 50 50 jednakostranini
4 99 50 50 jednakokraki
5 100 50 50 nije trougao
6 50 1 50 jednakokraki
7 50 2 50 jednakokraki
8 50 99 50 jednakokraki
9 50 100 50 nije trougao
10 50 50 1 jednakokraki
11 50 50 2 jednakokraki
12 50 50 99 jednakokraki
13 50 50 100 nije trougao
Metoda klasa ekvivalencije je monija, ali i komplikovanija za primenu, tj. nedostatak je to klase
ekvivalencije mogu da se formiraju na mnogo naina (ne postoji jedinstven algoritam za ovaj
postupak).
Neka je V skup ulaznih promenljivih, a X(V) skup njihovih moguih vrednosti. X(V) se deli na klase i
bira se po jedan predstavnik, tj. ureena n-torka promenljivih.
53
Primer
V={p, q, r, z, i, j}
X(V) generie sve mogue vrednosti ovih 6 promenljivih.
Neka p, q i r generiu tri klase ekvivalencije: X1,X2 i X3, z generie etiri: Y1,Y2,Y3 i Y4, a i i j dve: Z1
i Z2. U odnosu na ureenu trojku (p,q,r) program se moe ponaati trojako, u odnosu na z na etiri
naina i u odnosu na par (i,j) na dva naina. Iz svake klase izdvojimo po jednog predstavnika i
program pokreemo sa svih 6 vrednosti.
U parcijalnom testu posmatramo promenljivu koja ima najvie vrednosti. Broj testnih stavki jednak je
najveem broju predstavnika.
redni
br. y x z
1 y1 x1 z1
2 y2 x2 z2
3 y3 x3 z1
4 y4 x1 z2
Totalni test metodom klasa ekvivalencije podrazumeva korienje Dekartovog proizvoda predstavnika
klasa, tako da bi se test skup sastojao od stavki iz skupa {x1, x2 , x3} { y1, y2 , y3 , y4} {z1, z2} .
Primer
Na ulazu se zadaju tri vrednosti (a,b,c), koje su celobrojne i u rasponu od 1 do 100. Proveriti da li one
ine trougao i kakav. 1 a, b, c 100 Postoji 4 mogua izlaza.
I kriterijum:
U ovoj varijanti kreemo od rezultata (pokrijemo sve izlaze). Kriterijum za formiranje ovog test skupa
je rezultat. Broj kriterijuma nije ogranien, jedino treba voditi rauna da ti kriterijumi budu nezavisni.
redni br. a b c rezultat
1 9 2 3 nije trougao
2 20 20 20 jednakostranini
3 70 50 50 jednakokraki
4 6 7 8 raznostrani
54
II kriterijum:
Obavlja se analizom ulaza i izlaza, odnosno definiemo relacije koje se mogu uspostaviti izmeu
komponenata trojke (a,b,c), a imajui u vidu mogue izlaze.
F1 {( a, b, c ) | a b c}
F2 {(a, b, c ) | a b c}
F3 {( a, b, c ) | a b c}
F4 {(a, b, c ) | a c b}
F5 {( a, b, c ) | a b c}
Program koji je modularno izveden, mora se i modularno testirati. Naravno, ako je svaki od modula
ispravan, to ne znai da e biti i ceo sistem. Posebno se mora testirati razmena podataka meu
modulima, koja je izuzetno podlona grekama.
Program se nikada ne testira kao celina, jer je postupak izuzetno komplikovan. Takoe, ako neka od
destruktivnih metoda ustanovi greku, nju je prilino teko locirati.
Osnovi problem kod testiranja sloenih programskih sistema je redosled testiranja pojedinih modula.
Pri tom, za testiranje svakog modula, potrebno je imati na raspolaganju:
1. modul (module) iz kojih se poziva testirani modul
2. modul (module) koje testirani modul poziva
Da bismo testirali modul A, moramo imati testirane module P, D i E. Za testiranje P potrebni su nam
testirani A, B i C. Iz ovoga izgleda da program treba testirati kao celinu, to naravno ne treba raditi.
Reenje je pisanje pseudomodula (zamena za module), koji oponaaju rad stvarnih modula. Na
primer, pseudomodul P za testiranje modula A (PA) razlikuje se od pseudomodula P za testiranje
modula B (PB). PA ima maskirane pozive za B i C, a PB za A i C.
55
Pseudomoduli moraju biti jednostavni (kako bi se izbegle eventualne greke u pseudomodulu) i
moraju verno oponaati rad odgovarajuih modula u delu koji je relevantan za testiranje.
Prednosti metode testiranja s vrha ka dnu su u tome to se u ranim fazama raspolae skeletom
programa, to moe da poslui u demonstracione svrhe i to to se tokom testiranja sve vreme ima uvid
u globalno ponaanje programa. Glavni nedostatak je to je izrada zamena za nadreene (zbog
postojanja maskiranih poziva drugih modula) tea od izrade zamena za podreene.
56
Za testiranje sistema sa slike, testiranje s dna ka vrhu izgledalo bi na sledei nain:
Prednost ovog naina testiranja je u tome to je interakcija izmeu modula i njegovog nadreenog
pseudomodula relativno jednostavna, naroito zato to je broj nadreenih obino 1. Nedostatak metode
lei u injenici da se programski sistem kao celina pojavljuje tek na kraju testiranja.
57