You are on page 1of 30

SEMINARSKI RAD

ALGORITMI I STRUKTURE PODATAKA

Apstraktni tipovi podataka

Profesor: Prof. dr Zoran Avramović Student: Bojan Trkulja, 124-19-R-ITP-S

SADRŽAJ

Banja Luka, septembar 2020.


2

UVOD............................................................................................................................3

1. APSTRAKTNI TIPOVI PODATAKA......................................................................4

1.1. Povezane liste......................................................................................................5

1.1.1. Jednostruko povezane liste...........................................................................7

1.1.2. Dvostruko povezane liste.............................................................................8

1.1.3. Višestruko povezane liste.............................................................................8

1.1.4. Istorija..........................................................................................................9

1.1.5. Operacije na listama...................................................................................10

1.2. Stek....................................................................................................................11

1.2.1. Stek u glavnoj memoriji.............................................................................14

1.2.2. Stek u registrima ili namjenskoj memoriji.................................................14

1.2.3. Sigurnost....................................................................................................15

1.3. Red....................................................................................................................16

1.3.1. Implementacija...........................................................................................17

1.3.2. Redovi i programski jezici.........................................................................18

1.3.3. Prioritetni redovi........................................................................................19

1.4. Stablo.................................................................................................................20

1.4.1. Obilazak stabla...........................................................................................21

1.4.2. Binarno stablo............................................................................................22

1.5. Hash tablice (heš tablice)..................................................................................24

1.6. Grafovi..............................................................................................................25

2. PREDNOSTI APSTRAKTNIH TIPOVA PODATAKA........................................27

2.1. Najčešće operacije.............................................................................................28

ZAKLJUČAK..............................................................................................................29

LITERATURA.............................................................................................................30

2
2

UVOD

U informatici apstraktni tip podataka je matematički model za tipove podataka.


Apstraktni tip podataka je definisan njegovim ponašanjem sa stanovišta korisnika podataka
posebno u smislu mogućih vrijednosti, mogućih operacija na podacima ove vrste i ponašanja
tih operacija. Ovaj matematički model je u suprotnosti sa strukturama podataka, koje su
konkretna reprezentacija podataka. Takođe on se koristi od strane programera, a ne strane
krajnjeg korisnika.

Formalno apstraktni tipovi podataka se mogu definisati kao klasa objekata čije je
logičko ponasanje definisano kao skup vrijednsoti i skup operacija. Apstraktni tipovi
podataka su kao algebarska struktura u matematici. Ponašanje varira u zavisnosti od
konkretne implementacije. U praksi mnogi uobičajni tipovi podataka nisu apstraktni tipovi,
jer apstrakcija nije savršena i korisnici moraju biti svjesni problema poput aritmetičkog
prelijevanja koji nastaju zbog reprezentacije. Na primjer cijeli brojevi se često čuvaju kao
vrijednost fiksne širine (32-bitni ili 64-bitni binarni brojevi), i na taj način doživljavaju
cijelokupni preliv ako je premašena vrijednost.

Apstraktni tipovi podataka su teorijski koncept u računarskoj nauci koji se koristi u


dizajniranju i analizi algoritama, struktura podataka i softverskih sistema. Većina računarskih
jezika ne podržava formalno apstraktne tipove podataka, međutim razne jezičke
karakteristike odgovaraju određenim aspektima apstraktnih tipova podataka. Apstraktni
tipovi podataka mogu biti implementirani od strane određenih tipova podataka ili struktura
podataka, na više načina i na mnogim programskim jezicima. Apstrakne tipove podataka su
prvi predložili Barbara Liskov i Stephen N. Zilles kao dio razvoja CLU programskog jezika.

1. APSTRAKTNI TIPOVI PODATAKA

3
2

Prije svega, potrebno je razmotriti različit prikaz sistemski definisanih tipova


podataka. Svi znamo da prema zadanim postavkama svi primitivni tipovi podataka (int, float,
itd.) podržavaju osnovne operacije kao što su sabiranje i oduzimanje. Sistem pruža
implementacije za primitivne tipove podataka. Za korisnički definisane tipove podataka
takođe moramo definisati operacije. Implementacija ovih operacija može se izvršiti kada ih
stvarno želimo koristiti. To znači da su uopšteno korisnički definisani tipovi podataka
definisani zajedno s njihovim operacijama.

Da bismo pojednostavili postupak rješavanja problema, kombinujemo podatkovne


strukture s njihovim operacijama i to nazivamo ADT (Abstract Data Type). ADT se sastoji
od dijelova:

1. Izjava o podacima

2. Izjava o radu

Uobičajeni ADT-ovi: povezane liste, stekovi, redovi, prioritetni redovi, binarno


stablo, rječnici, disjontni skupovi (spajanje i pronalaženje), heš tablice, grafikoni i mnogi
drugi. Na primjer, stek koristi LIFO (Last-In-First-Out) mehanizam dok pohranjuje podatke u
strukture podataka. Posljednji element umetnut u stek prvi je element koji se briše.
Uobičajene operacije su: stvaranje steka, umetanje elementa u stek, izbacivanje elementa iz
steka, pronalaženje trenutnog vrha steka, pronalaženje broja elemenata u steku, itd.

Dok definišemo ADT, nema potrebe briniti o detaljima implementacije. Oni se


pojavljuju na slici samo kada ih želimo koristiti. Različite vrste ADT-a odgovaraju različitim
vrstama aplikacija, a neke su visoko specijalizovane za određene zadatke.

1.1. Povezane liste

4
2

U računarskoj nauci povezana lista je linearna zbirka elemenata podataka čiji


redoslijed nije zadan njihovim fizičkim smještajem u memoriji. Umjesto toga, svaki element
ukazuje na sljedeći. To je struktura podataka koja se sastoji od zbirke čvorova koji zajedno
predstavljaju niz. U svom najosnovnijem obliku, svaki čvor sadrži: podatke i referencu
(drugim riječima, vezu) na sljedeći čvor u nizu. Ova struktura omogućava učinkovito
umetanje ili uklanjanje elemenata iz bilo kojeg položaja u nizu tokom iteracije. Složenije
varijante dodaju dodatne veze, omogućujući efikasnije umetanje ili uklanjanje čvorova u
proizvoljnim pozicijama. Nedostatak povezanih lista je taj što je vrijeme pristupa linearno.
Brži pristup, poput slučajnog pristupa, nije izvediv. Nizovi imaju bolju lokaciju
predmemoriranja u odnosu na povezane liste.

Na slici 1 prikazna je povezana lista čiji čvorovi sadrže dva polja: cjelobrojna
vrijednost i veza do sljedećeg čvora. Zadnji čvor povezan je s terminatorom koji služi za
označavanje kraja popisa.

