0.

Dinamička alokacija memorije
MEMORIJA
- organizacija memorije može se „donekle“ shvatiti poput pješčanog sata (jer se za razliku od pješčanog sata, pijesak prosipa iz obaju dijelova, i to od rubova prema sredini – „gornji“ dio se naziva gomila, a „donji“ stog ) - varijable deklarirane pri kompajliranju nalaze se na stogu --> svaka standardna deklaracija varijable dodaje novi memorijski okvir na stog --> što je varijabla „globalnija“ to je niže na stogu --> memorija pridijeljena varijablama koje su lokalne nekoj funkciji se po završetku izvođenja te funkcije automatski oslobađa - varijable deklarirane nakon kompajliranja nalaze se na gomili --> koristi se za podatke za koje je važno da budu dostupni dulje vrijeme --> ponajviše za podatke čiji broj i veličina nisu poznati prije vremena izvršavanja --> pridijeljena memorija se ne oslobađa automatski – to je zadaća programera - ako stog i gomila toliko narastu da se preklope, dolazi do rušenja programa, a potencijalno i operacijskog sustava – ova se pojava zove CURENJE MEMORIJE - GOMILA=HEAP – korijen je najveći, svaki čvor je već od svoje djece, svaka razina je maksimalno popunjena (osim možda posljednje, a i ona s lijeva na desno) - temeljne razlike stoga i gomile: * stog je struktura podataka organizirana po LIFO principu, malen je, a pristup njemu je brz * gomila je struktura podataka koja je znatno veća po kapacitetu od stoga, ali pristup njoj je spor * varijable koje se smještaju na stog su statičke, a varijable koje se smještaju na gomilu su dinamičke

STOG I RED
- stog je apstraktna struktura podataka organizirana po LIFU principu (last in first out) - karakteriziraju ga dvije temeljne operacije: 1) push() – dodavanje novog elementa na vrh stoga *pseudokod: Provjeri je li stog prazan Ako stog nije prazan postavi novi čvor da pokazuje na prethodni vrh postavi vrh da bude novi čvor Ako stog jest prazan postavi vrh da bude novi čvor 2) pop() – uklanjanje trenutnog elementa s vrha stoga *pseudokod: Provjeri je li stog prazan Ako stog nije prazan postavi vrh da pokazuje na prvog ispod sebe Ako stog jest prazan ispiši poruku o tome - elementi stoga su objekti koji su po svojoj definiciji instance neke klase – te objekte nazivamo čvorovima - red je apstraktna struktura podataka organizirana po FIFO principu (first in first out) - karakteriziraju ga dvije temeljne operacije: 1) ulaz() – dodavanje novog elementa na kraj reda *pseudokod:Provjeriti je li red prazan Ako jest dodati novi čvor u red kao prvi i jedini Ako nije

1 | SPA

pronaći posljednji čvor u redu postaviti posljednjeg da pokazuje na novog 2) izlaz() – uklanjanje trenutnog elementa s početka reda *pseudokod: Isti kao kod stoga!!

TORNJEVI HANOIA
- prema drevnoj legendi postoji hram boga Brahme u kojem se nalaze 3 stupa okružena sa 64 zlatna diska - svećenici premještaju diskove s jednog stupa na drugi, poštujući pravila kako bi udovoljili Brahmi --> veći disk ne smije doći na manji, već samo manji na veći - onog dana kada svećenici uspiju premjestiti sve diskove s jednog stupa na drugi, nastupit će smak svijeta - kad bi legenda bila istinita i kada bi svećenici bili toliko brzi da im treba samo 1 sekunda za premještanje diska sa stupa na stup – to bi sveukupno trajalo 600 milijardi godina

SLUČAJNI BROJEVI
- slučajni brojevi već u svom imenu nose dezinformaciju (ispravnije bi ih bilo zvati pseudoslučajni brojevi) - temeljna im je karakteristika da svaki novogenerirani broj nema veze (bar ne očite) s prethodno generiranim brojem - računalo ne može generirati slučajne brojeve deterministički --> ipak postoje algoritmi za generiranje koji daju dojam slučajnosti, a zovu se linerani kongruencijski generatori - linearni kongruencijski niz je niz brojeva koji se temelji na ponovljenom izvođenju sljedeće relacije: m – modul, a – multiplikator, c – inkrement --> iz gornje napisane relacije za zadane a=2, c=3, m=10 te početnu vrijednost x=5, nije teško odrediti niz brojeva koji će se generirati - vrijednosti se ponavljaju u ciklusima zato što modularna aritmetika gura generirane vrijednosti u željeni raspon - duljina ciklusa još se zove i period niza -> logično, što je period veći, nizovi brojeva se doimaju slučajnijima, budući da na prvi pogled nema uočljivog ponavljanja - najdulji mogući period za ovakav algoritam je vrijednost od m --> što je m veći, veće su šanse da period bude dulji --> valja primijetiti kako unatoč tome što je modul m=10 da je ciklus duljine 4 --> ovo navodi da valja pripaziti kod odabira i modula i inkrementa

ALGORITMI SORTIRANJA
- sortiramo da bi nam bilo lakše pretraživati: minimalni i maksimalni element, pojedino prezime - sortirati se može na puno načina, a svaki od njih se zove algoritam sortiranja BUBBLE SORT - najjednostavniji i najsporiji --> šetnjom kroz niz uspoređuju se svaka dva susjedna elementa - ako nisu u željenom odnosu, zamijene se --> šetnja traje sve dok niz nije sortiran SELECTION SORT - malo složeniji, ali brži od bubble sorta --> pronađe se najmanji element u nizu, zamijeni se s prvim elementom --> procedura se nastavlja za podniz od sljedećeg elementa nadalje INSERTION SORT - još složeniji, ali i još brži od bubble sorta --> najlakše ga je vizualizirati kroz slaganje karata

2 | SPA

