Download as pdf or txt
Download as pdf or txt
You are on page 1of 14

Vjebe 1

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.

SeqSearch(A,x) j = 0; i = 1; while (i n) ( j = 0) do if A(i) = x then j = i; i = i + 1; return j;

Vjebe 2 Jednostruko povezane liste


Povezana lista pored svojstava da se lista moe dinamiki poveavati ili smanjivati, njenim elementima se moe pristupiti ili joj se elementi mogu dodati ili ukloniti na svakom mjestu u listi. Za razliku od niza kod koga je linearan poredak odreen na osnovu indeksa niza, poredak u listi je odreen pokazivaem u svakom elementu. Pokazivaka promjenljiva pokazuje na memorijsku lokaciju u kojoj se nalazi vrijednost objekta. Vrijednost pokazivake promjenljive je adresa memorijske lokacije na kojoj je rezervisan prostor za smjetanje vrijednost dinamikog objekta. Pri radu sa listama, pretpostavljamo postojanje pokazivaa NIL, koji ne pokazuje ni na jedan element. Za broj elemenata n liste kaemo da je to veliina liste. Ako je n = 0 tada kaemo da je lista prazna. Za i = 1, 2,...,n 1 kaemo da je xi prethodnik elementa xi+1 , a xi+1 je sljedbenik elementa xi. Prvi element ili glava liste nema prethodnika, a posljednji element ili rep liste nema sljedbenika. Svaki element liste predstavljamo jednim objektom koji sadri polje kljua key i pokazivako polje next Na primjer, key(x) i next(x) oznaavaju polja key i next onog elementa na koji pokazuje x i funkcije koje kao rezultat daju vrijednosti kljua i pokazivaa koje se nalaze u poljima elementa na koji pokazuje x. Umjesto fraze pokaziva x koji pokazuje na neki element koristiemo frazu element x, znajui da je x pokaziva na neki element.

Slika1: Jednostruko povezana lista

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

element kako bi se oslobodili resursi koje taj elemnt zauzima.

Slika 3: Uklanjanje elementa iz liste

ListDelete(L,p) x = next(p) next(p) = next(x) return x;

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

Dvostruko povezana lista


Kod jednostruko povezanih listi, listu smo prelazili u jednom smjeru slijeva na desno. Dvostruko povezanu listu prelazimo u oba smjera. U dvostruko povezanoj listi svaki element ima ima polje kljua key i dva pokazivaka polja prev i next. Za element x prev(x) pokazuje na njegovog prethodnika, a next(x) na njegovog sljedbenika. Ako je prev(x)=NIL, x nema prethodnika i to je prvi element liste. Ako je L dvostruko povezana lista head(L) pokazuje na glavu liste.

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.

Stek od najvise n elemenata, S pokazuje na vrh steka

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 pravi prazan stek: StackMake(S) S=0; return S;

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

2. Brie se klju iz lista ali u listu ostaje manje n div 2 kljueva.

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

Zadatak: 1. Dato je B stablo kod koga je maksimalan broj kljueva 3:

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,

You might also like