Slika 1. Povezana lista

Povezane liste spadaju u najjednostavnije i najčešće strukture podataka. Mogu se


koristiti za implementaciju nekoliko drugih uobičajenih apstraktnih tipova podataka,
uključujući liste, skupove, redove, asocijativne matrice i S-izraze, mada nije neuobičajeno da
se te strukture podataka izravno implementiraju bez korištenja povezane liste kao osnove.

Glavna prednost povezane liste u odnosu na konvencionalni niz je ta što se elementi


popisa mogu lako umetnuti ili ukloniti bez preusmjeravanja ili reorganizacije cijele strukture,
jer se stavke podataka ne moraju kontinuirano pohranjivati u memoriju ili na disk, dok
restruktuišete niz na vrijeme rada je puno skuplja operacija. Povezane liste dopuštaju
umetanje i uklanjanje čvorova u bilo kojoj tački popisa i dopuštaju to sa stalnim brojem
operacija držeći vezu prethodnom do dodavanja ili uklanjanja veze u memoriji tokom
prelaska liste.

5
2

S druge strane, budući da jednostavne povezane liste same po sebi ne omogućavaju


slučajni pristup podacima ili bilo koji oblik efikasnog indeksiranja, mnoge osnovne operacije
- poput dobijanja posljednjeg čvora liste, pronalaska čvora koji sadrži zadani datum ili
lociranje mjesta na kojem treba umetnuti novi čvor - može zahtijevati ponavljanje kroz
većinu ili sve elemente liste. Povezani popis je dinamičan, tako da se dužina popisa može
povećati ili smanjiti po potrebi. Svaki čvor ne mora nužno pratiti prethodni fizički u
memoriji.

Glavni nedostaci povezane liste su:

 Koriste više memorije nego nizova zbog memorije koju koriste njihovi
pokazivači.
 Čvorovi na povezanom popisu moraju se pročitati od početka, jer su povezane
liste inherentno sekvencijalni pristup.
 Čvorovi se pohranjuju bez prestanka, uveliko povećavajući vremenske periode
potrebne za pristup pojedinim elementima unutar liste, posebno sa CPU
predmemorijom.
 Poteškoće se pojavljuju na povezanim listama kada je u pitanju obrnuto
kretanje. Na primjer, pojedinačno povezani popisi su nezadovoljni za
pomicanje unazad, a dok su dvostruko povezani popisi nešto lakši za čitanje,
memorija se troši za dodjelu prostora za stražnji pokazivač.

6
2

1.1.1. Jednostruko povezane liste

Lista jednostruko povezanih čvorova sadrži čvorove koji imaju polje podataka kao i
polje 'next', što upućuje na sljedeći čvor u liniji čvorova. Operacije koje se mogu izvesti na
jednostruko povezanim listama uključuju umetanje, brisanje i prelaz.

Sljedeći kod (na narednoj strani) pokazuje kako dodati novi čvor s podacima na kraj
jednostruko povezane liste.

U komentarima koda detaljno je objašnjeno šta koji dio koda predstavlja.

7
2

1.1.2. Dvostruko povezane liste

Kod dvostruko povezanih lista, svaki čvor, osim veze sljedećeg čvora, sadrži i drugo
polje veze koje upućuje na prethodni čvor u nizu. Dvije veze mogu se nazvati "naprijed (" s) i
"nazad", ili "sljedeće" i "prev" ("prethodno"). Na slici 2. prikazana je dvostruko povezana
lista čiji čvorovi sadrže tri polja: cjelobrojna vrijednost, veza prema sljedećem čvoru i veza
nazad na prethodni čvor.

Slika 2.

Tehnika poznata kao XOR-povezivanje omogućava implementaciju dvostruko


povezane liste koristeći jedno polje veze u svakom čvoru. Međutim, ova tehnika zahtijeva
sposobnost izvođenja bitnih operacija na adresama, pa možda nije dostupna u nekim jezicima
visokog nivoa. Mnogi moderni operativni sistemi koriste dvostruko povezane liste za
održavanje referenci na aktivne procese, niti i druge dinamičke objekte. Uobičajena strategija
rootkita za izbjegavanje otkrivanja je prekidanje veze s ovih lista.

1.1.3. Višestruko povezane liste

Kod višestruko povezanih lista, svaki čvor sadrži dva ili više polja veza, a svako se
polje koristi za povezivanje istog skupa zapisa podataka različitim redoslijedom istog skupa
(npr. Po imenu, odjelu, datumu rođenja, itd.). Iako se dvostruko povezane liste mogu gledati
kao posebni slučajevi višestruko povezane liste, činjenica da su dva i više naloga međusobno
suprotna vodi u jednostavnije i efikasnije algoritme, pa se obično tretiraju kao zaseban slučaj.

8
2

1.1.4. Istorija

Povezane liste razvili su 1955–1956 Allen Newell, Cliff Shaw i Herbert A. Simon iz
RAND Corporation kao primarnu strukturu podataka za njihov jezik za obradu informacija.
IPL su autori iskoristili za razvoj nekoliko ranih programa umjetne inteligencije, uključujući
Logic Theory Machine, General Problem Solver i računalni program šaha. Izvještaji o
njihovom radu pojavili su se u IRE Transakcijama o teoriji informacija 1956. godine, te
nekoliko zbornika konferencija od 1957. do 1959. godine, uključujući Zbornik radova
Zapadne zajedničke računarske konferencije 1957. i 1958. te Obradu informacija (Zbornik
radova prve UNESCO-ove međunarodne konferencije o obradi informacija. ) 1959.

Sada klasični dijagram koji se sastoji od blokova koji predstavljaju čvorove liste sa
strelicama usmjerenim na uzastopne čvorove popisa pojavljuje se u "Programiranju teorije
logičke teorije" Newela i Shawa u Proc. WJCC, februar 1957. Newell i Simon su 1975.
godine nagrađeni nagradom ACM Turing za "doprinose u umjetnoj inteligenciji, psihologiji
ljudske spoznaje i obradi lista". Problem mašinskog prevođenja za obradu prirodnog jezika
natjerao je Victora Yngvea iz Massachusetts Institute of Technology (MIT) da koristi
povezane liste kao strukturu podataka u svom programskom jeziku COMIT za kompjuterska
istraživanja u području lingvistike. Izvještaj o ovom jeziku pod nazivom "Programski jezik za
mehaničko prevođenje" pojavio se u "Mechanical Translation" 1958. godine. LISP, koji važi
za procesor liste, kreirao je John McCarthy 1958. godine, dok je bio na MIT-u, a 1960.
objavio je njegov dizajn u radu u komunikacijama ACM-a, pod naslovom „Rekurzivne
funkcije simboličkih izraza i njihovo računanje pomoću stroja, ". Jedna od glavnih struktura
podataka LISP-a je povezana lista.