prošlog stoljeća.--> krene se s podnizom od jednog elementa. elementi niza se ponovno poredaju na način da svi elementi manji od pivota završe ispred njega.Euklidov algoritam: Za 2 prirodna broja m i n.unaprjeđenje insertion sorta --> umjesto da uspoređuje susjedne elem. a svi veći iza njega završe desno --> rekurzivno se ponavljaju ovi koraci na nastale podnizove RADIX SORT . 2) [je li ostatak 0?] – ako je r=0 algoritam završava. 3) [reduciraj] – postavi prvo m na n. promatramo trećeg itd.n-1. vrijednost od r je manja od n 3 | SPA .u 50-im g. promatra se sljedeći element te ga se umeće ili ispred ili iza u taj podniz – podniz je narastao na 2 elementa.. i ima 5 važnih osobina: 1) KONAČNOST . koraka.) --> zaslužan za izum algebre i uvođenje jednadžbi u matematiku . rješenje je broj n. Neka je r ostatak pri dijeljenju m sa n. --> redoslijed u ovom koraku je iznimno bitan (u suprotnom bi sve vrijednosti bile iste) . uspoređuju se elementi udaljeni za unaprijed definirani broj mjesta --> progresivnim smanjivanjem broja koraka.ideja algoritma je fundamentalna za programiranje . MERGE SORT .algoritam predstavlja konačan skup pravila koja se izvode u određenom redoslijedi s ciljem rješavanja nekog problema.. dolazi se do skoro sortiranog niza kojeg se sortira insertion sortom QUICK SORT .2. spoji dva sortirana podniza u jedan niz) SHELL SORT . odredi njihov najveći zajednički djelitelj tj.koristi taktiku „podijeli pa vladaj“ --> ako je niz duljine 0 ili 1 – sortiran je --> u protivnom podijeli niz na 2 otprilike jednaka dijela (sortiraj svaki od podnizova rekurzivno primjenjujući merge sort algoritam.također koristi taktiku „podijeli pa vladaj“ --> odabere se element niza (pivot).„totalno drukčiji od drugih“ --> ne uspoređuje elemente već njihove znamenke počevši od najmanje značajne znamenke prema onoj najznačajnijoj – u tom procesu obavlja potrebne zamjene 1.algoritam se uvijek mora završiti nakon konačnog broja koraka *Euklidov algoritam zadovoljava ovaj uvjet: --> nakon 1. Analiza složenosti algoritama ALGORITAM .riječ „algoritam“ – izvedena iz „algorism“ koja dolazi od latiniziranog imena perzijskog matematičara.. Moguće vrijednosti od r su 0. a zatim n na r. Vrati se na korak 1. riječ „algoritam“ bila je skoro jednoznačno povezana s Euklidovim algoritmom (za pronalazak najvećeg zajedničkog djelitelja dvaju brojeva) . najveći prirodni broj koji istovremeno dijeli i m i n 1) [pronađi ostatak] – ako je n>m onda ih zamijeni.1.st.. a zvao se: Al-Kwarizmi (9..

tada je n očito dijeljitelj od m 5) UČINKOVITOST – algoritam mora biti učinkovit i to na način da njegove radnje moraju biti dovoljno jednostavne da ih netko. a sve radnje koje se provode moraju biti jednoznačne za svaki mogući slučaj *Euklidov algoritam zadovoljava ovaj uvjet: --> podrazumijeva se da je onome tko provodi algoritam jasno što znači podijeliti prirodan broj s drugim prirodnim brojem --> također. elegancija. kad tad će r biti 0 --> to znači da će se nakon konačno mnogo koraka pronaći djelitelj 2) DEFINIRANOST – svaki korak mora biti precizno definiran.cjenjeniji su algoritmi s razumno mnogo koraka (algoritam koji određuje hoće li bijeli uvijek pobijediti crnog u šahu ako ne napravi ni jednu pogrešku može se završiti u konačno mnogo koraka. budući da će u 3. zagrijte mlijeko u malom lončiću... koraka je najveći zajednički dijeljitelj početnih brojeva m i n --> ovo je lako provjeriti budući da je prema Lemi o dijeljenju m=q*n+r --> kako je za ulaz u 2. koraka 3) ULAZ – algoritam mora imati ulazne podatke *Euklidov algoritam zadovoljava ovaj uvjet: brojevi m i n su dani od strane korisnika 4) IZLAZ – algoritam mora imati jedan ili više izlaznih podataka.. u ponovnom 1. izlaz (večera. „tehnika“ itd.značenje riječi „algoritam“ nije istovjetno značenju riječi „recept“. koraku će n biti manji --> ovaj pripadajući niz prirodnih brojeva (n1. njegova prilagodba na različita računala.. u konačno mnogo vremena. tako da je za pronaći dovoljno: provesti algoritam za m=1. usko povezanih s ulaznim podacima *Euklidov algoritam zadovoljava ovaj uvjet: --> broj n iz 2. koraka bitan samo ostatak dijeljenja m sa n. „metoda“.m=2. podijeliti taj broj s n --> sada je važno odrediti prirodu tog broja odnosno izraziti ga preko n ANALIZA ALGORITMA 4 | SPA . koraka Euklidovog algoritma? --> budući da promatramo sve prirodne brojeve m.m=n. brašno). koraka r je nenegativan cijeli broj koji mora biti prirodan ako će biti 3.svojstvo konačnosti u praksi i nije toliko primjereno .--> ako r nije 0. može napraviti koristeći olovku i papir *Euklidov algoritam zadovoljava ovaj uvjet: --> podrazumijevane operacije jesu dijeljenje i oduzimanje prirodnih brojeva (moguće je izvesti na papiru) --> da se radi o dijeljenju realnih brojeva to ne bi bilo moguće . na to pitanje --> očito je da je nakon prvog izvođenja 1. ulaz (jaja. koraku n poprimiti tu vrijednost.. prebrojiti koliko puta se izvršio 1. korak. potrebno je da su ti brojevi zaista prirodni brojevi --> ovo je u početnom koraku svakako istina jer taj algoritam primjenjujemo na prirodne brojeve. a nakon 1. koliki je prosječni broj izvršavanja 1. ali njihov broj je toliko velik da ga možda nećemo doseći za našeg života) . --> recept uglavnom posjeduje: konačnost. koliko se puta svaki korak izvršio) --> ovo vodi analizi algoritma *Promatranje Euklidovog algoritma: --> pod pretpostavkom da je vrijednost broja n poznata. korak nužno da r bude jednak 0. potrebno prvo provjeriti postoji li smislen odg. „proces“.n2. kolač) --> nedostaje mu definiranost (prstohvat soli.) .n3) se mora kad tad prekinuti tj.potrebni su nam algoritmi koji su dobri ma šta god to značilo (jednostavnost. dok m može poprimiti bilo koju vrijednost iz skupa prirodnih brojeva.

pri analizi algoritma. m=x[n] M2 [Provjera] ako je k=0 algoritam završava M3 [Usporedba] ako je x[k] <=m idi na M5 M4 [Promijeni m] j=k.. često je važno kazati kako se algoritam ponaša pri najgorem slučaju.M2=n.Algoritam M: Za zadani niz brojeva x[1]. zapis O(f(n)) može se koristiti kada god je f(n) funkcija prirodnog broja n --> predstavlja veličinu koja nije eksplicitno poznata.O-notacija je od velike koristi pri radu s aproksimacijama budući da na vrlo sažet način opisuje pojavu koja se često ponavlja te potiskuje detalje koji su često nevažni . m=x[k] M5 [Smanji k] k=k-1 i idi na M2 .algoritam M zahtijeva fiksnu količinu memorije tako da ćemo analizirati samo vrijeme potrebno za njegovo izvršavanje (stoga prebrojimo koliko će se puta svaki od koraka izvršiti: M1=1.često znamo iskazati neku veličinu aproksimativno. ali svakako nije prevelika .1894..račun s O-notacijom je prilično jednostavan. pri čemu je j najveći indeks koji zadovoljava ovaj uvjet. a ne precizno. potrebno je prvo definirati što se točno podrazumijeva pod prosjek.učinkovitost algoritma M ne ovisi o preciznim vrijednostima x[k] već o njihovom međusobnom odnosu ASIMPTOTSKI PRIKAZ .. a za dobro definirati prosjek potrebno je napraviti određene pretpostavke o ulaznim podacima --> pretpostavimo da su svi elementi x[k] međusobno različiti --> pretpostavimo da je svaka od n! permutacija ovih elemenata jednako vjerojatna .za odrediti ovo.dakle.x[2].g. odnosno pri slučaju kada je potrebno izvršiti najviše koraka 5 | SPA . matematičar Paul Bachman uveo je vrlo zgodan zapis za aproksimacije --> radi se o O-notaciji koja omogućuje da se znak jednakosti zamijeni sa znakom ≈ .M3=n-1. k=n-1..M4=A.pritom valja reći kako se radi isključivo s jednosmjernim jednadžb. .općenito govoreći. a to činimo kako bi ju usporedili s nekom drugom --> to je zgodno jer nam često nije potrebno znati precizno kakve su te veličine već samo kojeg su reda . prosječna vrijednost leži negdje između 0 i n-1 . budući da su različite za svaku upotrebu O(f(n)) --> samo se podrazumijeva da postoje .M5=n-1) . M1 [Inicijaliziraj] j=n.svaki put kad se pojavi O(f(n)) to znači: --> da postoje pozitivne konstante M i n0 takve da broj xn koji je predstavljen izrazom O(f(n)) zadovoljava uvjet za sve prirodne brojeve --> nigdje se te konstante ne preciziraju.analiza ovog algoritma se uglavnom sastoji od pronalaska --> minimalne vrijednosti od A --> maksimalne vrijednosti od A --> prosječne vrijednosti od A --> standardnu devijaciju od A (kvantitativna indikacija koliko blizu prosjeka očekujemo da će A biti) .x[n] odredi m i j takve da vrijedi m=x[j] koji je maksimalni element tog niza.. u svom djelu „Analytische Zahlentheorie“.

faktorijeli rastu brže od eksponencijalnih funkcija 2. godinom rođenja i sl.a ta relacija poretka (uređaja) koja se definira nad ključevima mora zadovoljavati sljedeće uvjete za bilo koja 3 ključa a..neke od važnijih primjena sortiranja: *rješenje problema zajedništva kod kojeg su svi elementi s istim „opisom“ doneseni odjednom --> ako je dano 10 000 elemenata u proizvoljnom poretku.c *načelo trihotomije – uvijek vrijedi točno jedan od izraza a<b.svakom od zapisa Rj pripada odgovarajući ključ Kj koji usmjerava proces sortiranja -->ključevi predstavljaju neku odrednicu zapisa po kojoj se sortira. a>b *tranzitivnost – iz odnosa a<b i b<c slijedi odnos a<c . eksponencijalne funkcije rastu brže od potencija od n. Ako zapis predstavlja studenta s imenom. uzlazno) moguće je pronaći sve podatke koji se poklapaju u samo jednom sekvencijalnom prolazu kroz njih. veća potencija znači brži rast.odavde su se kristalizirala 3 zaključka: 1) sortiranje ima mnogo važnih primjena 2) ljudi sortiraju kada i ne bi trebali 3) u upotrebi su neučinkoviti algoritmi sortiranja --> na 1) i 2) računarstvo nije moglo utjecati. a u nekim tvrtkama taj je postotak rastao i do 50% . na način da te stvari budu raspoređene uzlazno ili silazno .. tako će dva algoritma koja za svoje izvršenje nad n ulaznih podataka imaju različitu složenost.. prezimenom.--> O-notacija nam tu uvelike pomaže budući da se njome iskazuje upravo to (broj koraka algoritma pri najgorem slučaju) ..za bolje shvaćanje sortiranja potrebno je pobliže definirati problem kojeg ono ima riješiti ..jedna od prvih primjena sortiranja u velikim informacijskim sustavima bile ja 1960. a=b.sortiranje se dodatno naziva stabilnim ako zapisi sa istim ključevima nakon sortiranja zadrže svoj isti relativni poredak u odnosu na početno stanje VRSTE SORTIRANJA: 6 | SPA ...p(n) nad indeksima {1. pri čemu se elementi često zovu zapisi (record) . otpada na sortiranje.dano je n elemenata R1.zapise sortiranjem valja poredati na specifičan način.sortiranje je postupak ponovnog raspoređivanja stvari prema nekoj njihovoj odrednici.valja naglasiti kako je sama O-notacija aproksimativnog tipa.b.2. u tvrtci Computer Sciences Corporation . bez kretanja u suprotnom smjeru *potraga za informacijom prema vrijednosti ključa (telefonski imenik) .. onda jedan od ključeva može biti dob ili prezime .n} koja će postaviti ključeve u nepadajući poredak .cilj sortiranja je pronaći permutaciju p(1)p(2).u tom desetljeću proizvođači računala su tvrdili kako više od 25% vremena u kojem njihova računala rade..Rn koje treba sortirati.R2.. a potrebno je presložiti te elemente tako da svi elementi s jednakim vrijednostima budu jedan pored drugoga *uspoređivanje elemenata u jednoj ili više datoteka --> ako je nekoliko datoteka sortirano na isti način (npr. pri čemu mnogi od njih imaju isti vrijednost. na 3) je (razvojem novih i učinkovitijih algoritama sortiranja) .važno zapamtiti: potencije od n rastu brže od logaritma od n. Sortiranje . možda imati istu Onotaciju .

