Professional Documents
Culture Documents
002
002
Algoritam je tano definisana raunarska procedura koja pretpostavlja neke vrijednosti kao ulaz i proizvodi neke vrijednosti kao izlaz. Slijedi nekoliko osnovnih algoritama:
1. Zamjena vrijednosti dvije promjenljive Ako su date dvije promjenljive, zamijeniti njihove vrijednosti tako da nova vrijednost svake promjenljive bude stara vrijednost druge promjenljive. Potrebna nam je pomona promjenljiva koja e uvati staru vrijednost jedne od promjenljivih prije nego to u tu promjenljivu upiemo vrijednost druge promjenljive.
Swap(x, y) z=x; x=y; y=z; return x, y; 2. Maksimalni element niza Neka je dat niz od n elemenata: A = A(1), A(2), ..., A(n). Potrebno je nai najvei element u tom nizu. Prvo pretpostavimo da je prvi element najvei, a zatim provjeravamo sve ostale elemente tako to ispitujemo da li je aktuelni element vei od dosada pronaenog najveeg elementa. Ako jeste, taj element postaje najvei element. FindMax(A) m = A(1); j=1; i=2; while i<=n do if m <A(i) then m = A(i); j = i; i = i + 1; return j;
3. Sortiranje niza Navodimo nekoliko algoritam koji nam pokazuju kako da sortiramo niz od n elemenata u neopadajui poredak. Bubble sort Zamislimo da je dati niz postavljen vertikalno. Ideja algoritma se sastoji u tome da elementi niza sa malim vrijednostima, tj. elementi koji su laki po teini isplivaju na vrh. i=1 i=2 i=3 i=4 i=5 6 6 6 6 15 13 15 8 8 8 25 13 15 12 12 8 25 13 15 13 12 8 25 13 15 6 12 12 25 25 Napomena: Crvenom bojom su oznaeni oni elementi niza koji su ve sortirani, dok su utom bojom osijeneni elementi niza koji isplovljavaju navie. BubbleSort (A) for i = 1 to n-1 do for j = n downto i + 1 do if A(j) < A(j -1) then Swap(A(j), A(j 1)); return A; Sortiranje umetanjem (insertion sort) Rad ovog algoritma se sastoji u tome da je poetni dio niza ve sortiran . U jednom prolasku algoritam uzima prvi element iz nesortiranog dijela i umetne ga na pravo mjesto u sortiranom dijelu pri emu dolazi do pomjeranja nekih elemenata za jedno mjesto., a duina nesortiranog dijela se smanjuje za jedan. Poetni niz: Nakon 1. prolaska: Nakon 2. prolaska: Nakon 3. prolaska: Nakon 4. prolaska: Nakon 5. prolaska: Nakon 6. prolaska: Nakon 7. prolaska: 20 5 5 4 3 3 3 3 5 20 17 5 4 4 4 4 17 17 20 17 5 5 5 5 4 4 4 20 17 17 17 17 3 3 3 3 20 20 20 20 35 22 37 35 22 37 35 22 37 35 22 37 35 22 37 35 22 37 22 35 37 22 35 37 39 39 39 39 39 39 39 39
Napomena: utom bojom je oznaen prvi element iz nesortiranog dijela niza. InsertSort(A) for i = 2 to n do j = i; while A(j) < A(j 1) do Swap(A(j), A(j 1)); j = j 1; return A;
Sortiranje izborom najmanjeg elementa (selection sort) Algoritam radi tako to prolazi kroz niz i trai najmanji element. Kada nae najmanji element zamijeni taj element sa poetnim. Dalje se posmatra ostatak niza bez poetnog elementa i ponavlja se isti postupak.
Poetni niz: Nakon 1. prolaska: Nakon 2. prolasaka: Nakon 3. prolaska: Nakon 4. prolaska: Nakon 5. prolaska: Nakon 6. prolaska:
25 15 4 2 15 4 2 4 15 2 4 12 2 4 12 2 4 12 2 4 12
30 30 30 30 15 15 15
2 25 25 25 25 25 25
12 12 12 15 30 30 30
34 34 34 34 34 34 34
Napomena: Crvenom bojom je obiljeen sortirani dio niza u svakom prolasku, dok je utom bojom oznaen najmanji element iz nesortiranog dijela niza. Select-Sort(A) for i = 1 to n-1 do j = FindMin(A, i, n); Swap(A(i), A(j)); return A;
4. Pretraga sortiranog niza Sekvencijalna pretraga Neka je dat niz od n elemenata u rastuem redoslijedu. Problem pretrage se sastoji u tome da ispitamoo da li se vrijednost x koju traimo nalazi u datom nizu. Algoritam sekvencijalne pretrage se sastoji u tome da se redom provjerava svaki element niza A sve dok se ne doe do kraja niza ili se ne doe do elementa ija je vrijednost jednaka x.
1. Inicijalizacija povezane liste Sljedei algoritam pravi praznu listu L. ListMake(L) head(L) = NIL; return L; 2. Dodavanje elementa u povezanu listu Ako je dat pokaziva na element x i pokaziva na element p liste L, sljedei algoritam dodaje novi element x u L iza elementa p.
Slika 2: Dodavanje elementa u listu Vidimo da element koji je bio sljedbenik elementa p postaje sljedbenik elementa x, a element x postaje novi sljedbenik elementa p(Slika 2). ListInsert(L,x,p) next(x) = next(p); next(p) = x; return; Sljedei algoritam dodaje neki element na poetak liste: ListHeadInsert(L, x) next(x) = head(L); head(L) = x; return; 3. Uklanjanje elementa iz liste Sljedea dva algoritma pokazuju kako se brie element x liste L koji se nalazi iza elementa p i kako se brie poetni element liste. Uklanjanjem elementa x, element koji je bio sljedbenik elementa x postaje novi sljedbenik elemnta p (Slika3). Procedura za uklanjanje elemnta iz liste vraa pokaziva na uklonjeni
ListHeadDelete(L) x = head(L); head(L) = next(x); return x; Pretraga jednostruko povezane liste Algoritam za pretragu jednostruko povezane liste pronalazi prvi element sa kljuem k u listi i vraa pokaziva na taj element. Ako nije pronaen element sa kljuem k u listi vraa se pokaziva NIL. ListSearch(L, k) x = head(L); while ( x NIL) ( key ( x) k ) do x=next(x); return x; Vjebe 3
1. Dodavanje elmenta u listu Za razliku od jednostruko povezane liste u kojoj smo novi element x mogli dodti samo iza elementa p, u dvostruko povezanoj listi novi element x moemo dodati i iza i ispred elementa p. Dodavanje elementa x iza elementa p u listu L
ListInsertAfter(L,p,x) prew(x) = p; next(x) = next(p); if next(p)=NIL then Last(L) = x else prev(next(p)) = x; next(p) = x; return; Dodavanje elementa x ispred elementa p u listu L
ListInsertBefore(L, x, p) prev(x) = prev(p); next(x) = p; if prev(p) = NIL then head(L) = x else next(prev(p))=x; prev(p) = x; return;
Dodavanje elementa na poetak liste prethodno provjeravajui da li je lista prazna ListInsertBeginning(L, x) if head(L) = NIL head(L) = x last(L) = x prev(x) = NIL next(x) = NIL else ListInsertBefore(L, head(L), x); return;
2. ListDelete(L ,x) if prev(x) = NIL head(L) = next(x) else next(prev(x))=next(x); if next(x) = NIL last(L) = prev(x) else prev(next(x))=prev(x)
Stack
Stack je specijalna vrsta liste kod koje se dodavanje i uklanjanje elemenata vre na jednom kraju koje se naziva vrh. Poredak elemenata po kojem se oni uklanjaju sa steka je obrnut poretku po kojem su ti elementi dodati na stek. Operacija dodavanja elementa u stek se naziva Push, a operacija uklanjanja elementa iz steka naziva se Pop. Atributni objekat steka sadri polje name i polje top koje pokazuje na vrh steka.Stek od
najvie n elemenata moemo pretstaviti nizom A od n elemenata. Stek je identifikovan promjenljivom S koja pokazuje na vrh steka, tj. na poziciju poslednjeg dodatog elementa.
Kada je S=0 kae se da je stek prazan. Da li je stek prazan moemo provjeriti sljedeim algoritmom: StackEmpty(S) if S=0 then return true else return false; Ako pokuavamo da uklonimo element iz praznog steka kaemo da je dolo do potkoraenja(underflow). Kada je S = n tada je stek pun. Da li je stek pun provjeravamo sljedeim algoritmom: StackFull(S) if S=n then return true else return false; Ako pokuamo da dodamo element na pun stek kaemo da je dolo do prekoraenje(overflow).
Algoritam koji dodaje element na stek: Push(S, x) if StackFull(S) then return overflow else S=S+1; A(S)=x; return S;
Algoritam koji uklanja element iz steka: Pop(S) if StackEmpty(S) then return underflow else x=A(S); S=S-1; return S, x;
Vjebe 5 B -drvo
B drvo reda n +1 je struktura sa slijedeim karakteristikama: 1. Svaki vor u B-drvetu ima najvie n kljueva i n+1 djece. 2. Svaki vor (osim korijena) ima najmanje n div 2 kljueva. 3. vor sa k djece sadri k-1 klju
Slika 1 Ubacivanje podataka u B-drvo Uvijek se ubacivanje novog podatka vri u list. Prvo se pronae stranica u kojoj bi, da postoji, taj podatak nalazio. U sluaju da je broj podataka manji od n tada se jednostavno ubacivanje vri tako da se novi podatak ubaci u list na mjesto gdje po vrijednosti kljua pripada. Primjer: Ubacimo u prethodno drvo podatak 58. Vidimo da klju 58 moemo ubaciti samo u list D izmeu kljueva 55 i 60.
Slika 2
U sluaju da je broj podataka jednak n (vor je pun) tada se vri djeljenje vora na dva vora a srednji podatak se ubacuje u vor na viem nivou. Ubacimo u prethodno dobijeno stablo na slici 2 klju 62. On bi po pravilu trebalo da doe u vor D. No meutim, vor D je pun pa dolazi do njegovog cijepanja na dva vora D1 i D2, a srednji klju 60 prelazi u korijen A.
Slika 3
Brisanje podataka iz B drveta Brisanje podataka iz B drveta je neto komplikovanije od ubacivanja ali se radi uvijek po istim principima to jest trai se da osobine B drveta uvijek ostanu sauvane. Generalno uzevi mogue je nekoliko sluajeva:
1. Brie se klju iz lista a pri tome broj vorova u listu ostaje vei ili jednak n div 2, klju se
jednostavno izbrie iz lista i to je najjednostavniji sluaj. Iz stabla na slici 3 izbriimo klju 75. Poto minimalan broj kljueva u datom stablu mora biti 2, vidimo da brisanjem kljua 75 ne dolazi do potkoraenja i klju 75 jednostavno izbriemo.
Slika 4
U ovom sluaju ispitujemo lijevog i desnog brata. Ako brat sadri vie od n div 2 kljueva tada se klju iz vora oca koji razdvaja dva lista brata spusti u vor iz koga se prethodno izbaci eljeni klju, a klju brata (prvi ako uzimamo klju iz desnog brata, zadnji ako uzimamo klju iz lijevog brata) se prebacuje u vor oca. Izbriimo iz stabla na slici 4 klju 58. Brisanjem kjua 58 iz lista D1 dolazi do potkoraenja. Gledamo da li lijevi ili desni brat lista D1 ima vie od n div 2 kljueva. Vidimo da list C, tj. Lijevi brat lista D1 ima vie od n div 2 kljueva i klju 44 iz lista C prelazi u vor A umjesto kljua 50, a klju 50 se sputa u list D1.
Slika 5 Meutim, moe se desiti da i lijevi i desni brat sadre tano n div 2 kljueva. U tom sluaju vor iz kog izbacujemo klju i jedan od njegove brae se spajaju u jedan vor koji pored njihovih kljueva sadri i klju iz oca koji je razdvajao vorove koje spajamo. Izbacimo iz stabla na slici 5 klju 31. Vidimo da i lijevi i desni brat vora C iz kojeg izbacujemo klju 31 sadre tano n div 2 kljueva. Spojiemo vor C sa njegovim lijevim bratom vorom B, a klju 25 iz oca koji je razdvajao vorove B i C prelazi u novi vor B1 koji je nastao spajanjem vorova B i C.
Slika 6
3. Brie se klju iz vora koji nije list. Tada se iz lijevog postabla uzima najvei klju ili se iz
desnog podstabla uzima najmanji klu i prenosi se u vor iz kojeg se brie klju. Nakon toga se ispituje da li je popunjenost vora lista iz kojeg je uzet klu manji od n div 2 i ako jeste vri se spajanje ili prelijevanje podataka.
Slika 7 Iz datog B-stabla na slici 7 izbrisati klju 44. Klju 44 iz vora A briemo tako to traimo najvei klju iz lijevog brata ili najmanji klju iz desnog brata i stavljamo ga u vor A umjesto kljua 44.
Slika 8
25
50
70
15
31
38
44
55
66
75 85 90
U dato stablo ubaciti kljueve: 35, 60 i 80, a zatim iz dobijenog stabla izbaciti kljueve 70.
35, 60,