Do ranih šezdesetih godina prošlog vijeka dobro je uspostavljena upotreba povezanih


lista i jezika koji koriste ove strukture kao primarnu reprezentaciju podataka. Bert Green iz
laboratorija MIT Lincoln objavio je pregledni članak pod naslovom "Računarski jezici za
manipulaciju simbolima" u IRE Transakcije na ljudske faktore u elektronici 1961. godine koji
su saželi prednosti pristupa povezanom popisu. Kasniji pregledni članak, „Poređenje
računarskih jezika za obradu lista“ Bobrowa i Raphaela, pojavio se u komunikacijama ACM-

9
2

a u aprilu 1964. Nekoliko operativnih sistema koje su razvili tehnički konsultanti sistema
(izvorno West Lafayette Indiana, a kasnije i Chapel Hill, Severna Karolina) koristili su
pojedinačno povezane liste kao strukture datoteka.

Unos u imenik ukazao je na prvi sektor datoteke, a sljedeći dijelovi datoteke smješteni
su prelazeći pokazivače. Sistemi koji koriste ovu tehniku uključuju Flex (za Motorola 6800
CPU), mini-Flex (isti CPU) i Flex9 (za Motorola 6809 CPU). Varijanta koju je TSC razvio za
tržište Smoke Signal Broadcasting u Kaliforniji koristi dvostruko povezane liste na isti način.
TSS / 360 operativni sistem, razvijen od strane IBM-a za uređaje System 360/370, koristio je
dvostruko povezanu listu za svoj katalog datoteka. Struktura direktorija bila je slična Unix-u,
gdje direktorij može sadržavati datoteke i ostale direktorijume i proširiti se na bilo koju
dubinu.

1.1.5. Operacije na listama

Operacije na listama

Operacije koje je moguće izvršiti na listama su kako slijedi [Keogh, 2004]:

 FirstL(L) - procedura koja nam vraća prvi element liste, tj. element sa
indeksom 0. Ako je ona prazna vraća nam grešku
 EndL(L) - Služi za vraćanje pozicije iza zadnjeg elementa liste
 NextL(p,L) – Funkcija koja vraća sljedbenika unesenog elementa p. Ako je
p=EndL(L) javlja nam grešku.
 PreviousL(p,L) – Funkcija koja vraća prethodnika unesenog elementa p. Ako
je p=FirstL(L) javlja nam grešku
 LocateL(x,L) – Procedura koja vraća prvi element sa vrijednošću x. Ako on ne
postoji vraća se EndL(L).
 InsertL(x,p,L) – Dodaje novi element sa vrijednošću x na poziciju p. Svi
elementi koji su u listi na poziciji većim ili jednakim p se pomiču za jedno
mjesto dalje.
 DeleteL(p,L) – Briše se element na poziciji p iz liste. Svi elementi koji su se
nalazili iza tog elementa u listi se pomiču za jedno mjesto unaprijed.
 RetrieveL(p,L) – Funkcija koja vraća vrijednost elementa na poziciji p.

10
2

 DeleteAllL(L) - Briše sve elemente iz liste L


 InitL(L)- služi za iniciranje liste na praznu listu.

1.2. Stek

U računarskoj nauci, stek je apstraktni tip podataka koji služi kao zbirka elemenata, s
dvije glavne glavne operacije:

 push, koji dodaje element u kolekciju, i


 pop, koji uklanja posljednji dodani element koji još nije uklonjen.

Redoslijed kojim se elementi spuštaju iz niza daje alternativni naziv LIFO (zadnji
ulaz, prvi izlaz). Uz to, operacija zavirivanja može dati pristup vrhu bez modifikovanja.
Naziv "stek" za ovu vrstu strukture dolazi od analogije skupu fizičkih predmeta složenih
jedan na drugi. Ova struktura olakšava uklanjanje predmeta s vrha steka, dok će dolazak do
predmeta dubljeg sloga možda zahtijevati prvo uklanjanje više drugih predmeta. Smatra se
linearnom strukturom podataka, ili apstraktnije sekvencijalnom kolekcijom, push i pop
operacije se javljaju samo na jednom kraju strukture, naziva se vrhom steka. Ova struktura
podataka omogućuje implementaciju steka kao pojedinačno povezane liste i pokazivača na
gornji element. Sklop se može primijeniti tako da ima ograničeni kapacitet. Ako je stek pun i
ne sadrži dovoljno prostora da prihvati entitet koji treba gurnuti, onda se smatra da je stek u
preljevnom stanju. Skočna operacija uklanja stavku s vrha hrpe. Za provedbu pretraživanja
dubine prvo je potreban stek. Na slici 3 prikazan je jednostavan primjer vremena izvođenja
steka uz pomoć push i pop operacija.

11
Slika 3.
2

Tipični stek je područje računarske memorije fiksnog porijekla i promjenjive veličine.


U početku je veličina steka nula. Pokazivač na stek, obično u obliku hardverskog registra,
pokazuje na posljednju referenciranu lokaciju na steku; kada veličina steka ima nulu,
pokazivač steka pokazuje na ishodište steka.

Dvije operacije primjenjive na sve hrpe su:

 operacija push, u kojoj se stavka podataka postavlja na mjesto na koje pokazuje


pokazivač steka, a adresa u pokazivaču steka prilagođava se veličini stavke
podataka;
 operacija pop ili pull (povlačenje): stavka podataka na trenutnoj lokaciji na koju
pokazuje pokazivač steka uklanja se, a pokazivač steka prilagođava se veličini
stavke podataka.

Postoje mnoge varijacije osnovnog principa slaganja. Svaki stek ima fiksnu lokaciju,
u memoriji, na kojoj započinje. Kako se stavke podataka dodaju u stek, pokazivač steka se
pomiče kako bi ukazao na trenutni opseg steka koji se širi dalje od ishodišta.

Pokazivači na hrpu mogu ukazivati na ishodište niza ili na ograničeni raspon adresa
bilo iznad ili ispod ishodišta (ovisno o smjeru u kojem stek raste); međutim, pokazivač steka
ne može prijeći ishodište. Drugim riječima, ako je izvor steka na adresi 1000, a stek raste
prema dolje (prema adresama 999, 998 i tako dalje), pokazivač steka nikada se ne smije
povećavati preko 1000 (na 1001, 1002, itd.). Ako iskačuća operacija na steku uzrokuje
pomicanje pokazivača steka pored izvora steka, događa se prelivanje steka. Ako operacija
guranja uzrokuje da se pokazivač steka uvećava ili smanjuje iznad maksimalnog opsega,
dolazi do prelijevanja steka.