uspoređujući K sa Ki za sve pripadajuće vrijednosti od i) I3 [Usporedi K sa Ki] Ako je idi na I5 (pronađeno mjesto za R) I4 [Pomakni Ri. K. K=Kj. a ako je i>0 idi natrag na S4 S6 [Smjesti R] Postavi Ri+h=R ..SORTIRANJE SPAJANJEM . smanji i] Postavi Ri+1=Ri.....n a potom završi algoritam I2 [Postavi i. a potom se proces ponavlja za preostale elemente . cijeli niz sortirati insertion sortom *algoritam: S1 [Vrti se u petlji po s] Obavi korak S2 za s=t-1. R=Rj S4 [Usporedi K sa Ki] Ako je idi na S6 S5 [Pomakni Ri.očito je da će za izvršenje programa trebati manje ili više vremena ovisno o odabiru koraka k kojima se stvaraju podnizovi --> najgori slučaj se ne može spustiti ispod O(n3/2) .ako je dan algoritam sortiranja koji pomiče elemente samo jednu po jednu poziciju tada će njegovo prosječno vrijeme izvođenja u najbolju ruku biti O(n2) ..SORTIRANJE IZBOROM --> prvo se pronađe najmanji (najveći) element i na neki način izdvoji od ostatka.0 a onda završi algoritam S2 [Vrti se u petlji po j] Postavi h=hs i obavljaj korake S3 do S6 za h<j<n S3 [Postavi i.. i=i-h. smanji i] Postavi Ri+h=Ri.. tada je K najmanji do sada pronađeni ključ tako da zapis R pripada na mjestu 1) I5 [Smjesti R] Postavi Ri+1=R . A-koliko puta se i smanjuje do 0 u koraku I4.SORTIRANJE IZMJENOM --> ako se za dva susjedna broja utvrdi da nisu u povoljnom međusobnom odnosu tada oni mijenjaju mjesta. R] Postavi i=j-1..R2.. a taj algoritam njemu u čast nosi naziv Shellov sort .SORTIRANJE UMETANJEM --> brojevi se razmatraju jedan po jedan i svaki novorazmatrani broj se umeće na odgovarajuću poziciju ovisno o prethodno sortiranim elementima . Shell objavio je rad u kojem je izložio jedan takav mehanizam.. a ovaj postupak se ponavlja sve dok zamjene više nisu potrebne . B-broj micanja elemenata) . Donald L. R] Postavi i=j-h.1959.prije razmatranja zapisa Rj --> pretpostavljamo da su prethodni zapisi R1.vremenska složenost ovog algoritma je O(n2) za najgori slučaj SORTIRANJE – UMETANJEM – SHELL SORT .t-2. K=Kj..istraživanja ovog problema su pokazala da je trenutno najbolji niz koraka onaj kojeg 7 | SPA .3. i=i-1 a ako je i>0 idi na I3 (ako je i=0..NEŠTO TOTALNO DRUGAČIJE SORTIRANJE – UMETANJEM – INSERTION SORT .Rj-1 sortirani --> potom ga umećemo na odgovarajuće mjesto među prethodno sortirane zapise *algoritam: I1 [Vrti se u petlji po j] Obavljaj korake I2 do I5 za j=2. R=Rj (u sljedećim koracima pokušat ćemo smjestiti R na pravo mjesto.ideja algoritma je jednostavna: --> promatrati svako k-ti element u nizu --> tako nastale k podnizove sortirati insertion sortom --> smanjiti k i ponoviti postupak --> kada je k=1. K.algoritmi iz ove skupine podsjećaju na algoritme korištene pri slaganju karata u trešeti ili remiju .za unaprjeđenje su potrebni određeni mehanizmi koji pomiču elemente koji su međusobno udaljeni za puno više od jedne pozicije .ovaj se program izvršava 9B+10N-3A-9 vremenskih jedinica (N-broj zapisa koje treba sortirati.

spajanje nizova 503 703 765 i 087 512 677 u uređeni niz 087 503 512 677 703 765) .3 puta veći od prethodnog SORTIRANJE – IZMJENOM – BUBBLE SORT .potom se provjeravaju svi preostali elementi tog niza i ako su manji od njega a desno ili veći od njega a lijevo.vremenska složenost je u najgorem slučaju O(n2).unaprijeđenje bubble sorta je algoritam quick sort kojeg je izumio C.R.vremenska složenost u najgorem slučaju je O(n2) SORTIRANJE – IZMJENOM – QUICK SORT .4.polazni niz se rekurzivno komada na dva niza po pola.57. broja elemenata (0) .g. sve dok duljina nastalog niza nije 1 .metoda se zove bubble sort budući da najveći elementi (ako sortiramo uzlazno) odmah isplivaju na „površinu“ poput mjehurića zraka na vodi .merge sort koristi ovaj princip.ponovi prethodni korak --> pošto je prethodni najmanji (najveći) ključ sada postao veći (manji) od najvećeg (najmanjeg) više nije u igri -nastavi ponavljati korak 1 dok svih n zapisa nije odabrano . R3 i R4 itd. a postupak nastaviti s parovima R2 i R3.spajanje podrazumijeva kombiniranje 2 ili više nizova u jedan uređeni niz (npr.302.132. ali brzina algoritma se strahovito ubrzava u preostalim slučajevima gdje mu je složenost reda O(n ln n) SORTIRANJE – IZBOROM – SELECTION SORT . ali mu je najveći nedostatak to što stalno stvara nove podnizove i na taj način zauzima puno memorije 8 | SPA . svaki sljedeći je za otprilike 2. Hoare 1962.10.vremenska složenost u najgorem slučaju je O(n2) SORTIRANJE – SPAJANJEM – MERGE SORT .definira poljski matematičar Marcin Ciura {1.temelji se na proceduri sortiranja koja bi se mogla nazvati particijska zamjena budući da koristeći rekurziju particionira niz na dva podniza prethodno napravivši odgovarajuće zamjene .zatim se spajanjem formiraju novi podnizovi ali sada sortirani .varijacije na temu su: bubble sort i quick sort .merge sort je prilično brz algoritam. pri čemu sistematično zamjenjuje svaka dva elementa koja nisu u željenom odnosu.vjerojatno najočitiji način sortiranja izmjenom je uspoređivati ključeve K1 i K2 te onda zamijeniti zapise R1 i R2 ako nisu u dobrom odnosu. mijenjaju mjesta s pivotom .23.u najboljem slučaju će bubble sort izvršiti samo jedan prolaz kroz sve elemente.algoritam je izrazito brz.A.vremenska složenost u najgorem slučaju je O(n ln n) .701} --> ukoliko je potrebno povećati korak.ova familija algoritama za sortiranje koristi zamjenu ili transpoziciju kao metodu sortiranja. . dok je načelno potrebno više prolaza . a njegov algoritam izgleda ovako: . sve dok takvih parova više nema .familija algoritama sortiranja bazirana je na ideji opetovanog izbora * klasični predstavnik je selection sort.odabere se neki element koji se proglasi pivotom . ali također koristi i princip podijeli pa vladaj . ali i složen za analizu .najjednostavniji način za ovo je uspoređivati dva najmanja elementa iz tih nizova te kao rezultat izbaciti manji od njih dva .pronađi najmanji (najveći) ključ --> prenesi zapis s tim ključem na privremenu lokaciju --> zamijeni taj ključ vrijednošću većom (manjom) od max. .

to pokazivačko polje se obično zove next --> ukoliko je lista dvostruko vezana.listu je najlakše vizualizirati kao vlak s lokomotivom i vagonima --> cijeli vlak predstavlja listu.vremenska složenost u najgorem slučaju je O(kn) gdje je k broj znamenaka najvećeg broja *pseudokod:Odredi koliko znamenaka ima max broj = k Petlja po i od 1 do k Formiraj niz znamenaka počevši s jedinicama (1) pa s deseticama (2) do k Sortiraj taj niz znamenaka Petlja po j od 0 do n-1 po nizu brojeva Šetaj paralelno po nizu znamenaka i nizu brojeva Traži broj sa odgovarajućom znamenkom i zamijeni ga s trenutnom (1. mora biti inicijaliziran (ili pokazuje na prvi čvor u listi ili pokazuje ni na što -> null) .iako ne toliko važan kao head.pošto je potrebno obaviti sve prolaze (ovisno o broju znamenaka najvećeg broja). dvostruko vezana linearna/cirkularna ZAŠTO LISTE.2. i posljednji čvor u listi je također bitan (ima i vlastito ime: tail) .ovisno o definiciji posljednjeg čvora u listi moguća je i dodatna podjela vezanih lista na: --> posljednji je onaj koji ne pokazuje ni na jednog drugog -> linearna vezana lista --> posljednji je onaj koji pokazuje na prvog u listi -> cirkularna lista . A NE NIZOVI?? * neke operacije nad nizovima su složene --> umetanje novog elementa između 2 postojeća 9 | SPA . razlikujemo 4 vrste vezanih lista: jednostruko vezana linearna/cirkularna.algoritam drugačiji od ostalih zato što ne uspoređuje elemente već njihove znamenke (uspoređuje jedinice.pokazivač na listu od iznimne je važnosti --> pokazuje na prvi čvor koji pokazuje na drugi čvor koji pokazuje na treći čvor itd.čvorovi u vezanoj listi sastoje se od: *barem jednog podatkovnog polja koje ga pobliže opisuje *barem jednog pokazivačkog polja koje ga povezuje s drugim čvorovima --> ukoliko je lista jednostruko vezana. postoji i dodatno pokaz.) 3.. pa desetice.vezana lista – apstraktna struktura podataka čiji su elementi međusobno povezani jednom ili dvjema vezama --> elemente zovemo čvorovima --> prema broju veza među čvorovima liste zovemo jednostrukim ili dvostrukim --> u vezanoj listi svaki čvor poznaje samo svog prvog susjeda .obzirom na broj veza među čvorovima te na definiciju posljednjeg čvora. vagoni predstavljaju čvorove. polje a koje se obično zove past . osim polja next.za listu čiji head pokazuje na null kažemo da je prazna .. tisućice itd.3.) . Vezane liste – jednostruka linearna VEZANA LISTA . u međustanjima se pojavljuju nelogični poreci koji se na kraju ipak srede . lokomotiva predstavlja pokazivač na listu . --> pristup svim čvorovima u listi nije moguć bez ovog pokazivača --> zove se head.SORTIRANJE – DRUGAČIJE – RADIX .

kao rezultat ne vraća ništa --> analogna je metodi Push() koju smo razmatrali kod stoga UNOS NA KRAJ JVL 1) odrediti posljednji čvor u listi 2) usmjeriti posljednjeg na pokazuje na novog *unos na početak i unos na kraj su jednaki u slučaju kad je lista prazna! (head postavljamo na novog) .d.unos će obavljati metoda UnosKraj --> kao parametre prima pokazivače na listu (head) te novog studenta (novi).m).jednom kad je novi student stvoren.--> dodavanje novog elementa nakon što je „kvota“ popunjena --> brisanje postojećeg elementa * u vezanoj listi sve te operacije su znatno jednostavnije * međutim.najzgodnije je to napraviti putem konstruktora --> prvo dobiti sve podatke od korisnika (ili od pozivne metode) --> potom ključnom rječju new stvoriti i inicijalizirati novi čvor: Student novi=new Student(i. pretraživanje unutar liste.unos će obavljati metoda UnosPocetak() --> kao parametre prima pokazivače na listu (head) i novog studenta (novi). izgubili bismo vezu sa svim čvorovima koje se nalaze iza heada . ispis iz liste (svih ili nekih elemenata).kako odrediti posljednji čvor? – šetamo listom i ispitujemo je li sljedbenik trenutnog čvora jednak „null“.razlikujemo 2 vrste unosa unutar liste: ispred određenog čvora i nakon određenog čvora --> možemo ih svesti na jedan: ispred n-tog => nakon (n-1)-og. a to podrazumijeva --> odrediti podatkovna i pokazivačka polja --> pridijeliti memorijski prostor tom novom čvoru .prije samog unosa potrebno je prvo stvoriti novi čvor. ako jest onda je trenutni čvor ujedno i posljednji čvor UNOS UNUTAR JVL LISTE .pronalazak n-tog čvora radi metoda Nakon() --> kao parametre prima: pokazivač na listu (head).temeljne operacije nad listama su: unos u listu. brisanje iz liste (jednog ili više elemenata) --> svaka od ovih operacija može se i hoće razmatrati nad svim vrstama vezanih lista UNOS U VEZANU LISTU . na kraju ili unutar liste nakon nekog određenog čvora . cijeli broj nakon kojeg se novi čvor unosi (n) --> ako rezultat vraća:pokazivač na pronađeni čvor. unos je moguć: na početku liste. a traženog postaviti da pokazuje na novog . kao rezultat ne vraća ništa . null ako nema dovoljno čvorova u listi 10 | SPA . . nakon n-tog => ispred (n+1)-og 1) pronaći traženi čvor nakon kojeg unosimo 2) ako je unos prije prvog --> unos na početak 3) inače: novog postaviti da pokazuje na sljedbenika.smisleno je napraviti opću metodu za unos koja bi onda u sebi sadržavala opcije koje bi korisnik odabrao pri svakom pojedinom unosu UNOS NA POČETAK JVL LISTE 1) usmjeriti novi čvor da pokazuje na prvi čvor u listi 2) usmjeriti pokazivač na listu da pokazuje na novi čvor --> kad bi ovaj poredak bio obrnut. neke operacije nad listama su opet složenije --> pristupi i-tom elementu --> sortiranje svih elemenata .

ako je kriterij za pretraživanje ime ili dob. ako ne ispisati poruku da takvog nema) . tada su stvari bitno složenije --> kojeg studenta ispisati? (prvog u listi s tim imenom.da zadovoljni redni b. što vratiti kao rezultat? BRISANJE .ispis točno jednog čvora obavljat će metoda IspisJednog() --> kao ulazne param. moguće je dobiti više rezultata pretrage -> uzeti u obzir pri njihovu ispisu .ovisno o jedinstvenosti kriterija.ispisati čvorove: od prvog do n/2-tog i od n/2-tog do posljednjeg .unos će obavljati metoda UnosNakon() --> kao parametre prima: pokazivač na listu (head). redni broj čvora koji se ispisuje. ispis liste po pola ISPIS JEDNOG . ispisati podatke prvog čvora .pomicati oba pokazivača sve dok brzi ne dođe do null .pod brisanjem čvora iz liste podrazumijevamo: --> uklanjanje čvora iz liste 11 | SPA . ukoliko je n jednak 0 pozvati funkciju UnosPocetak() .pozivan metoda dužna je: osigurati da se ne proslijedi negativan broj.uvesti dva pokazivača (brzi i spori) i oba usmjeriti na prvi čvor --> spori pokazivač pomicati za po jedan čvor prema kraju liste --> brzi pokazivač pomicati za po dva čvora prema kraju liste . bool vrijednost ako se ne koristi .ukoliko je lista prazna.ukoliko je lista neprazna.podrazumijeva: ispis jednog čvora.preći na idući čvor i ponavljati postupak sve dok ne dođemo do kraja ISPIS LISTE PO POLA – DULJINA . ne i njegov redni broj --> ako je >0 tada nam je bitno dodatno još ispisati i redni broj ISPIS CIJELE LISTE .unos nakon podrazumijeva: *provjeru rednog broja kojeg korisnik unosi *unos moguć najranije od nultog *unos moguć najdalje do nakon zadnjeg ISPIS . tada su stvari jednostavne --> učitati MB sa tipkovnice. kao rezultat ne vraća ništa .ispisati čvorove: od prvog do sporog i od sporog do kraja .u slučaju neparnog broja jedna je polovica očito dulja PRETRAŽIVANJE 1) utvrditi kriterij za pretragu 2) pronaći traženi čvor 3) vratiti pokazivač na njega . pokazivač na novog studenta (novi) --> kao rezultat vraća: ništa ako se koristi pomoćna metoda Nakon(). prošetati kroz listu i utvrditi postoji li takav MB (ako postoji ispisati čvor s tim mb-om.u slučaju neparnog broja jedna je polovica očito dulja ISPIS LISTE PO POLA – BRZI I SPORI POKAZIVAČ . sve u listi s tim imenom). . ispisati poruku o tome .parametar redni_broj_čvora ima dvostruku ulogu --> ako je 0 tada naznačujemo kako nas zanima samo ispis tog čvora.rezultat pretrage je null ili traženi čvor .ako je kriterija za pretraživanje matični broj. ispis svih čvorova u listi.odrediti ukupan broj čvorova u listi – n . prima: čvor koji se ima ispisati.

hash tablice) MODULO – ostatak pri dijeljenju.ovo je nedovoljno budući da ključ neće uvijek biti integer već i string .funkcija h još se zove i hash funkcija HASH FUNKCIJA . posljednji čvor u listi.funkcija koja različite ključeve K pretvara u različite indekse tablice naziva se savršenom hash funkcijom .taj dio (ključ) može biti broj. (index – mjesto u nizu na koje se smješta podatak. pomoću funkcije h(K) transformira u vrijednost koja predstavlja indeks tablice (niza) u koju se podatak P ima spremiti .postaviti head na sljedbenika prvog čvora BRISANJE POSLJEDNJEG ČVORA U LISTI 1) pronaći pretposljednji čvor u listi 2) postaviti ga da pokazuje na novog BRISANJE UNUTARNJEG ČVORA PREMA KRITERIJU 1) pronaći prethodnika traženog čvora 2) postaviti prethodnika da pokazuje na sljedbenika traženog čvora BRISANJE SVIH ČVOROVA PREMA KRITERIJU . sve čvorove unutar liste prema istom kriteriju BRISANJE PRVOG ČVORA U LISTI . string.brisati je moguće: prvi čvor u listi. h(K)=K mod T --> primarni nedostatak ove metode je što se uzastopni ključevi preslikavaju u uzastopne hash vrijednosti --> često se koristi kada se malo zna o ključevima .također. ali i neki drugi struct .funkcija najčešće djeluje nad jednim dijelom složenog tipa podataka (structa) .ovisno o postojanju kriterija sve dok je lista neprazna *ako brišemo bez kriterija --> ponavljati postupak brisanja prvog čvora u listi *ako je kriterij bitan --> ponavljati postupak brisanja čvora prema kriteriju --> moguće je spremiti mb-ove upitnih čvorova u pomoćni niz koji se proslijedi metodi za brisanje 4. a – vrijednost po kojoj hashiramo. Hash tablica RASPRŠENO ADRESIRANJE .ili hashiranje – tehnika kojom se dani ključ K koji predstavlja dio ili cijeli podatak P.tablica se još zove i hash tablica pri čemu se elementi tablice zovu džepovi .ključ % N.ciljevi hash funkcije jesu rasporediti elemente u hash tablici: proporcionalno. slučajno. korištenjem operacije modulo (%) ključevi kojim ima mnogo su stjerani u mali prostor 12 | SPA . čvor unutar liste prema kriteriju.najjednostavnija hash funkcija: int index=a. ravnomjerno .--> oslobađanje memorije koju je taj čvor zauzimao za nas radi VS po prestanku izvođenja programa .dobru hash funkciju odlikuju: --> mali trošak računanja --> determinizam (isti ulaz -> isti izlaz) --> jednoznačnost (vjerojatnost generiranja svake izlazne vrijednosti otprilike jednaka) . ključ – broj elemenata niza tj.