Neka okruženja koja se u velikoj mjeri oslanjaju na stekove mogu pružiti dodatne
operacije, na primjer:

Duplikat: gornja stavka iskače, a zatim ponovo (dva puta) gura, tako da je dodatna
kopija bivše gornje stavke sada na vrhu, a original ispod nje.

12
2

Pogled: najviša stavka se pregleda (ili vraća), ali pokazivač i veličina steka se ne
mijenjaju (što znači da stavka ostaje na stogu). To se u mnogim člancima naziva i vrhunskim
radom.

Zamjena: dva najviša predmeta na mjenjačkim mjestima.

Rotiranje (ili kotrljanje): n najviših predmeta pomiče se na hrpi na rotirajući način. Na


primjer, ako je n = 3, stavke 1, 2 i 3 na hrpi premještaju se u položaje 2, 3 i 1 na hrpi. Moguće
su mnoge varijante ove operacije, a najčešće se nazivaju lijevo i desno okretanje. Skupovi se
često vizualiziraju kako rastu odozdo prema gore (poput snopova u stvarnom svijetu). Oni se
takođe mogu vizualizirati kako rastu slijeva udesno, tako da "najviši" postaje "najdesniji" ili
čak raste od vrha do dna. Važna karakteristika je da je dno gomile u fiksnom položaju.
Ilustracija u ovom odjeljku je primjer vizualizacije rasta od vrha do dna: vrh (28) je stek
"dno", budući da je stek "vrh" mjesto na kojem se elementi potiskuju ili iskaču.

Desnim rotiranjem pomaknućete prvi element na treće mjesto, drugi na prvo, a treći
na drugo. Evo dvije ekvivalentne vizualizacije ovog procesa:

jabuka banana
banana ===desna rotacija==> krastavac
krastavac jabuka

krastavac jabuka
banana ===lijeva rotacija==> krastavac
jabuka banana

Stek je na računarima obično predstavljen blokom memorijskih ćelija, s "dnom" na


fiksnom mjestu, a pokazivač steka koji sadrži adresu trenutne "gornje" ćelije u steku. Gornja i
donja terminologija koriste se bez obzira na to raste li stek prema nižim memorijskim
adresama ili prema višim memorijskim adresama. Guranjem stavke u stek prilagođava se
pokazivač steka prema veličini stavke (ili se smanjuje ili povećava, ovisno o smjeru u kojem
stek raste u memoriji), usmjeravajući ga na sljedeću ćeliju i kopira novu gornju stavku u
područje steka. Ovisno o ponovnoj tačnoj implementaciji, na kraju operacije potiskivanja
pokazivač steka može ukazati na sljedeću neiskorištenu lokaciju u steku ili na najgornju

13
2

stavku u hrpi. Ako stek pokazuje na trenutnu najgornju stavku, pokazivač na stek biće
ažuriran prije nego što se nova stavka gurne na stek; ako pokazuje na sljedeće dostupno
mjesto u steku, biće ažurirano nakon što se nova stavka gurne na stek. Iskakanje hrpe
jednostavno je obrnuto od guranja. Uklanja se najviša stavka u hrpi i ažurira se pokazivač za
stek, obrnutim redoslijedom od onog koji se koristi u operaciji guranja.

1.2.1. Stek u glavnoj memoriji

Mnogi dizajni CPU-a tipa CISC, uključujući x86, Z80 i 6502, imaju namjenski
registar koji se koristi kao pokazivač steka snopa poziva s namjenskim uputama za poziv,
povratak, push i pop koji implicitno ažuriraju namjenski registar, povećavajući tako gustoću
koda. Neki CISC procesori, poput PDP-11 i 68000, također imaju posebne načine adresiranja
za implementaciju stekova, obično s poluodvojenim pokazivačem steka (kao što je A7 u
68000). Suprotno tome, većina RISC dizajna CPU-a nema namjenske upute za stek i zato se
većina, ako ne i svi registri, prema potrebi mogu koristiti kao pokazivači na stek.

1.2.2. Stek u registrima ili namjenskoj memoriji

Arhitektura x87 s pomičnom zarezom je primjer skupa registara organiziranih kao


stek gdje je takođe moguć direktan pristup pojedinačnim registrima (u odnosu na trenutni
vrh). Kao i kod strojeva zasnovanih na steku, imajući na vrhu steka kao implicitni argument
omogućava se mali otisak mašinskog koda uz dobro korištenje propusne širine sabirnice i
predmemorije koda, ali takođe sprečava neke vrste optimizacija mogućih na procesorima koji
dozvoljavaju slučajan pristup datoteci registra za sve (dva ili tri) operanda. Struktura steka
takođe čini superskalarne implementacije s preimenovanjem registra (za spekulativno
izvršenje) nešto složenijom za implementaciju, iako je to još uvijek izvedivo, kao što
pokazuju moderne x87 implementacije.

Sun SPARC, AMD Am29000 i Intel i960 su svi primjeri arhitektura koje koriste
prozore registra unutar registarskog steka kao drugu strategiju za izbjegavanje upotrebe spore
glavne memorije za argumente funkcija i povratne vrijednosti.

Postoji i niz malih mikroprocesora koji implementiraju stek direktno u hardver, a neki
mikrokontroleri imaju stek fiksne dubine kojem nije moguće direktno pristupiti. Primjeri su
14
2

PIC mikrokontroleri, Computer Cowboys MuP21, linija Harris RTX i Novix NC4016. Mnogi
mikroprocesori zasnovani na steku korišteni su za implementaciju programskog jezika Forth
na razini mikrokoda. Snopovi su takođe korišteni kao osnova za niz glavnih računara i mini
računara. Takve mašine nazivale su se strojevima za slaganje, a najpoznatiji je Burroughs
B5000.

1.2.3. Sigurnost

Neka računarska okruženja koriste stekove na načine koji ih mogu učiniti ranjivima
na sigurnosne provale i napade. Programeri koji rade u takvim okruženjima moraju voditi
posebnu brigu kako bi izbjegli zamke ovih implementacija.

Na primjer, neki programski jezici koriste zajednički stek za pohranu podataka


lokalno u pozvanu proceduru i informacije o povezivanju koje omogućavaju da se postupak
vrati pozivaocu. To znači da program premješta podatke u isti stek koji sadrži kritične
povratne adrese za pozive procedure i iz njega. Ako se podaci premjeste na pogrešno mjesto
u steku ili se prevelika stavka podataka premjesti na mjesto steka koje nije dovoljno veliko da
ih sadrži, povratne informacije za pozive procedura mogu biti oštećene, što može dovesti do
neuspjeha programa.