ovo hashiranje je vrlo pogodno kada su ključevi maleni. a svode se na: poboljšanje hash funkcije. modifikaciju hash tablice -> ti se načini zovu: tehnike razrješavanja kolizije METODA MNOŽENJA 1) odabrati konstantu A takvu da je 0<A<1 2) pomnožiti ključ K sa A 3) izdvojiti mantisu broja K*A 4) pomnožiti rezultat prethodnog koraka s T te izračunati: METODA SLAGANJA 1) particionirati ključ na na dijelova k1. vrlo učinkovit algoritam 1-PO-1 HASHIRANJE KOLIZIJA – MODIFIKACIJA HASH TABLICE . ali ovaj ima bolju distribuciju) SHIFT-ADD-XOR HASHIRANJE . stoga ako tablica ima 1000 džepova koji se mogu adresirati.k2.kada se dogodi kolizija.umjesto zbrajanja byteova kao kod aditivnog hashiranja. no koriste se druge konstante te zbrajanje umjesto preslagivanja. gdje se pokazuje boljim od ostalih hashiranja .broj znamenaka svakog dijela ključa ovisi o veličini hash tablice.kako se 2 podatka ne mogu pohraniti na istoj lokaciji..izumio ga je Bernstein.umjesto jednostavnog slaganja svakog bytea unosa u unutarnje stanje.modifikacija je u tome što umjesto zbrajanja koristimo preslagivanje pomoću XOR fukcije (nije široko rasprostranjena jer je algoritam dobar i bez modifikacije. za njihovo adresiranje su potrebne 3 znamenke – svaki dio ki (osim zadnjeg) stoga mora imati 3 znamenke . potrebno je pronaći način kojim se može riješiti problem kolizije.. -1) i vrijednost podatka . on se zanemaruje .dvije najčešće metode: otvoreno adresiranje i ulančavanje OTVORENO ADRESIRANJE ..vjerojatno najjednostavniji algoritam za hashiranje ključeva koji su stringovi je zbrojiti vrijednosti i onda na taj zbroj primjeniti operaciju modulo XOR HASHIRANJE .vrlo slično rotirajućem hashiranju. ovo hashiranje koristi preslagivanje unutarnjeg stanja prije slijedećeg unosa BERNSTEIN-TOREK HASHIRANJE .kn tako da svi dijelovi osim posljednjeg imaju jednak broj znamenaka 2) dijelove zbrojiti kako bi se odredila hash vrijednost 3) ako postoji posljednji prijenos. a popularizirao Torek MODIFICIRANO BERNSTEIN-TOREK HASHIRANJE .nastaje kada hash funkcija preslika dva ključa na istu hash vrijednost .prema Dirichletovom principu u jedno mjesto u hash tablicu će završiti 2 ili više podataka (17%71 i 1650%71) KOLIZIJA .postoje 2 vrste slaganja: *shift folding – posložiti ki-ove jedan ispod drugog *boundary folding – posložitit ki-ove oko srednjeg poput presavijanja papira ADITIVNO HASHIRANJE . ovdje se byteovi neprestano slažu kako bi dobili naizgled slučajnu hash vrijednost ROTIRAJUĆE HASHIRANJE .tablica sadrži 2 tipa vrijednosti: indikator (npr.ako se na nekoj adresi nalazi indikator – ta lokacija je slobodna za pohranu vrijednosti 13 | SPA .. otvoreno adresiranje računa novu adresu koristeći testni niz i naredni zapis posprema se na tu adresu .

) . binarno stablo nije poseban slučaj stabla već. iako sličan.djece *binarno stablo – može biti prazno. Stabla .stabla su najvažnija nelinearna struktura u programiranju općenito ..postoje mnoge vrste stablastih struktura podataka. dubina lijevog i desnog podstabla razlikuje najviše za 1 UNOS U UREĐENO BINARNO STABLO 14 | SPA .Tm pri čemu je svaki od tih skupova također stablo. polje itd.za čvorove u uređenom binarnom stablu kažemo da su na istoj razini ako su jednako udaljeni od korijena (korijen je na razini 0. za svaki čvor u njemu.ovdje svaki element hash tablice sadrži pokazivač na vezanu listu koja sadrži sve vrijednosti koje su hashirane na istu lokaciju 5. svaki čvor ima 0. kod stabala čvorovi mogu pokazivati na proizvoljno mnogo sljedbenika .ova definicija je rekurzivna – definirali smo stablo preko stabla .čvorovi na koje pokazuje neki čvor u stablu se zovu njegovom djecom. a on sam njihovim roditeljem BINARNO STABLO .binarno stablo se definira kao konačan skup čvorova koji je: ili prazan ili se sastoji od korijena i elemenata dvaju disjunktnih binarnih stabala (lijevog i desnog) . pa 9..za razliku od vezane liste gdje svaki čvor pokazuje na najviše 2 sljedbenika.u binarnom stablu razlikujemo čvorove: --> korijen – nema roditelja --> list – nema djece --> unutrašnji – nije ni korijen ni list UREĐENO BINARNO STABLO . njegovi unuci na 2 itd.manje i veće su relativni pojmovi.za uređeno binarno stablo kažemo da je balansirano ako se. pa 4.valja naglasiti da iako možda slike na to ukazuju. razlikujemo između lijevog i desnog djeteta ..3. svaki čvor ima 0.ova tehnika se može implementirati koristeći: --> linearno testiranje (provjeravaju se sljedeća polja 1 po 1) --> kvadratno testiranje (provjerava se 1.ako se na nekoj adresi ne nalazi indikator već vrijednost --> pregledava se prva sljedeća slobodna lokacija te se na nju sprema vrijednost --> ako niti jedan džep nije slobodan – tablica se nalazi u stanju preljeva . tada se manje/veće može odnositi: na dob (uređaj na N).za binarno stablo kažemo da je uređeno ukoliko za svaki njegov čvor vrijedi da mu je u lijevoj grani dijete koje je manje od njega.stablo T se definira kao konačan skup jednog ili više čvorova takvih da --> postoji jedan posebno označeni čvor koji se zove korijen --> preostali čvorovi (izuzev korijena) su particionirani u m>=0 disjunktnih skupova T1. uvijek postoji barem korijen. a u desnoj dijete koje je veće od njega .. a nama je najinteresantnija UREĐENO BINARNO STABLO . njegova djeca na 1. a podrazumijevaju uređaj na stablu .) PUTANJA – u uređenom binarnom stablu je skup čvorova počevši od korijena do nekog lista DULJINA PUTANJE – je razina lista u toj putanji +1 DUBINA (VISINA) STABLA – je duljina najdulje putanje . a naziva se još i podstablom ...) ULANČAVANJE . ime (leksikografski u. pa 16.1.. zapravo vrlo različit koncept *stablo – ne može biti prazno.1 ili 2 djece.uređeno binarno stablo je potpuno ako za dubinu stabla (D) i broj čvorova u stablu (N) vrijedi: N=2D-1 .ako čvor predstavlja studenta.2.

a koliko u desnoj --> vratiti zbroj ta dva broja UREĐENO BINARNO STABLO – VISINA .krenuvši od korijena: --> odrediti koliko ima listova u njegovoj lijevoj grani. pri čemu: --> ako čvor nema lijevo dijete.ovaj zanimljiv problem predstavlja pravi izazov --> inteligentno premještanje referenci --> rad sa dvjema strukturama --> znatnu upotrebu rekurzije .rekurzivno pozivamo funkciju Ispis() koja ovim redoslijedom ispisuje čvorove 6.list je čvor koji nema djece .počevši od lista: --> postaviti da mu je razina 1 --> za nadčvor postaviti da mu je razina: --> postupno se vratiti do korijena PRETVORBA U DVCL .. minD --> zamijeniti njegove podatkovne varijable s onima iz minD --> u idućem rekurzivnom pozivu izbrisati minD UREĐENO BINARNO STABLO – LISTOVI .pošto čvor u objema strukturama ima dva pokazivačka polja.provjeravamo je li korijen možda null --> ako jest novi čvor postaje korijen --> ako nije provjeravamo vrijednost novog čvora i ulazimo u lijevu ili desnu granu --> ako nema lijeve/desne grane (null) tu smještamo novi čvor --> postupak ponavljamo dok ne nađemo mjesto za novi čvor ISPIS UREĐENOG BINARNOG STABLA . procedura je kako slijedi --> pronaći najmanji čvor u njegovoj desnoj grani tj.uređeno binarno stablo ne dozvoljava unos duplikata! .kod brisanja čvora iz uređenog binarnog stabla moguće su sljedeće 3 situacije: 1) brišemo čvor koji nema djece 2) brišemo čvor koji ima jedno dijete 3) brišemo čvor koji ima dvoje djece . Pretvorba u DVCL UREĐENO BINARNO STABLO – BRISANJE .pošto smo ograničeni širinom prozora konzole ali ne i visinom.ako brišemo čvor koji ima dvoje djece.ako brišemo čvor koji ima samo jedno dijete -> postavimo ga na to njegovo dijete (bilo ono lijevo ili desno) . ideja o pretvorbi nameće se sama po sebi 15 | SPA . to ćemo ispis modificirati tako da: --> desno dijete bude gore umjesto desno --> korijen umjesto gore bude lijevo --> lijevo dijete bude dolje umjesto lijevo .ova 3 slučaja mogu se svesti na 2. postavljamo ga na njegovo lijevo dijete . postavljamo ga na njegovo desno dijete --> ako čvor nema desno dijete.ako brišemo čvor koji nema djece -> jednostavno ga postavimo na null .visina stabla je broj čvorova u njegovoj najduljoj putanji .