Zlonamjerne strane mogu pokušati srušiti napad koji koristi prednost ove vrste
implementacije pružanjem prevelikog unosa podataka programu koji ne provjerava dužinu
unosa. Takav program može kopirati podatke u cijelosti na mjesto u steku i na taj način može
promijeniti povratne adrese za procedure koje su ga pozvale. Napadač može eksperimentisati
kako bi pronašao određenu vrstu podataka koji se mogu pružiti takvom programu, tako da se
povratna adresa trenutne procedure resetuje tako da upućuje na područje unutar samog steka
(i unutar podataka koje pruža napadač), koja zauzvrat sadrži upute koje izvode neovlaštene
operacije.

Ova vrsta napada varijacija je napada prekoračenja međuspremnika i izuzetno je čest


izvor kršenja sigurnosti u softveru, uglavnom zato što neki od najpopularnijih kompajlera
koriste zajednički stek i za pozive podataka i za procedure, a ne provjeravaju dužinu stavke
podataka. Programeri često ne pišu kod da bi provjerili veličinu stavki podataka, a kada se
prevelika ili premala stavka podataka kopira u stek, može doći do narušavanja sigurnosti.

15
2

1.3. Red

U računarstvu, red je apstraktni tip podataka, kolekcija entiteta koji se održavaju u


sekvenci i mogu se modikovati dodavanjem entiteta na jednom kraju niza i uklanjanjem
entiteta s drugog kraja sekvence. Prema dogovoru, kraj niza na koji se dodaju elementi naziva
se stražnji, rep ili stražnji dio reda, a kraj na kojem se uklanjaju elementi naziva se glavom ili
prednjim dijelom reda, analogno riječima koje se koriste kada ljudi se postavljaju u red da
čekaju robu ili usluge.

Operacija dodavanja elementa na stražnju stranu reda poznata je kao enqueue, a


operacija uklanjanja elementa s prednje strane je dequeue. Mogu se dopustiti i druge
operacije, često uključujući zavirivanje ili prednju operaciju koja vraća vrijednost sljedećeg
elementa koji se dequeuira bez dequeuiranja.

Operacije reda čine ga podacima prvi u prvom (FIFO). U FIFO strukturi podataka,
prvi element dodan u red biće prvi koji će se ukloniti. To je ekvivalent zahtjevu da se nakon
dodavanja novog elementa svi elementi koji su dodani prije moraju ukloniti prije nego što se
novi element može ukloniti. Red je primjer linearne strukture podataka ili sažetiji
sekvencijalne kolekcije. Redovi su uobičajeni u računarskim programima, gdje se
implementiraju kao strukture podataka zajedno s pristupnim rutinama, kao apstraktna
struktura podataka ili u objektno orijentisanim jezicima kao klase. Uobičajene
implementacije su kružni međuspremnici i povezane liste.

Redovi pružaju usluge u računarskim naukama, transportu i operativnim


istraživanjima gdje se različiti entiteti kao što su podaci, predmeti, osobe ili događaji
pohranjuju i drže radi kasnije obrade. U tim kontekstima, red izvršava funkciju
međuspremnika. Još jedna upotreba redova je u provedbi pretraživanja po širini.

16
2

1.3.1. Implementacija

Teoretski, jedna karakteristika reda je da nema određeni kapacitet. Bez obzira na to


koliko je elemenata već sadržano, uvijek se može dodati novi element. Može biti i prazno, a
tada će uklanjanje elementa biti nemoguće dok se novi element ponovo ne doda.

Nizovi fiksne dužine ograničeni su kapacitetom, ali nije istina da stavke treba kopirati
prema glavi reda. Jednostavan trik pretvaranja niza u zatvoreni krug i puštanja glave i repa da
beskrajno lebde u tom krugu čini nepotrebnim ikada premještanje predmeta pohranjenih u
nizu. Ako je n veličina polja, tada će računski indeksi po modulu n niz pretvoriti u krug. Ovo
je i dalje konceptualno najjednostavniji način konstruiranja reda na jeziku visoke razine, ali
doduše pomalo usporava stvari, jer se indeksi polja moraju usporediti s nulom i veličinom
polja, koja je usporediva s vremenom potrebno za provjeru je li indeks niza izvan granica, što
neki jezici i čine, ali ovo će sigurno biti metoda odabira za brzu implementaciju ili za bilo
koji jezik visoke razine koji nema sintaksu pokazivača. Veličina polja mora se deklarisati
prije vremena, ali neke implementacije jednostavno udvostručuju deklarisanu veličinu niza
kada dođe do prelijevanja. Većina modernih jezika s objektima ili pokazivačima može
implementirati ili imati biblioteke za dinamičke liste. Takve strukture podataka osim
ograničenja memorije možda nisu navele fiksno ograničenje kapaciteta. Prelivanje reda je
rezultat pokušaja dodavanja elementa u puni red, a do prekomjernog reda dolazi kada
pokušavate ukloniti element iz praznog reda.

Ograničeni red je red ograničen na ograničeni broj stavki.

Postoji nekoliko efikasnih implementacija FIFO redova. Učinkovita implementacija je


ona koja može izvesti operacije - stavljanje u red i uklanjanje redova - za O vrijeme.

 Povezana lista
 Dvostruko povezana lista ima O umetanje i brisanje na oba kraja, pa je to
prirodni izbor za redove.

17
2

 Redovna pojedinačno povezana lista ima efikasno umetanje i brisanje


samo na jednom kraju. Međutim, mala izmjena - zadržavanje pokazivača
na posljednji čvor uz prvi - omogućiće mu da implementira efikasan red.
 Deque implementiran korištenjem modifikovan dinamičkog niza.

1.3.2. Redovi i programski jezici

Redovi se mogu implementirati kao zasebni tip podataka, ili se možda smatraju
posebnim slučajem dvostrukog reda (dequeue), a ne primjenjuju se zasebno. Na primjer, Perl
i Ruby dopuštaju guranje i iskakanje niza s oba kraja, tako da se funkcije push i unshift mogu
stavljati u red i uklanjati iz liste (ili, obrnuto, mogu se koristiti shift i pop), iako u nekim
slučajevima ove operacije nisu efikasne.

C ++-ova biblioteka standardnih predložaka nudi predlošku klase "reda" koja je


ograničena samo na push / pop operacije. Od J2SE5.0, Java biblioteka sadrži platformu reda
koje specifikuje operacije reda; klase implementacije uključuju LinkedList i (od J2SE 1.6)
ArrayDeque. PHP ima klasu SplQueue i biblioteke nezavisnih proizvođača poput beanstalk'd
i Gearman.

Na slici 4., prikazan je jednostavan primjer implementacije reda u JavaScript-u.

18

Slika 4. Primjer
2

1.3.3. Prioritetni redovi

Prioritetni red je apstraktna struktura. To znači da u ovom trenutku još ne govorimo o


implementaciji. Prioritetni red mora imati zadovoljene tri operacije, to su: ubacivanje,
brisanje i upit. (engl. push, pop, top). U strukturu se ubacuju elementi, iz strukture se briše
najbolji element i upitom se dobija najbolji element (npr. maksimum, minimum,... - ovisno o
operatoru usporedbe). Važno pitanje koje trebamo postaviti prije korištenja bilo kakve
strukture podataka je: Koliko vremena je dopušteno potrošiti na neku operaciju koja se
obavlja nad strukturom.

Ovo pitanje je veoma važno jer određuje implementaciju. Ako je odgovor na pitanje:
češće ubacivanje, implementacija je veoma jednostavna - koristi se običan niz, a vrijednost
upita određuju se prolaskom kroz sve elemente, tj. vremenska složenost je O (k) . Ista
vremenska složenost je za izbacivanje elementa. Vremenska složenost ubacivanja je naravno
O (1).

n - broj ubacivanja,  q - broj upita,  k - ukupan broj elemenata ubačenih u strukturu

Najčešće su n i q približno jednaki (tj. rijetko kada se koristi gornje opisana


implementacija). Prva ideja koja je na tragu prve implementacije - niz čuvamo uvijek
sortiranim (ubacimo element na pravu poziciju). Za upit i brisanje znamo koji je najbolji
element u O (1) vremenu (to je prvi element u nizu). Samo sada smo pogoršali vrijeme
ubacivanje – O (k).

Postoji li struktura na razini implementacije koja bi poboljšala vrijeme ubacivanja?


Da, postoji i zove se Heap. Kako ništa nije besplatno tako i postizanje boljeg vremena
ubacivanja uzrokovaće veću složenost izbacivanja (sada će umjesto O (1) biti O(log(k)) ).

19
2

1.4. Stablo

U računarstvu, stablo je široko korišten apstraktni tip podataka koji simulira


hijerarhijsku strukturu stabla, s korijenskom vrijednošću i podstablima djece s roditeljskim
čvorom, predstavljenim kao skup povezanih čvorova. Struktura podataka stabla može se
definisati rekurzivno kao kolekcija čvorova (počevši od korijenskog čvora), gdje je svaki
čvor struktura podataka koja se sastoji od vrijednosti, zajedno sa listom referenci na čvorove
("djeca"), sa ograničenja da nijedna referenca nije duplikat i nijedna ne upućuje na korijen.

Alternativno, stablo se može apstraktno definisati kao cjelina (globalno) kao uređeno
stablo, s vrijednošću dodijeljenom svakom čvoru. Obe ove perspektive su korisne: dok se
stablo može matematički analizirati u cjelini, kada je zapravo predstavljeno kao struktura
podataka, obično se predstavlja i s njim radi odvojeno čvorom (umjesto kao skup čvorova i
lista susjednosti ivica između čvorova , kao što može predstavljati digraf, na primjer). Na
primjer, gledajući stablo u cjelini, može se govoriti o "roditeljskom čvoru" datog čvora, ali
uopšteno kao struktura podataka dati čvor sadrži samo popis svojih podređenih, ali ne sadrži
referencu na njegov roditelj (ako postoji).

Generički, i tako nebinarni, nesortirani, neke oznake duplicirane, proizvoljni dijagram


stabla (slika 5). U ovom dijagramu, čvor označen sa 7 ima troje djece, s oznakama 2, 10 i 6, i
jedan roditelj, označen sa 2. Korijenski
čvor, na vrhu, nema roditelja.

20
2

1.4.1. Obilazak stabla

Obilazak stabla je algoritam kojim u konačnom vremenu posjećujemo čvorove stabla


tako da svaki čvor posjetimo tačno jednom. Njegova namjena je obrada vrijednosti nad svim
čvorovima te uspostavljanje linearnog uređaja među njima. Najčešće se implementacija
obilaska stabla zadaje rekurzivno te postoji više načina od kojih se češće upotrebljavaju:

 preorder
 inorder
 postorder

Preorder je način obilaska stabla u kojem prvo posjećujemo korijen stabla, a zatim
podstabala krećući se s lijeva na desno. Postorder način obilaska posjećuje najprije
podstabala s lijeva na desno te na kraju korijen, a inorder najprije posjećuje najljevije
podstablo zatim korijen te zatim preostala podstabla krećući se takođe s lijeva na desno.

Operacije na stablu su slijedeće:

 ParentT(n,T) - procedura koja vraća roditelja od čvora n, a ukoliko je taj čvor


korijen vraća se pogreška,
 FirstChildT(n,T) - funkcija vraća prvo, znači najljevije dijete čvora n, a
ukoliko taj čvor nema dijete (ako je on list) vraća se pogreška,
 NextSiblingT(n,T) - vraća sljedećeg brata čvora n, a ukoliko on ne postoji
vraća se pogreška,
 LabelT(n,T) - procedura koja vraća vrijednost čvora n,
 RootT(T) - funkcija koja vraća vrijednost korijena stabla,
 CreateT(x,n,T) - dodaje novi čvor sa vrijednošću x kao dijete čvora n.
 ChangeLabelT(x,n,T) - zamjenjuje vrijednost čvora n sa vrijednošću x.

21
2

 DeleteT(n,T) - procedura koja briše čvor n i s time sve njegove potomke iz


stabla T,
 InitT(x,T) - inicijalizira stablo s korijenom x.

1.4.2. Binarno stablo

U računarstvu, binarno stablo je struktura podataka stabla u kojoj svaki čvor ima
najviše dvoje djece, koja se nazivaju lijevim i desnim djetetom. Rekurzivna definicija koja
koristi pojmove samo teorije skupova je da je (neprazno) binarno stablo korpa (L, S, R), gdje
su L i R binarna stabla ili prazan skup, a S je jednostruki skup koji sadrži korijen. Neki autori
dopuštaju da i binarno stablo bude prazan skup.

Iz perspektive teorije grafova, binarna (i karijska) stabla zapravo su arborecencije.


Binarno stablo se tako može nazvati i bifurkacijskim drvorezom- terminom koji se pojavljuje
u nekim vrlo starim programskim knjigama prije nego što je prevladala moderna
terminologija informatike. Takođe je moguće binarno stablo protumačiti kao neusmjereni, a
ne usmjereni graf, u tom slučaju je binarno stablo uređeno, ukorijenjeno stablo. Neki autori
koriste ukorijenjeno binarno stablo umjesto binarnog stabla kako bi naglasili činjenicu da je
stablo ukorijenjeno, ali kako je gore definisano, binarno stablo je uvijek ukorijenjeno.
Binarno stablo je poseban slučaj uređenog K-ary stabla, gdje je k 2.