obilazak je uvijek isti: kreni od prvog čvora.u stablu je. Obilasci.7.za stablo kažemo da je balansirano ako za svaki njegov čvor.koristi se za oblikovanje stabla.razlikujemo lijevu i desnu rotaciju BALANSIRANOST . posebice za smanjenje njegove ukupne visine --> ovo za rezultat ima poboljšanje performansama mnogih operacija nad binarnim stablima .stabla se mogu balansirati: pri unosu.rotacije jedan čvor pomiče na gornju razinu. rotacije.počevši s korijenom stabla. a s ciljem utvrđivanja vrijednosti u tom čvoru . posjeti ga. naknadno (upotrebom rotacija) . i tako sve dok ne dođemo do kraja . idi desno) --> inorder – korijen se razmotri nakon lijevog. po širini PRETRAŽIVANJE PO DUBINI . a prije desnog djeteta (idi lijevo.rotacija je operacija na binarnom stablu koja mijenja strukturu ali ne utječe na poredak čvorova . apsolutna razlika u visini njegovog lijevog i desnog podstabla nije veća od 1 . obići čvorove moguće na više načina . idi lijevo.uređeno binarno stablo po svojoj definiciji: --> ne dozvoljava unos duplikata --> u lijevoj grani podrazumijeva čvor „manji“ od korijena --> u desnoj grani podrazumijeva čvor „veći“ od korijena .kako provjeriti je li stablo balansirano?? 16 | SPA . posjeti) PRETRAŽIVANJE PO ŠIRINI . idi desno. a drugog pomiče na donju .ono podrazumijeva da se razmotre svi čvorovi na istoj razini prije prelaska na nižu razinu .obilazak u bilo kojoj strukturi podataka podrazumijeva proces „posjećivanja“ svakog čvora u strukturi točno jednom.još je dodatno dijeli na: --> preorder – korijen se razmotri prije lijevog djeteta (posjeti.u vezanoj listi ili nizu.kako provjeriti za neko binarno stablo je li uređeno? --> ako je minimum lijeve grane veći od trenutnog korijena – ne valja --> ako je maksimum desne grane manji od trenutnog korijena – ne valja --> ako lijevo podstablo nije uređeno – ne valja --> ako desno podstablo nije uređeno – ne valja ROTACIJA . a zgodno je i prvo odrediti visinu/dubinu stabla PROVJERA . posjeti. baš radi prirode same strukture. moguća su 3 različita koraka: *posjetiti čvor *otići do lijevog djeteta *otići do desnog djeteta .ovisno o tome razmatraju li se prvo potomci po dubini (sin/unuk/praunuk) ili potomci na istoj razini (braća) razlikujemo pretraživanje: po dubini. i to najčešće stoga. idi desno) --> postorder – korijen se razmotri nakon lijevog i nakon desnog djeteta (idi lijevo.također podrazumijeva upotrebu pomoćne strukture podataka. balansiranost OBILASCI . pređi na idući čvor.

prvi način za samobalansiranje stabala je izbjeći njegovu prečestu potrebu . no u određenim slučajevima. pojavila se potreba za nečim praktičnijim . bespotrebno se troši velika količina memorije .balansiranju SUBSa može se pristupiti: --> nakon što su svi čvorovi uneseni u stablo --> pri svakom pojedinom unosu/brisanju .ovo je najčešće i slučaj.budući da su SBBS prilično komplicirane strukture podataka.svaki čvor u CC stablu odlikuje se jednim dodatnim bitom koji govori o boji čvora . ali nije uređeno binarno stablo .stabla koje se balansiraju nakon svakog unosa/brisanja zovu se samobalansirajuća stabla .dva najčešća primjera samobalansirajućih stabala su: AVL stabla.standardna uređena binarna stabla (SUBS) su „jednostavne“ strukture podataka koje se mogu pohvaliti složenošću operacija pretrage. Poznati računarci Robert Sedgewick i Leonidas Guibas došli su na ideju kako na jednostavan način apstrahirati SBBS i stvoriti strukturu kod koje je veoma jednostavno razlikovati horizontalne od vertikalnih veza --> čvorovima su dodali boju CRVENO CRNO STABLO .rezultat je struktura zvana B-stablo kod kojeg svaki čvor ima proizvoljno mnogo djece. unosa i brisanja od O(log N) .za stabla kojima je za svaki čvor u stablu apsolutna razlika među visinama lijeve i desne grane najviše 1.budući da sve putanje od korijena do lista sadrže isti broj čvorova. Crveno – crna stabla BALANSIRANOST . iako same boje nemaju nikakvu važnost .u praksi je ovaj zahtjev prilično teško postići. ukoliko ta mogućnost da imaju više djece nije iskorištena tj.8. pa ako su podaci koji dolaze u stablo već sortirani.osnovna ideja SBBS je da čvor može imati horizontalne ili vertikalne veze --> vertikalna veza razdvaja dva različita čvora --> horizontalna veza razdvaja čvorove koji se u B-stablu smatraju istim čvorom .sljedeći način je simetrično binarno B-stablo koje je apstrakcija B-stabla reda 4 --> idejni tvorac je Rudolf Bayer . tada dolazi do problema . SUBS degeneriraju u jednostavne vezane liste sortirane bilo uzlazno bilo silazno . crveno-crna stabla (CC stabla) .ovaj problem nastaje zbog toga što SUBS pohranjuju podatke na način koji bi se mogao podrazumijevati sortiranim.za onakva degenerirana stabla kažemo da su nebalansirana .CC stablo je samobalansirajuće uređeno binarno stablo koje karakteriziraju sljedeća pravila: 17 | SPA . svi listovi su na istom nivou u B-stablu --> ovo je savršeno balansirano stablo. pri čemu je red B-stabla broj djece koju čvorovi mogu imati . kažemo da su balansirana .tradicionalno se uzimaju crvena i crna boja.1978.operacije nad stablom (koje ima korijen i svaki idući ima samo lijevo/desno dijete linearno) su jako skupe --> složenost raste s O(log N) na O(N) budući da je sada stablo de facto linearna lista --> puno je „zahvalnija“ situacija kada čvorovi imaju oba djeteta . no s druge strane. ako čvor od potencijalno 10 djece ima samo jedno.B-stabla jesu učinkovita što se samobalansiranja tiče jer za razliku od SUBSa imaju bitno više djece po čvoru. stoga se često pribjegne alternativnom i blažem uvjetu da visina stabla bude najviše log2N .

ako je novi čvor crven. ali kasnije olakšava provjeru boje danog čvora . stablo nije CC . Ako to vrijedi. dvostruke .ako je novi čvor crn. ali ako jest.u klasi čvor nužno je i dovoljno dodati samo jednu varijablu koja predstavlja boju čvorova. to je uvijek potrebno spustiti se do razine lista . tada se crno pravilo uvijek krši. a 0 crnu boju .ako uneseni/uklonjeni čvor remeti crveno ili crno pravilo. mora biti jednak broj crnih čvorova (crno pravilo) 3) crveni čvor ne smije imati crveno dijete (crveno pravilo) .unos i brisanje iz stabla su prilično složene operacije baš zbog uvjeta koje stablo čine crveno-crnim.pošto se unos u UBS odvija rekurzivno. Izvorno se koristi tip char gdje 1 predstavlja crvenu.1) listovi imaju „nepostojeću“ djecu koja su po definiciji crna – zovemo ih vanjskim čvorovima 2) na svakoj putanji od korijena do bilo kojeg vanjskog čvora.ovo je zapravo jako korisno budući da se pri rekurzivnom povratku možemo riješiti prekršenih pravila.ta metoda mora provjeriti: --> je li stablo uopće uređeno.kod unosa je potrebno koristiti rotacije u željenom smjeru i to: jednostruke. U protivnom to znači da stablo nije bilo CC i prije unosa novog čvora KAKO POPRAVITI CRVENI PREKRŠAJ? 18 | SPA . Ukoliko nešto od gornjeg nije zadovoljeno. tada je stablo CC stablo pri čemu mu visina ne može biti niža od log(N+1) ali niti viša od 2 log(N+1) . SLUČAJ – tata od N(5) je crn * crveni uvjet vrijedi * crni uvjet nije ugrožen budući da je N crven (po defaultu) .pri unosu u CC stablo postavlja se pitanje – bojamo li novi čvor u crveno ili crno? . to malo olakšava operacije CRVENO CRNO STABLO – UNOS .zgodno je imati metodu koja će provjeriti je li UBS zaista CC stablo . ali dogovorno se prvi čvor unesen u stablo boji crno) * sva pravila su zadovoljena 2. SLUČAJ – N(10) dodajemo kao korijen * N obojamo crno (korijen ne mora biti crn. je li prekršeno crveno pravilo. tada se crveno pravilo možda krši. na raspolaganju stoje 2 tehnike: --> zamjena boja danog i/ili susjednih čvorova --> rotacija susjednih čvorova oko danog čvora .moguće je koristiti i tip bool koje je memorijski malo skuplji.unos u CC stablo odvija se u 2 faze: 1) standardni unos u uređeno binarno stablo novog čvora kojeg „po defaultu“ bojimo crveno 2) promjena odnosa u stablu ovisno o bojama susjednih čvorova . testiraj ima li crveno dijete --> valja uočiti kako je moguće da je samo jedno od djece crveno. a ostatak algoritma se fokusira na popravljanje tog prekršaja bez kršenja crvenog pravila .valja naglasiti kako korijen ne mora nužno biti crn. no brzina pristupa čvorovima CC stabla višestruko nadoknađuje muku oko balansiranja . a ionako se moramo vraćati KAKO ISPITATI JE LI SE DOGODIO CRVENI PREKRŠAJ? --> ako je bilo koji čvor na putanji crven.svi algoritmi koji osiguravaju balansiranost CC stabla ne smiju prekršiti nijedno od ovih pravila. a ostatak algoritma se fokusira na popravljanje tog prekršaja bez kršenja crnog pravila 1. je li prekršeno crno pravilo --> i tako za svako podstablo u stablu sve do listova.

SLUČAJ .pri unosu smo dodavali novi crveni čvor koji je možda izazivao kršenje crvenog pravila koje smo kasnije razrješavali kako bi se pojavilo .kod standardnog uređenog binarnog stabla.brisanje je bitno kompliciranije od unosa! .potrebno je još malo više truda -> dvostruka rotacija CRVENO CRNO STABLO – BRISANJE .ako je brat danog čvora crven tada njihov roditelj mora biti crn => jednostavno im zamijenimo boje .dodatno bonus je da rotacija ne mijenja „crnu“ visinu 3. SLUČAJ .1.međutim kako je jedan crni čvor postao crven. problem brisanja se svodi 19 | SPA . riskiramo prekršaje na višim razinama 2. a ne lijevo dijete? . pri brisanju čvora koji ima dva djeteta: --> pronađemo maksimalni element u lijevoj (minimalni element u desnoj) grani --> premjestimo njegovu vrijednost u čvor kojeg brišemo --> potom jednostavno obrišemo taj čvor od kojeg smo kopirali vrijednost .do sada je uvijek lijevo dijete bilo crveno. ali ako brišemo crnog – problemi! .ako brat danog čvora nije crven.pri brisanju nemamo taj luksuz brisanja po bojama – ako brišemo crvenog super. a to je kršenje crnog pravila .potrebno je malo više truda -> rotacija . trik sa zamjenom boja neće upaliti jer bismo tada u jednoj grani dobili jedan crni čvor viška.budući da kopiranje vrijednosti ne krši ni crveni ni crni uvjet. SLUČAJ . no što ako je crveno desno.

jer je onda potrebno rebalansiranje 1. SLUČAJ . tada jednostavno zamijenimo boju roditelja i brata brisanog 2.problemi se javljaju kada su i čvor za brisanje i njegovo dijete oboje crni.i dalje postoji mogućnost kršenja crnog pravila budući da smo crnu visinu u lijevoj grani smanjili s 3 na 2 .dakle.na problem brisanja čvora s najviše jednom dijete-granom --> ništa ne mijenja na stvari je li to čvor kojeg smo originalno htjeli brisati ili čvor od kojeg smo kopirali vrij. . možemo pretpostaviti da brišemo čvor s najviše jednom dijete-granom: *ukoliko su jedina djeca čvora listovi --> neka neko od njih bude dijete *ukoliko brišemo crveni čvor --> zamijenimo ga njegovim djetetom koje se zasigurno crno (zašto?) *ukoliko brišemo crni čvor koji ima crveno dijete --> zamijenimo ga s tim djetetom koje moramo obojati crno(zašto?) . desni crven.lijevi nećak crn.ako je roditelj brisanog ipak bio crven. SLUČAJ .lijevi nećak crven. desni nećak i roditelj svejedno (jednostruka rotacija) . a roditelj svejedno (dvostruka rotacija) 20 | SPA .