U matematici ono što se naziva binarnim stablom može se značajno razlikovati od


autora do autora. Neki koriste definiciju koja se uobičajeno koristi u računarstvu, ali je drugi
definišu kao svaki ne-list koji ima tačno dvoje djece, a ne moraju poredati ni djecu (lijevo /
desno).

U računanju se binarna stabla koriste na dva vrlo različita načina:

1. Prvo, kao sredstvo za pristup čvorovima na osnovu neke vrijednosti ili oznake
povezane sa svakim čvorom. Binarna stabla označena na ovaj način koriste se
za implementaciju binarnih stabala pretraživanja i binarnih gomila, a koriste se
za efikasno pretraživanje i sortiranje. Oznaka nekorijenskih čvorova kao

22
2

lijevog ili desnog djeteta, čak i kada je prisutno samo jedno dijete, bitna je u
nekim od ovih aplikacija, posebno je značajna u binarnim stablima
pretraživanja. Međutim, raspored određenih čvorova u stablo nije dio
konceptualnih informacija. Na primjer, u normalnom binarnom stablu
pretraživanja postavljanje čvorova gotovo u potpunosti ovisi o redoslijedu
kojim su dodani i može se preurediti (na primjer balansiranjem) bez promjene
značenja.
2. Drugo, kao prikaz podataka sa relevantnom bifurkacijskom strukturom. U
takvim slučajevima, određeni raspored čvorova ispod i / ili lijevo ili desno od
drugih čvorova dio je informacija (to jest, promjenom bi se promijenilo
značenje). Uobičajeni primjeri javljaju se kod Huffmanovog kodiranja i
kladograma. Svakodnevna podjela dokumenata na poglavlja, odjeljke,
odlomke i tako dalje analogan je primjer s n-arima, a ne s binarnim stablima.

Na primjeru ispod prikazano je binarno stablo veličine 9 i visine 3, s korijenskim


čvorom čija je vrijednost 2. Gornje stablo je neuravnoteženo i nije sortirano.

Slika 6. Primjer binarnog stabla

23
2

1.5. Hash tablice (heš tablice)

U računarstvu, hash tablica (hash map) je struktura podataka koja implementira


asocijativni niz apstraktnih vrsta podataka, strukturu koja može preslikati ključeve u
vrijednosti. Hash tablica koristi hash funkciju za izračunavanje indeksa, koji se naziva i hash
kodom, u niz kašika ili utora iz kojih se može pronaći željena vrijednost. Tokom
pretraživanja, ključ se raspršuje i rezultirajuće raspršivanje pokazuje gdje je uskladištena
odgovarajuća vrijednost. U idealnom slučaju, hash funkcija će dodijeliti svaki ključ
jedinstvenom segmentu, ali većina dizajna hash tablica koristi nesavršenu hash funkciju, što
može uzrokovati kolizijsku raspršivanje kada hash funkcija generiše isti indeks za više od
jednog ključa. Takvi se sudari obično prilagode na neki način. U dobro dimenzionirsnoj hash
tablici, prosječni trošak (broj uputa) za svako pretraživanje neovisan je o broju elemenata
pohranjenih u tablici. Mnogi dizajni hash tablica takođe omogućavaju proizvoljna umetanja i
brisanja parova ključ / vrijednost, uz (amortizovanu) konstantnu prosječnu cijenu po
operaciji. U mnogim se situacijama pokazalo da su hash tablice u prosjeku učinkovitije od
stabala pretraživanja ili bilo koje druge strukture pretraživanja tablice. Iz tog razloga, oni se
široko koriste u mnogim vrstama računarskog softvera, posebno za asocijativne nizove,
indeksiranje baza podataka, predmemorije i skupove.

Ideja raspršivanja je distribucija unosa (parovi ključ / vrijednost) kroz niz segmenata.
S obzirom na ključ, algoritam izračunava indeks koji sugeriše gdje se unos može naći:

index = f(key, array_size)

Često se to radi u dva koraka:

24
2

hash = hashfunc(key)
index = hash % array_size

U ovoj metodi, hash je neovisan o veličini polja, a zatim se smanjuje na indeks (broj
između 0 i array_size - 1) koristeći modulo operator (%). U slučaju da je veličina polja snaga
dva, ostatak rada svodi se na maskiranje, što poboljšava brzinu, ali može povećati probleme s
lošom heš funkcijom.

1.6. Grafovi

U računarstvu, graf je apstraktni tip podataka koji treba da implementira neusmjereni


graf i usmjerene koncepte grafa iz područja teorije grafova u matematici.

Struktura podataka grafa sastoji se od konačnog (i moguće promjenjivog) skupa


vrhova (koji se nazivaju i čvorovi ili tačke), zajedno sa skupom neuređenih parova ovih
vrhova za neusmjereni graf ili skupa uređenih parova za usmjereni graf. Ti su parovi poznati
kao ivice (koje se nazivaju i veze ili linije), a za usmjereni graf poznate su i kao strelice.
Vrhovi mogu biti dio strukture grafa ili mogu biti vanjski entiteti predstavljeni cjelobrojnim
indeksima ili referencama.

Struktura podataka grafa može takođe pridružiti svakoj ivici neku vrijednost ivice,
kao što je simbolična oznaka ili numerički atribut (trošak, kapacitet, dužina, itd.).

Na slici ispod prikazan je usmjereni graf s tri vrha (plavi krugovi) i tri ivice (crne
strelice).

25
2

Osnovne operacije koje pruža struktura podataka grafa G obično uključuju:

 susjedni (G, x, y): ispituje postoji li ivica od vrha x do vrha y;


 susjedi (G, x): navodi sve vrhove y tako da postoji ivica od vrha x do vrha y;
 add_vertex (G, x): dodaje vrh x, ako nije tamo;
 remove_vertex (G, x): uklanja vrh x, ako je tamo;
 add_edge (G, x, y): dodaje ivicu iz temena x u vrh y, ako nije tamo;
 remove_edge (G, x, y): uklanja ivicu iz vrha x u vrh y, ako je tamo;
 get_vertex_value (G, x): vraća vrijednost povezanu s vrhom x;
 set_vertex_value (G, x, v): postavlja vrijednost povezanu s vrhom x na v.

Strukture koje pridružuju vrijednosti ivicama obično takođe pružaju:

 get_edge_value (G, x, y): vraća vrijednost povezanu s ivicom (x, y);


 set_edge_value (G, x, y, v): postavlja vrijednost povezanu s rubom (x, y) na v.

U praksi se koriste različite strukture podataka za predstavljanje grafova:

Lista susjedstva