i na prvi pogled unos je trivijalan . a jedini desni sin tog desnog nećaka je crven CRVENO CRNO STABLO – ZAKLJUČAK .brat je crven.CC stabla se smatraju jednostavnijim od AVL stabala koji su im izravni konkurenti. i nije tako trivijalno . desni nećak mu je crn.brat je crven. a sin tog desnog nećaka crven (2 ili 3 rotacije???) .brat je crven. SLUČAJ .kada ih koristiti? – ako ulazni podaci imaju serije sortiranih vrijednosti. onda su CC stabla prilično dobar izbor 9. Grafovi 21 | SPA . SLUČAJ . pogotovo kad se razmotre baš svi slučajevi.3. a nećaci su mu crni (moraju biti – zašto?) 4.brisanje. desni nećak mu je crn.

postao je persona non grata u Konigsbergu .bridovi su određeni vrhovima koje spajaju..y) – dodaje brid od vrha x do vrha y ukoliko on već ne postoji * brisi(G.x) – daje popis svih vrhova u grafu G koji su povezani s vrhom x * dodaj(G.u gradu Konigsbergu stanovnici su voljeli šetati preko svakog od sedam mostova preko rijeke Pregel i njenih dviju ada-> htjeli su znati je li moguće doći od jedne do druge obale prelaskom preko baš svakog mosta.x.y.g.neka vrhovi A. 2) matrica susjedstva LISTA SUSJEDSTVA 22 | SPA . kapacitet (ovisno o problemu) .x.graf (u računarstvu) je apstraktna struktura podataka kojoj je cilj vjerno predstaviti matematički koncept grafa .PRIKAZ . rubnim točkama. na nekom društvenom okupljanju --> ako je povezanost osoba A i B definirana rukovanjem tada za graf kažemo da je neusmjeren budući da su mu bridovi neusmjereni --> ako je povezanost osoba A i B definirana poznavanje tada za graf kažemo da je usmjeren budući da poznavanje osobe nije simetrična relacija . Ti se objekti zovu vrhovi (čvorovi ili točke).bridovi mogu biti usmjereni ili neusmjereni .postoje dvije temeljne varijante prikaza grafa u memoriji: 1) lista susjedstva.y) – testira postoji li brid od vrha x do vrha y * susjedi(G.graf (u matematici) je reprezentacija skupa objekata u kojem su neki objekti međusobno povezani. rubnim vrhovima .bridove u usmjerenom grafu zovemo i LUKOVIMA – za dva luka kažemo da su uzastopna ako je kraj jednog luka početak drugog luka . a veze koje spajaju neke parove vrhova zovu se bridovi KONIGSBERŠKI MOSTOVI . cijena.za graf kažemo da je TEŽINSKI ukoliko je svakom njegovom bridu pridružena vrijednost (težina) – npr.y) – uklanja brid od vrha x do vrha y ukoliko on već postoji * dohvati_vrh(G.. B skup bridova.. za mostove je jedino važno koje točke spajaju -> spoji točke s linijama.C. ti vrhovi se još zovu i rubovima. pri čemu su bridovi B dvočlani podskupovi skupa V .u grafu može postojati vrh koji nije povezan ni sa jednim drugim vrhom RED GRAFA je kardinalni broj od V – broj vrhova VELIČINA GRAFA je kardinalni broj od B – broj bridova STUPANJ VRHA je broj bridova koji izviru iz tog vrha – ukoliko postoji brid koji spaja vrh sa samim sobom.x) – vraća vrijednost vrha x * postavi_vrh(G.x.u svom najopćenitijem smislu.temeljne operacije: * susjed(G.C.a) – postavlja vrijednost brida od vrha x do vrha y na a GRAFOVI . predstavljaju osobe A. ali bez da ijedan most prijeđu dvaput .za 2 brida u grafu kažemo da su susjedna ako dijele zajednički vrh .x.B.prvo što je Euler napravio je uklonio sve „viškove“ i „smetnje“: oblik i veličina kopna je nebitna -> pretvori ih u točke.a) – postavlja vrijednost vrha x na a * dohvati_brid(G.B) gdje je V skup vrhova.x. riješio problem davši negativan odgovor. graf G je: uređeni par G=(V..B.x. prikaz toka rijeke nije nužan za rješavanje GRAFOVI . on se broji dvaput SUSJEDSTVO – za vrhove V1 i V2 koje spaja brid b kažemo da su susjedi . time je postigao: --> udario je temelje današnjoj teoriji grafova..y) – vraća vrijednost pridruženu bridu od vrha x do vrha y * postavi_brid(G.za graf kažemo da je POTPUNO ako je svaki par vrhova spojen barem jednom bridom .veliki matematičar Leonhard Euler je 1735.. duljina.

ostalih vrhova u grafu koji su s ovim spojeni barem jednim bridom *svi ostali vrhovi tvore listu MATRICA SUSJEDSTVA . ali i za izjave: --> upotreba GOTO naredba izrazito je loša i nepoželjna u programiranju --> podučavanje BASIC-a bi se trebalo tretirati kao kazneno djelo. a beskonačno za sve ostale 2) Označi sve vrhove kao neposjećene. Napravi skup neposjećenih vrhova koji se sastoji od svih vrhova u grafu osim početnog. označi ga kao posjećenog te izbaci iz skupa neposjećenih vrhova. listi treba bitno više .sve ove.bridovi predstavljaju: udaljenost u kn. 4) Jednom kada su razmotreni svi susjedi trenutnog vrha. Dodavanje udaljenosti susjedu ne rezultira njegovom posjećenošću.. vodeći računa da ako bi nova udaljenost bila veća od trenutne da se onda ona ne uzima u obzir.najpoznatiji algoritam za određivanje najkraćeg puta u grafu je onaj nizozemskog računarca Edsgera Wybea Dijkstre (1930-2002) *zaslužan je za mnoge doprinose računarstvu poput reverzne poljske notacije.problem najkraćeg puta je iznimno važan s aspekta računarstva. a primjenjiv je u svim sferama ljudskog života --> putovanje od mjesta stanovanja do mjesta zaposlenja --> kretanje podataka od vašeg računala do nekog servera preko međuservera --> dostavno vozilo treba obaviti dostave na više adresa => kraći put.povezanost dvaju vrhova očituje se u tome što: --> ako su vrhovi Vi i Vj povezani – na mjestu ij u matrici je 1 --> ako vrhovi Vi i Vj nisu povezani – na mjestu ij u matrici je 0 PREDNOSTI I NEDOSTACI . udaljenost u ms . Postavi početni vrh kao trenutni.ukoliko je graf rijedak. a i mnoge druge primjene svode se na traženje najkraćeg puta u grafu .svaki element niza sastoji se od: vrha. 3) Za trenutni vrh razmotri sve njegove neposjećene susjede i izračunaj njihovu udaljenost od početnog vrha. lista susjedstva troši manje prostora --> prostor za prikaz nepostojećih bridova .graf sa n vrhova je prikazan kao matrica od n x n elemenata . 23 | SPA .vrhovi u grafu predstavljaju: raskrižja. servere. Jednom posjećeni čvor se više nikada neće razmatrati te je njegova udaljenost konačna i minimalna.za n čvorova u grafu. manja potrošnja goriva . adrese . matrici susjedstva je potrebno n2/8 byteova .određivanje postojanja veze među vrhovima --> u listi susjedstva traje proporcionalno minimumu stupnja vrhova koji se razmatraju --> u matrici susjedstva je gotovo trenutačno 10. budući da osakaćuje um to te mjere da se više ne oporavi ALGORITAM SE SASTOJI OD SLJEDEĆIH 6 KORAKA: 1) Svakom vrhu dodijeli udaljenost: 0 za početni vrh.pronalazak svih vrhova susjednih danom vrhu --> u listi susjedstva podrazumijeva šetnju jednom listom --> u matrici susjedstva podrazumijeva razmatranje čitavog retka .graf je prikazan kao niz elemenata .matrica susjedstva troši samo jedan bit po elementu. Najkraći put – Dijkstrin algoritam NAJKRAĆI PUT .

Udaljenost vrha A postavljena je na 0. a njihova udaljenost jednaka je zbroju udaljenosti od D te same udaljenosti od D do A. Sve udaljenosti preko H su veće od trenutnih pa se nijedan vrh ne ažurira.algoritmi za ubacivanje i brisanje u skip listama su mnogo jednostavniji i znatno brži nego ekvivalentni za balansirana stabla . Pošto je E susjed i od B i od D. Susjedi od D jesu E i G. F je posjećen. 8.možemo ju koristiti gdje i balansirana stabla . B je posjećen. NAJKRAĆI PUT – ALGORITAM Traži se najkraći put u ovom usmjerenom grafu (na slici) od vrha A do vrha J: 1. nižu vrijednost. Udaljenost od F je veća preko E nego preko C pa se ne ažurira. Njegov jedini susjed jest F. Zatim se razmatraju susjedi vrha B. Konačno. Njegovi susjedi su J i I. Sljedeći na redu je vrh F. Njihova udaljenost je udaljenost od čvora A. 7. posljednji je vrh I. 11. D je posjećen. 6. Udaljenost od J je veća no trenutna pa se ne ažurira. I je posjećen. Skip liste . 6) Postavi neposjećeni vrh s najmanjom udaljenošću na trenutni vrh i nastavi s korakom 3. Algoritam bi se mogao prekinuti ovdje jer je do svih ostalih vrhova dulje no do J. 4. a to su C i E. Njegovi susjedi su G i I. 9. Njegovi susjedi su F i J. Susjedi vrha A su B i D. Sljedeći na redu je vrh E.5) Ako je odredišni vrh označen kao posjećen ili ako je najmanja udaljenost među vrhovima u skupu neposjećenih beskonačno. J je posjećen. 2. Sada se prvo razmatraju susjedi čvora D.one koriste vjerojatnost balansiranja odnosno uravnoteženosti prije nego točno provedenu balancu . budući da među susjedima od A on ima najmanju udaljenost. Sljedeći na redu je vrh J. 3. Njegovi susjedi su H i J. gdje svaki čvor posjeduje neku korisnu informaciju i prosljeđuje na sljedeći čvor u listi . Njegovi susjedi jesu F i H. H je posjećen. to se njegova udaljenost ažurira. C je posjećen. Sada se razmatra vrh C jer je njegova udaljenost među neposjećenim vrhovima najmanja. Sljedeći na redu je vrh H. F je posjećen. a put do E preko B je kraći to se udaljenost od A do E postavlja na novu. Sve udaljenosti preko I su veće od trenutnih pa se nijedan vrh ne ažurira.klasična struktura linearne liste (link liste) se sastoji od čvorova.skip lista je struktura koja je proširenje linearne liste s ciljem ubrzavanja procesa pretrage . tada je algoritam gotov. a kako je put do F kraći preko J.čvorovi su cijeli vrijeme poredani u sortiranom redu 24 | SPA . 5.