Vrhovi se pohranjuju kao zapisi ili objekti, a svaki vrh pohranjuje listu susjednih
vrhova. Ova struktura podataka omogućuje pohranu dodatnih podataka na temenima. Dodatni
podaci mogu se pohraniti ako su ivice takođe pohranjene kao objekti, u tom slučaju svaki vrh
sprema svoje incidentne ivice, a svaka ivica pohranjuje svoje incidentne vrhove.

Matrica susjedstva

26
2

Dvodimenzionalna matrica, u kojoj redovi predstavljaju izvorne vrhove, a stupci


odredišne vrhove. Podaci o ivicama i temenima moraju se pohraniti izvana. Između svakog
para vrhova može se pohraniti samo trošak za jednu ivicu.

Matrica incidencije

Dvodimenzionalna Booleova matrica, u kojoj redovi predstavljaju vrhove, a stupci


ivice. Unosi pokazuju da li vrh u redu upada u rub kolone.

2. PREDNOSTI APSTRAKTNIH TIPOVA PODATAKA

Neke su prednosti ADT-a u odnosu na konvencionalne strukture podataka, a to su:

 ADT je za ponovnu upotrebu, robustan i zasnovan je na principima objektno


orijentisanog programiranja (OOP) i softverskog inženjerstva (SE)
 ADT se može ponovo koristiti na nekoliko mjesta i smanjuje napore kodiranja
 Inkapsulacija osigurava da podaci ne mogu biti oštećeni
 Aplikacijski program ne može miješati rad različitih integriranih operacija
 ADT osigurava robusnu strukturu podataka

ADT pristup zasnovan je na SE konceptima spajanja i kohezije.

Svojstvo sprezanja određuje:

 Koliko su čvrsto povezana dva odvojena dijela programa


 Proširi na koji promjene napravljene u jednom dijelu utiču na druge dijelove
softverskog modula

Dobro dizajnirani softver ima minimalnu spregu. ADT promoviše slabu spregu.
Kohezija određuje koliko su dobro integrisane komponente softvera. ADT inherentno
promoviše maksimalnu koheziju.

Kapsulacija- Apstrakcija daje obećanje da svaka primjena ADT-a ima određena


svojstva i sposobnosti; znajući da je to sve što je potrebno za korištenje ADT objekta.

27
2

Lokalizacija promjene- Kod koji koristi ADT objekt neće trebati uređivati ako se
promijeni implementacija ADT-a. Budući da sve promjene u implementaciji moraju i dalje
biti u skladu sa platformom, a budući da se kod koji koristi ADT objekt može odnositi samo
na svojstva i sposobnosti koje su navedene, promjene se mogu izvršiti bez potrebe za bilo
kakvim promjenama u kodu gdje se koristi ADT .

Fleksibilnost- Različite implementacije ADT-a, koje imaju sva ista svojstva i


sposobnosti, ekvivalentne su i mogu se koristiti donekle naizmjenično u kodu koji koristi
ADT. Ovo daje veliku fleksibilnost pri korištenju ADT objekata u različitim situacijama. Na
primjer, različite implementacije ADT-a mogu biti efikasnije u različitim situacijama;
moguće je koristiti svaki u situaciji kada su poželjniji, povećavajući na taj način ukupnu
efikasnost.

2.1. Najčešće operacije

Neke operacije koje su često specifične za ADT (možda pod drugim imenima) jesu:

- compare (s, t), koji ispituje jesu li stanja dvije instance ekvivalentna u nekom smislu;

- hash (-a), koji izračunavaju neku standardnu hash-funkciju iz stanja instance;

- print (s) ili show (s), koji proizvode čitljiv prikaz stanja instance.

U definicijama ADT u imperativnom stilu često se takođe mogu naći:

- create (), koji daje novu instancu ADT-a;


- initialize (e), koja priprema novostvorenu instancu (e) za daljnje operacije ili je
resetira u neko "početno stanje";
- copy (s, t), koja instancu s stavlja u stanje ekvivalentno stanju t;
- clone (t), koji izvodi s ← create (), copy (s, t) i vraća s;
- free ili destroy, čime se vraća memorija i drugi resursi koje s.

Besplatna operacija obično nije relevantna ili značajna, jer su ADT-ovi teorijski
entiteti koji ne "koriste memoriju". Međutim, možda će biti potrebno kada treba analizirati
memoriju koju koristi algoritam koji koristi ADT. U tom su slučaju potrebni dodatni aksiomi
koji određuju koliko memorije koristi svaka ADT instanca, u funkciji svog stanja, i koliko se
toga besplatno vraća u spremište.
28
2

ZAKLJUČAK

Apstraktni tip podataka (ADT) je tip za objekte čije je ponašanje definisano skupom
vrijednosti i skupom operacija.

Definicija ADT-a samo spominje koje operacije treba izvršiti, ali ne i kako će se te
operacije provesti. Ne navodi kako će se podaci organizovati u memoriji i koji će se algoritmi
koristiti za provedbu operacija. Zove se „apstraktno“ jer daje pogled na provedbu neovisan.
Proces pružanja samo osnovnog i skrivanja detalja poznat je pod nazivom apstrakcija.

Korisnik tipa podataka ne mora znati kako se taj tip podataka implementira, na
primjer, koristili smo primitivne vrijednosti kao što su int, float, char tipovi podataka samo sa
znanjem da taj tip podataka može raditi i izvoditi se bez ikakvog ideja kako se provode.
Dakle, korisnik samo treba znati šta tip podataka može učiniti, ali ne i kako će se
implementirati. Zamislimo ADT kao crnu kutiju koja skriva unutrašnju strukturu i dizajn tipa
podataka.

U radu su opisani neki od najvažnijih apstraktnih tipova podataka,a to su: povezane


liste, stekovi, redovi, stabla, heš tablice i grafovi, međutim postoji još mnogo njih.

Na samom kraju, najbitnije je shvatiti za šta konkretno služi ADT. Apstraktne tipove
podataka osmišljava sam programer, omogućuju jasnije i čišće oblikovanje programske
arhitekture, povećavaju razumljivost aplikacija i njihovo lakše održavanje.

29
2

LITERATURA

1) Narasimha Karumanci, “Data Structures And Algorithms Made Easy”, Career


Monk, 2020.
2) Dejan Živković, “Uvod u algoritme i strukture podataka”, Peto izdanje,
Beograd, 2018.
3) www.wikipedia.org
4) https://www.cs.rutgers.edu/~lou/314-f04-slides/topic07_adts.pdf
5) file:///C:/Users/Natalija/Downloads/VT_ASP_2009-01-20.pdf
6) http://datastructure-application.blogspot.com/2011/09/advantages-of-adt.html
7) http://wiki.xfer.hr/strukture_priority_q/

30

You might also like