stabla bi izvodila dobro s visokom vjerojatnošću za bilo koji unesen niz) – međutim.kada je lista pohranjena u sortiranom poretku i kad svaki čvor ima pokazivač prema čvoru koji je na 2.skip liste su probabilistička alternativa binarnim stablima --> one su balansirane tako da imaju slučajan broj generatora --> iako imaju u najgorem slučaju lošu izvedbu.operacija INSERT – pridružuje određeni ključ s novom vrijednošću tj. dok drugi ide na kraj liste i ima vrijednost koja je veća od vrijednosti bilo kojeg čvora u listi . ali ne zahtijevaju da je ubacivanje slučajno ALGORITMI SKIP LISTI .razina liste – je trenutna maksimalna razina u listi (ili je 1 ako je lista prazna) . nijedan uneseni niz ne rezultira izvedbi u najgorem slučaju (malo je vjerojatno da će skip lista strukture podataka biti znatno nebalansirana) . mjestu ispred u listi. ukazuje na sljedeći čvor sloja i i višeg --> ubacivanja i brisanja bi zahtijevala samo lokalne modifikacije.skip liste imaju svojstva balansa slična onima kod stabala pretrage izgrađenih slučajnim ubacivanjem. dodajemo 2 karakteristična čvora – jedan od njih ide na početak liste i ima vrijednost koja je manja od vrijednosti bilo kojeg čvora u listi. čiji je sloj izabran na slučajan način pri samom ubacivanju čvora i ne uzimajući u obzir broj elemenata u strukturi podataka . ali bi pri ubacivanju i brisanju bila nepraktična *čvor koji ima k pokazivača prema naprijed naziva se level k čvor .operacija SEARCH – vraća sadržaj vrijednosti pridružen željenom ključu ili failure ako ključ nije prisutan . koji odabiremo slučajno kada ubacujemo čvor nikada se ne mijena SKIP LISTA – link lista koja ima dodatne pokazivače koji preskaču preko prijelaznih (srednjih čvorova) .moguće je da je vrijednost novog čvora manja od vrijednosti prvog čvora liste. broj čvorova koje trebamo ispitati može biti reduciran na na način da poduplamo broj pokazivača -> ovakva struktura može se koristiti za brzo pretraživanje.u svakom pojedinom čvoru ne trebamo pohraniti njegovu razinu jer su one sačuvane u odgovarajućoj konstanti MaxLevel . pa u tom slučaju novi čvor ubacujemo na početak liste .kad dodajemo novi čvor.čvor razine i ima i prema naprijed pokazivača indeksiranih s 1/i .binarna stabla dobro izvode kada su elementi umetnuti slučajnim poretkom (kad bi bilo moguće ubaciti na slučajan način permutiranu listu podataka. ali s istim proporcijama? – i-ti čvorni pokazivač umjesto da pokazuje na 2i-1 čvorova unaprijed.svaki element je predstavljen čvorom.za lakše rukovođenje.operacija DELETE – briše određeni ključ . ubacuje ključ ako već nije prisutan . ne trebamo ispitati više od (n/2)+1 čvorova (ako dodamo svakom četvrtom čvoru pokazivač prema idućem četvrtom čvoru trebamo ispitati ne više od (n/4)+2 čvorova) --> ako svaki 2i-ti čvor ima pokazivač prema sljedećem 2i-tom čvoru.zaglavlje liste – ima pokazivače prema naprijed u razinama 1 kroz MaxLevel – u zaglavlju pokazivači prema naprijed u razinama višim od trenutne maksimalne razine liste 25 | SPA .. mjesto na koje ga dodajemo određujemo tako da ga se uspoređuje sa svim ostalim čvorovima u listi dok ne pronađemo čvor koji predstavlja kraj liste (u tom slučaju novi čvor ide na kraj liste) ili dok ne pronađemo čvor koji predstavlja kraj liste (u ovom slučaju novi čvor ubacujemo prije čvora s najvećom vrijednošću) .što bi se dogodilo da su slojevi čvorova izabrani slučajno. sloj čvora. slučajno permutirano ubacivanje je nepraktično --> algoritmi za balansirana stabla reorganiziraju stabla na način da operacije zadržavaju određene uvjete balansa i da osiguraju dobru izvedbu .

onda se pretraga prebacuje na jedan sloj dolje i nastavlja prema naprijed --> ovaj postupak nastavljamo sve dok se ne pronađe ključ kojeg tražimo.umetanje započinje pretraživanjem mjesta u skip listi gdje će se novi ključ/par vrijednosti ubaciti *algoritam koji koristimo za pretraživanje mjesta se razlikuje u jednoj stvari od klasičnog algoritma za pretragu: dodan je niz čvorova kako bi se vodio računa o mjestima u skip listi gdje se pretraga prebacuje na donji sloj -> ovo se radi zato što će pokazivači od tih čvorova trebati biti reorganizirani kada se u listu umetne novi čvor . onda se pretraga nastavlja ili dok ne dođemo do kraja liste ili dok ne pronađemo ključ čija je vrijednost veća od vrijednosti onoga koje tražimo) • UMETANJE ELEMENATA .nakon što je pretraga završila.jednom kad je sve ono napravljeno. novi čvor je zapravo kreiran i spojen sa skip listom u sljedećoj „for petlji“ -> ta petlja od najdonjeg sloja skip liste pa do sloja novog čvora dodjeljuje veze prema unaprijed u tom svom putu --> prilično slično reorganizaciji veza u link listama kada se ubacuje novi čvor osim što kod skip listi imamo nizove veza koji moraju biti re-dodijeljeni umjesto samo jedne ili dvije • BRISANJE ELEMENATA . onda brišemo čvor čija je vrijednost upravo jednaka tom znaku .brisanje koristi isti algoritam kao i ubacivanje. traži zadnju stanicu prije tražene.pretraživanje ključa unutar skip liste započinje od zaglavlja u cjelokupnom sloju u listi i nastavlja dalje tako da uspoređuje ključeve čvorova s ključem kojeg tražimo --> ako je ključ čvora manji od ključa kojeg tražimo. izvršava se provjera da se ustanovi da li ključ u čvoru gdje je pretraga stala. veze prema unaprijed u skip listi bi trebale ukazivati na ovaj novi čvor umjesto na NIL čvor . randomLevel algoritmom se pronalazi njegov sloj (ako je vrijednost tog sloja veća od vrijednosti cjelokupnog sloja cijele skip liste.da bi umetnuli novi čvor. ono vodi računa o mjestu u listi gdje se pretraga prebacila u donji sloj --> ako je pronađen znak koji se treba izbrisati. ako je taj ključ uopće sadržan u listi (ako on ne postoji u listi. čvor je izbrisan --> jedina stvar koja nam preostaje jest ažurirati trenutni cjelokupni sloj liste ako je 26 | SPA . vrijednost toga ključa je zamijenjena s novom vrijednošću --> ako ključevi ne odgovaraju.pokazuju na NIL • PRETRAŽIVANJE ELEMENATA *kreće od najbrže razine.nakon što je pronađen ključ. veze u update nizu od cjelokupnog sloja skip liste pa do novog sloja su dodijeljene tako da ukazuju na zaglavlje) -> ovo je napravljeno zato što ako novi čvor ima vrijednost veću od vrijednosti trenutnog cjelokupnog sloja skip liste. „for petlja“ započinje od donjeg pa do gornjeg sloja u skip listi dodjeljujući čvorove s vezama u poredak za brisanje obzirom na čvorove koji dolaze nakon --> sličan postupak kao u link listama.prvi dio ovog algoritma isti je kao algoritam pretrage osim što ovaj koristi update[] niz kako bi zadržao vezu među čvorovima gdje se pretraga prebacuje na donji sloj . osim što ovdje imamo nizove likova prema čvorovima unaprijed koji moraju biti vođeni . kreira se novi čvor koji se ubacuje u listu . odgovara traženom ključu --> ako jest. spušta se na stanicu koja povezuje te 2 stanice .sljedeće. onda se pretraga nastavlja dalje u istom sloju --> ako je ključ čvora jednak ili veći od ključa kojeg tražimo.

izvršitelji se općenito slažu da su skip liste znatno jednostavnije za izvođenje nego što su algoritmi za balansirana ili samopodešavajuća stabla .potrebno ZAKLJUČAK *za većinu aplikacija.skip liste su jednostavne strukture podataka koje možemo u gotovo svim aplikacijama koristiti umjesto balansiranih stabala .skip liste su u globalu brže nego klasično implementirani algoritmi balansiranih stabala 27 | SPA . izvođenje i modificiranje (implementacija balansiranih stabala je zahtjevan zadatak i zato ih se rijetko koristi) .balansirana stabla mogu napraviti sve što i skip liste i pritom imaju zadovoljavajuće vrijeme izvođenja u najgorem slučaju za razliku od skip listi .algoritmi skip listi su jednostavni za implementaciju.

Sign up to vote on this title
UsefulNot useful