99
1 Dr Dušan T. Malbaški 1 UVOD U STRUKTURE PODATAKA 2 3 program je jedinstvo algoritma i strukture podataka algoritam i struktura podataka su nedeljivi greška u algoritmu ispravlja se relativno jednostavno, dok greška u strukturi podataka često zahteva ponovnu izradu programa algoritam se odvija nad strukturom podataka nad istom strukturom podataka mogu dejstvovati više algoritama isti podaci mogu se urediti u različite strukture, u skladu sa namenom

1 UVOD U STRUKTURE PODATAKA - Početna | Educons : · PDF file · 2017-05-263 7 Digraf (orijentisani graf) • koristi se za prikaz SPsa binarnim relacijama a b element (čvor) grana

Embed Size (px)

Citation preview

1

Dr Dušan T. Malbaški

1 UVOD U STRUKTURE PODATAKA

2

3

• program je jedinstvo algoritma i strukture podataka

• algoritam i struktura podataka su nedeljivi

• greška u algoritmu ispravlja se relativno jednostavno, dok greška u strukturi podataka često zahteva ponovnu izradu programa

• algoritam se odvija nad strukturom podataka

• nad istom strukturom podataka mogu dejstvovati više algoritama

• isti podaci mogu se urediti u različite strukture, u skladu sa namenom

2

4

Tri verzije matricedouble A[VMAX][KMAX];int i,j,v,k;for(i=0;i<v;i++)for(j=0;j<k;j++)

if(!A[i][j]) obraditi A[i][j];

double **A;int i,j,v,k;A = malloc(v*sizeof(double*));for(i=0;i<v;i++) A[i] = malloc(k*sizeof(double));

for(i=0;i<v;i++)for(j=0;j<k;j++)

if(!A[i][j]) obraditi A[i][j];

O[n2]

O[n2]

5

typedef {int vrsta, kolona;double vrednost;

} Element;..................................double *B; int p;B = malloc(p*sizeof(Element));for(i=0;i<p;i++) obraditi B[i].vrednost; O[p]

//pristup pojedinacnim elementimadouble getAij(double B[], int p, int i, int j) {int m;for(m=0;m<p;m++)

if((B[m].vrsta==i)&&(B[m].kolona==j)) return B[m].vrednost;return 0;

}

6

Definicija strukture podataka

1. Skalar je struktura podataka.

2. Ako su S1,...,Sk strukture podataka i S=S1,...,Sktada je uređena n+1-orka (S,r1,...,rn) gde su r1,...,rn relacije u skupu S, takođe struktura podataka.

3. Struktura podataka se može obrazovati samo konačnim brojem primena stavki 1 i 2 ove definicije.

• skalar je uređeni par (p,) gde je p podatak, a prazan skup (sa smislom prazne relacije)

3

7

Digraf (orijentisani graf)

• koristi se za prikaz SP sa binarnim relacijama

a

b

element(čvor)

grana

a je prethodnik bb je sledbenik a

8

Osnovne operacije

• operacija pristupa - izdvajanje, markiranje elementa strukture, a u svrhu očitavanja ili izmene njegovog sadržaja

• uklanjanje elementa; uklanja se element i sve njegove veze sa drugim elementima

• dodavanje elementa; dodaje se element i veze sa drugim elementima

• provera da li je struktura podataka prazna

9

Operacija pristupa

• tri oblika:

–pristup prema poziciji

–pristup prema informacionom sadržaju (asocijativni pristup, traženje, pristuppo ključu)

–navigacija

4

10

pristup prema poziciji

• uslov: moguće definisati poziciju (redni broj elementa)

• eksplicitan gde se pozicija zadaje(npr. indeksiranje kod niza)

• implicitan gde se pozicija podrazumeva (npr. pristup tzv. "vrhu" steka))

11

pristup prema informacionom sadržaju(traženje po ključu)

• odvija se na bazi tzv. ključa – dela informacionog sadržaja koji jednoznačno identifikuje element

• zadati ključ zove se argument traženja

• uglavnom zahteva više pokušaja

• može da bude neuspešan (ako elementa sa zadatim ključem nema)

12

navigacija

• u svakom trenutku definisan je tzv. tekući element

• podrazumeva se da se pristupa tekućem elementu (tipičan primer: datoteka)

5

13

još neke tipične operacije

• Provera da li je struktura podataka puna (ako je memorijski prostor ograničen)

• Pretraživanje. Operacija kojom se izdvajaju svi elementi koji zadovoljavaju zadati kriterijum; rezultat pretraživanja može da bude nijedan, jedan ili više elemenata; primer: pretraživanje strukture podataka sa podacima o automobila i kriterijum „boja je crna“

• Određivanje veličine. Jednostavna operacija kojom se određuje broj elemenata skupa S

• Redosledna obrada. Obrada svih elemenata strukture podataka po nekom redosledu. Primer: štampanje sadržaja neke datoteke

• Sortiranje. Uređivanje elemenata strukture po nekom kriterijumu• Kopiranje sadržaja jedne strukture podataka u drugu• Spajanje dve ili više struktura podataka u jednu• Razlaganje strukture podataka na dve ili više

14

• efikasnost operacije zavisi od utroška računarskih resursa, a to su

– vreme i

– memorija

• tačan iznos utroška resursa za dati program nemoguće je (i besmisleno) izračunavati, jer zavisi od spoljnih faktora

– hardvera,

– operativnog sistema

– čak i trenutnog stanja računara

analiza performanse algoritma

15

• zato se pristupa proceni utroška resursa i to algoritma, a ne programa

• zato ne govorimo o vremenu trajanja, nego o vremenskoj i memorijskoj kompleksnosti (složenosti)

• procena se vrši asimptotski (gornja-donja granica, red veličine) u odnosu na porast obima polaznih podataka koji se meri dimenzionalnošću problema (ceo nenegativan broj)

• utrošak memorije i vreme su, po pravilu; obrnuto srazmerni

6

16

Vremenska složenost

• pod vremenskom složenošću (engl. time complexity) podrazumeva senenegativna, monotono neopadajuća funkcija

T : Z+R

gde je Z+ skup celih nenegativnih brojeva (dimenzionalnost), a R skup realnih brojeva (vreme)

17

Prostorna složenost

• pod prostornom složenošću (engl. space complexity) podrazumeva senenegativna, monotono neopadajuća funkcija

M : Z+R

gde je Z+ skup celih nenegativnih brojeva (dimenzionalnost), a R skup realnih brojeva (memorija)

18

Procena vremenske složenosti

• vrši se asimptotski, za velike vrednosti n, gde je ndimenzionalnost

• tri pristupa:–analiza gornje granice (O-notacija)

–analiza donje granice (-notacija)

–analiza reda veličine (-notacija)

"veliko O" (big Oh)

7

19

O - notacija

• najpopularniji način; daje približnu sliku o ponašanju algoritma velike dimenzionalnosti u najgorem slučaju

• Neka je g(n) monotono neopadajuća funkcija.

g : Z+R

• Definišimo skup istih takvih funkcija

O[g(n)] = {f(n) | (n0,c>0) (nn0) 0f(n)cg(n)}

gde je c>0 konstanta.

20

• Og(n) je oznaka za skup funkcija za koje je, počev od neke vrednosti n=n0, funkcija constg(n) gornja granica

cg(n)

f(n)

n0

21

• Očigledno je da za svaku funkciju f(n) koja pripada Og(n) postoji konstanta c>0 takva da važi

limn(f(n)/g(n))< c• Na primer,

n3+2n-5 On32log2n+1 Olog2n32n+log2(2n) O2n

• Prilikom procene gornje granice za funkciju složenosti T(n), u stvari se određuje funkcija g(n)takva da važi

T(n) Og(n)• običaj je da se koristi (matematički nekorektna)

oznakaT(n) = Og(n)

8

22

Klasifikacija algoritama prema O-složenosti

g(n) Tip algoritma

const konstantan

logk n (k>1) logaritamski

n linearan

nlogk n (k>1) linearno-logaritamski

n2 kvadratni

nk (k>2) stepeni

kn (k>1) eksponencijalni

n! faktorijelni

23

ilustracija

n log2n n nlog2n n2 n3 2n n!

10 3,3 10 33,2 100 1000 1024 3,6 106

100 6,6 100 664 104 106 1,3 1030 9,3 10157

500 9,0 500 4483 2,5 105 1,3 108 3,2 10150 1,2 101134

1000 10,0 1000 9966 106 109 1,1 10301 4 102567

današnji računari još uvek ne izlaze na kraj sa ovim!

24

- notacija

• daje približnu sliku o ponašanju algoritma velike dimenzionalnosti u najboljem slučaju

• Neka je g(n) monotono neopadajuća funkcija.

g : Z+R

• Definišimo skup istih takvih funkcija[g(n)] = {f(n) | (n0,c>0) (nn0) 0 cg(n)f(n)}

gde je c>0 konstanta.

9

25

• g(n) je oznaka za skup funkcija za koje je, počev od neke vrednosti n=n0, funkcija constg(n) donja granica

n0

cg(n)

f(n)

26

- notacija

• daje približnu sliku o ponašanju algoritma velike dimenzionalnosti u prosečnom slučaju

• Neka je g(n) monotono neopadajuća funkcija.

g : Z+R

• Definišimo skup istih takvih funkcija

[g(n)] = {f(n) | (n0,c1,c2>0) (nn0)

0 c1g(n)f(n)c2g(n)}

gde su c1>0 i c2>0 konstante.

27

c1g(n)

c2g(n)

f(n)

n0

10

28

Klasifikacija struktura podataka

• prema nivou apstrakcije

• prema mestu memorisanja

• prema tipu relacije

• prema ograničenjima u pogledu izvršavanja osnovnih operacija

• prema nameni

29

prema nivou apstrakcije

• logičke strukture

• fizičke strukture (fizička realizacija)

• istoj logičkoj strukturi odgovara više fizičkih

30

logička struktura podataka

• matematička apstrakcija

• definicija SP jeste definicija logičke strukture

• operiše se elementima, uređenim n-torkama (vezama) i matematičkim operacijama

11

31

fizička struktura podataka

• realizacija logičke strukture u memoriji

• operiše se lokacijama, pokazivačima i potprogramima

• može biti

– sekvencijalna: unapred rezervisan memorijski prostor; brze operacije; može doći do prekoračenja

– spregnuta: elementi se povezuju pokazivačima; nema prekoračenja; sporije operacije

– kombinacija

32

sekvencijalna

spregnuta

pokazivač

33

primer

000

005

080

0 8 0 5 0 0 0 0 0

logička struktura

fizička realizacija 1

0 1 8 1 0 5

fizička realizacija 2

12

34

Klasifikacija prema mestu memorisanja

• operativne strukture podataka se nalaze u operativnoj memoriji

• masovne strukture podataka nalaze se na periferijskim jedinicama (tipično: disk)

• razlika:

– masovne strukture su permanentne, operativne su deo programa

– operativna memorija je daleko brža od periferijske

– masovne strukture podataka su, u načelu, obimnije

35

Klasifikacija prema tipu relacije

• odnosi se isključivo na binarne relacije

• linearne, strukture tipa stabla i mrežne strukture

• linearne strukture: svaki element osim tačno jednog ima tačno jednog sledbenika, a isto važi i za prethodnika

36

• strukture tipa stabla

• mrežne strukture

13

37

prema ograničenjima

• statičke:operacije uklanjanja i dodavanja nisu definisane; provera da li je STP prazna ne treba

• poludinamičke strukture kod kojih su sve četiri operacije definisane, ali postoje ograničenja

• dinamičke strukture podataka kod kojih nema posebnih ograničenja (osim definicionih)

38

prema nameni

• kontejnerske strukture koje su namenjene samo za čuvanje podataka; glavna karakteristika im je da je u svakom trenutku dozvoljen pristup svim podacima (uklanjanje i dodavanje ne moraju biti dozvoljeni)

• strukture specijalne namene (npr. stek)

1

2 NIZ

1

2

Logička struktura niza

• Niz je uređeni parA = (S(A), r(A))

gde je S skup elemenata, a r binarna relacija, sa sledećim osobinama:– struktura A je linearna i homogena tj. elementi skupa

S(A) su istovrsni– dozvoljen je pristup svakom elementu i to

indeksiranjem– operacije dodavanja i uklanjanja mogu, ali ne moraju

biti definisane.

ključna reč za niz!

3

• ako se u toku izvršenja programa broj elemenata niza ne menja, tada je u pitanju statički niz; u suprotnom, radi se o dinamičkom nizu.

2

4

Multiindeksne strukture

• Nekada su nizovi skalara, matrice i slične višedimenzionalne strukture bile posebne strukture

• Danas su ove strukture podvrsta nizova sa imenom multiindeksne strukture– Vektor (niz skalara) je multiindeksna struktura reda 1.– Multiindeksna struktura reda k >1 je niz

Nk=(S(Nk),r(Nk)) u kojem su elementi skupa S(Nk)multiindeksne strukture reda k-1.

• Multiindeksna struktura reda 2 nosi naziv matrica i predstavlja niz čiji su elementi nizovi skalara (vektori)

5

Operacija pristupa

• izvodi se indeksiranjem i najvažnija je operacija kod nizova

• pristup je veoma brz jer se odvija u jednom pokušaju

• kada napišemo

x[i]

u fazi prevođenja izraz će biti zamenjen formulom

adr(x[i]) = adr(x[p]) + (i-p)L

adresa x[i]adresa elementa sa najmanjim

indeksom najmanji indeks

dužina elementa

6

• u C-u najmanji indeks je uvek p=0, pa je indeksiranje brže (za oko 1/3)

adr(x[i]) = adr(x[0]) + (i-p)L

3

7

Fizička realizacija niza

• zbog operacije indeksiranja, fizička realizacija svih nizova mora biti sekvencijalna

8

Realizacija statičkog niza

• statički niz može se realizovati– standardno, naredbom programskog jezika

T a[DUZINA];gde se unapred (pri prevođenju) rezerviše memorijski prostor

– na hipu, pomoću mehanizma pokazivača, gde se u toku izvršavanja zauzima potreban memorijski prostor

T *a; int n;.................a = malloc(n*sizeof(T));

• u oba slučaja pristupa se indeksiranjem, a[j]

9

Metoda linearizacije (pakovanje)

• ubrzanje pristupa kod multiindeksnih struktura

• primenjuje se kod svih procedurnih programskih jezika

• struktura se "seče" na delove (npr. matrica na vrste ili kolone) i delovi se sukcesivno smeštaju u memoriju

vrsta 1 ....... poslednja vrstavrsta 0

4

10

• adresa elementa računa se uopštenjem formule za indeksiranje

• neka je M n-indeksna struktura sa najmanjim indeksima pi (u C-u 0) i najvećim indeksima ki, i=1,...,n. Adresa elementa M[j1]...[jn] ra;una se po formuli

adr(M[j1]...[jn]) = adr(M[p1]...[pn]) + L*

gde se faktor D računa rekurzivno kao– Dm = (km+1-pm+1+1)Dm+1 Dn=1, m=n-1,n-2,...,1

– Dm = (km-1-pm-1+1)Dm-1 D1=1, m=2,3,...,n

n

m

mmm Dpj1

)(

sečenje po horizontali

sečenje po vertikali

11

primer

• za C-matricu definisanu kao

double p[20][30];

indeksirani izraz p[i][j] računaće se po formuli

adr(p[i][j]) = adr(p[0][0]) + (i*30+j)*sizeof(double)

12

Realizacija dinamičkog niza

• realizuje se na hipu

• rezerviše se više prostora nego što je trenutno potrebno (zbog dodavanja)

...

5

13

• neka je d dinamički niz tipa T koji se inicijalno smešta u blok veličine B izražene brojem elemenata

T *d; int B;

d = malloc(B*sizeof(T));

• popunjava se redom od lokacije d[0] do dn-1 gde je n aktuelna dužina niza.

d[0] d[1] ... d[n-1]

d

14

• zbog indeksiranja:

• pri dodavanju elementi se pomeraju udesno

• pri uklanjanju elementi se pomeraju ulevo

...d

...d

dodavanje

uklanjanje

15

dodavanje

• kada se dodavanjem memorijski prostor veličine B napuni (overflow) mora se povećati blokom veličine deltaB, tako da algoritam dodavanja ima sledeći izgled:

int j;

if(n==B) realloc(d,(B+=deltaB)*sizeof(T));

for(j=n++;j>i;j--) d[j]=d[j-1];

d[i] = value;

na indeks i upisuje se vrednost value

pomeranje udesno

overflow

6

16

uklanjanje

• elementi se pomeraju ulevo

//uklanjanje elementa na indeksu i

int j;

for(j=i,n--;j<n;j++) d[j]=d[j+1];

pomeranje ulevo

• može se (i ne mora) predvideti skraćivanje memorijskog prostora ako uklanjanjem postane slabo popunjen

17

Sortiranje niza

• po definiciji, uređivanje elementa niza u skladu sa nekim kriterijumom (npr. po vrednosti elemenata)

• izrazito velik broj postupaka

• obradićemo:

– metodu izbora (selection sort)

– metodu izmene (exchange sort ili bubblesort)

– metodu umetanja (insertion sort)

– Quicksort

18

Metoda izbora

• u svakom prolazu posmatra se podniz

ai, ai+1,...,an-1 i=0,1,...,n-1

• u podnizu se određuje najmanji element i on menja mesto sa elementom ai.

7

19

void selectionSort(int a[],int n) {int i,j,ndxmin,tmp;for(i=0;i<n;i++) {

//odredjivanje indeksa najmanjeg u podnizufor(ndxmin=i,j=i+1;j<n;j++)

if(a[ndxmin]>a[j]) ndxmin=j;//zameniti mesta a[i] i a[ndxmin]if(i!=ndxmin) {tmp=a[ndxmin];a[ndxmin]=a[i];a[i]=tmp;}

}}

1 24

9 7 6 8

ji

ndxmin

Tsel = On2

20

Metoda izmene

• u svakom prolazu posmatra se podniz

a0,a1,...,ai i=n-1,n-2,...,1

• upoređuju se parovi aj i aj+1; ako nisu u dobrom poretku razmenjuju mesta

• postupak se završava ili kada je i=0 ili ako u jednom prolazu nema ni jedne zamene mesta

21

void bubbleSort(int a[],int n) {

int i,j,chn,tmp; //chn=0: nije bilo zamena u prolazu; zavrsiti

for(chn=1,i=n-1;chn&&(i>0);i--)

for(j=chn=0;j<i;j++)

if(a[j]>a[j+1]) //los redosled? da: izmena mesta {tmp=a[j];a[j]=a[j+1];a[j+1]=tmp;chn=1;}

}

3 1 4 6 9 2 7

Tbubble = On2

8

22

Metoda umetanja

• u svakom prolazu posmatra se element

ai i=1,2,...,n-1

• element ai se redom upoređuje sa prethodnicima i sve dok je manji od njih menja sa njima mesto (potiskuje se ka početku sve dok se ne naiđe na manji)

23

void insertionSort(int a[],int n) {

int i,j,tmp;

for(i=1;i<n;i++)

for(j=i;(j>0)&&(a[j]<a[j-1]);j--)

{tmp=a[j];a[j]=a[j-1];a[j-1]=tmp;}

}

1 46

7 3 9 2

Tins = On2

24

Quicksort (Hoare, 1962)• polazi se od celog niza

a0,a1,...,an-1 L=0, R=n-1• utvrđuje se granična vrednost G=aL

• niz se preuređuje tako što se postavlja granica M takva da su levo od nje elementi manji od G, a desno veći ili jednaki

• na kraju elementi aL i aM menjaju mesta

1 32

4 7 9 6

G=4MLR

9

25

• potom se isti postupak ponavlja za levi deo (L do M-1) i za desni deo (M+1 do R)

• sa postupkom se nastavlja sve dok ima delova koji imaju više od jednog elementa

preuređivanje niza

for(M=L,G=a[L],i=L+1;i<=R;i++)

if(a[i]<G){tmp=a[++M];a[M]=a[i];a[i]=tmp;}

tmp=a[M];a[M]=a[L];a[L]=tmp;

26

4 16

7 3 9 2L R

M

iG=4

Tquick = Onlog2n

27

Redosledna obrada niza

• Redosledna obrada (traversing) niza je postupak obrade elemenata redosledom kojim su smešteni u niz (recimo, štampanje elemenata)

• izvodi se primenom ciklusa for

for(i=0;i<n;i++) obraditi a[i]

• Ako je Tobr vremenska složenost operacije obrade svakog elementa (i ista je za svaki element), tada je vremenska složenost redosledne obrade

Ttrav(n) = nTobr

• kako je Tobr približno konstantno, važi

Ttrav(n) = O[n]

1

3 SLOG I TABELA

1

2

• objedinjava elemente različitog tipa (heterogena struktura)

• služi za opis (modelovanje) entiteta

• ključna reč: semantička konvergencija

• za elemente sloga koristi se naziv polja

• statička struktura

3

Logička struktura sloga

• Slog je uređeni par

R = (S(R), r(R))

gde je S skup elemenata, a r n-arna relacija

S(R) = {x1,...,xn}

r(R) = {(x1,...,xn)}, (i≠j)(xi≠xj), i,j=1,..,n

2

4

• relacija r je reda n, i sastoji se od jedne jedine uređene n-torke u koju ulaze svi elementi skupa S(R)

• elementi skupa S(R) su heterogeni• dozvoljen je pristup svakom polju preko

naziva (nema indeksiranja)• u skupu naziva polja nema uređenja• dodavanje i uklanjanje polja nije definisano

5

Fizička realizacija sloga

• zbog operacije pristupa, fizička realizacija mora biti sekvencijalna

• slog što predstavlja tačku u Dekartovom koordinatnom sistemu

A0char oznaka 0

double x 8

double y 16

3 A0

deskriptor

broj pôlja

adresa sloga

tip polja ofset

naziv polja

6

• pristup se realizuje u fazi prevođenja, na osnovu deskriptora

• neka je t promenljiva tipa sloga iz primera. Kada prevodilac naiđe na izraz

t.yodrediće adresu ovako:

adr(t.y) = A0 + 16

adresa sloga ofset

3

7

Tabela• Po definiciji, tabela je niz čiji su elementi

slogovi

• Dakle, može biti statička ili dinamička

• najvažnije operacije:

– sortiranje

– traženje, tj. pristup po ključu i

– redosledna obrada elemenata tabele

8

• sve operacije razmotrićemo na primeru sloga oblika

typedef struct {

int key;

T info;

} Entry;

ključ

informacioni sadržaj

9

Sortiranje tabele• pošto je tabela niz slogova, metode

sortiranja se, u načelu, ne razlikuju od sortiranja nizova

• specifičnost je da se elementi tabele uređuju prema ključu

4

10

Linearno traženje

int linSearch(Table t, int n, int arg) {

int i;

for(i=0;i<n;i++) if(t[i].key==arg) return i;

return -1;

}

22

11

1

nni

nU

n

i

lin

uspešno

nNlin

neuspešno

O[n]

11

Binarno traženje

int binSearch(Table t, int n, int arg) {int i, low=0, high=n-1;while(low<=high) {

i = (low+high)/2;if(t[i].key==arg) return i;if(t[i].key<arg) low = i+1; else high = i-1;

}return -1;

}

binarno traženje

1 4 5 8 10 14 16 17 19

linearno traženje

12

analiza

x5

x2

x1 x3

x8

x6 x10

x0 x4 x7 x9 x11

x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11

e1=20

e2=21

e3=22

e4=23

5

13

analiza

• Neka je ej broj elemenata do kojih se stiže posle j upoređenja za j=1,...,h. Očigledno je

e1=1=20 e2=21 e3=22 ... ei=2i-1 ... eh-1=2h-2

• broj elemenata do kojih se stiže sa 1,2,...,h-1 upoređenja iznosi

tj.

eh=n-2h-1+1

122 11-h

0k

k

h

14

• Ako je verovatnoća traženja ista za sve elemente i jednaka 1/n

Ubin = (1/n)(e1+2e2+...+(h-1)eh-1+heh)

= (1/n)(heh+(h-2)2h-1+1)

Uvrštavanjem vrednosti za eh dobijamo

Ubin = h+h/n+(2h-1)n

Kako je 2h-1 n 2h-1 sledi

h log2 (n+1)

tj.

Ubin ≈ (log2 n) - 1

15

• pošto je vremenska složenost srazmerna Ubin

sledi

• Neuspešno traženje: približno isto!

Tbin(n) = O[log2n]

6

16

n Ulin Ubin

10 5 2.3

50 25 4.6

100 50 5.6

500 250 8.0

1000 500 9.0

5000 2500 11.3

10000 5000 12.3

poređenje linearnog i binarnog traženja

17

Redosledna obrada tabeleslučaj 1: ako je redosled proizvoljan obavlja se,

kao i kod niza, običnim for ciklusom, sa

složenošću algoritma O[n]

slučaj 2: ako se zahteva obrada u sortirnom

redosledu i ako je tabela sortirana isto

slučaj 3: ako se zahteva obrada u sortirnom

redosledu i ako tabela nije sortirana

svaki put se mora linearno tražiti, te

je kompleksnost O[n2]

18

Rasuta ili heš tabela• engl scattered (hash) table

maksimalno ubrzati traženje tako što će se naosnovu zadatog argumenta traženja argodrediti adresa odgovarajućeg sloga

adr = h(arg)

gde je adr relativna adresa (indeks) traženog elementa

7

19

Logička struktura heš tabele• uređeni par

H = (S(H),)

gde su elementi skupa S(H) slogovi iste vrste, a prazan skup (sa smislom prazne relacije).

• Pristup se obavlja traženjem, putem heš funkcije h, koja preslikava skup ključeva K na skup S(H):

h : K S(H)

• Pristupiti se može svakom elementu, a definisane su i operacije dodavanja i uklanjanja i to bez ograničenja, tako da heš tabele spadaju u dinamičke strukture podataka

20

Fizička struktura heš tabele• heš tabela realizuje se sekvencijalno i to na

hipu

• u datom trenutku neke lokacije su slobodne, a neke zauzete

slobodna lokacijazauzeta lokacija

t

0 1 2 3 4 ....................... SIZE-1

21

• tip sloga u heš tabeli:typedef struct {

K key;T info;

} Entry;• definicija heš tabele:typedef Entry* Hashtable;• neka je t heš tabela:Hashtable t;t = malloc(SIZE*sizeof(Entry)); //SIZE je velicina

//memorije

8

22

priprema memorijskog prostora

• memorija se zauzima unapred• pošto su elementi "razbacani" po memoriji,

mora se označiti da li je neka lokacija slobodna:– ako postoje zabranjene vrednosti ključa one se

upisuju u slobodne elemente– ako ih nema u lokaciju se upisuje statusno polje sa

vrednostima npr. "slobodna" odn. "nije slobodna"

primer: ključ je neprazan stringEntry t0 = {″″};for(i=0;i<SIZE;i++) t[i]=t0;

23

heš funkcija

• heš funkcija ("heširanje") je funkcija koja ključ pretvara u relativnu adresu u memoriji tabele (tj. u broj između 0 i SIZE-1)

• ima ih mnogo; primer: ako je ključ key tipa stringa (čest slučaj) pojedinačni znaci u stringu tretiraju se kao celobrojne vrednosti i međusobno se sabiraju da bi na kraju rezultat bio sveden na traženi segment operacijom deljenja po modulu

24

• h je heš funkcija koja ključ key tipa stringa pretvara u broj između 0 i SIZE-1:

unsigned h(char* key) {

unsigned x=0;

while(*key) x+=*key++;

return x%SIZE;

}

9

25

Kolizija ključeva

• dva elementa sa različitim ključevima generišu istu adresu, tj.

h(key1) = h(key2) uz key1 key2

• elementi sa različitim ključevima što generišu istu adresu zovu se sinonimi

• od svih sinonima samo jedan može da se smesti na matičnu poziciju h(key); ostali su prekoračioci

• kolizija ključeva ne može se izbeći!

• vrednost SIZE treba da bude prost broj

26

Rukovanje prekoračiocima

• otvoreno adresiranje

– linearno sondiranje

– kvadratno sondiranje

– slučajno sondiranje

• lančanje

27

linearno sondiranje

• ako je lokacija zauzeta cirkularno se traži sledeća slobodna izrazom i=(i+1)%SIZE dok se lokacija ne nađe ili dospe na početni indeks (tada je tabela puna)

početak pretrageslobodna lokacija

10

28

uklanjanje

• problem! ako se lokacija označi kao nezauzeta kvari se traženje

početak pretrage

a b c d

a b d

(a)

(b)

uklonjen c

ovde će se zaustaviti

a, b, c i d su sinonimi

d ne može da se nađe!

29

• uvode se dve vrste nezauzetih lokacija:

– inicijalno prazne (u njih ništa nije bilo upisivano)

– u njima su bili elementi, pa su uklonjeni

• postiže se sa dve specijalne vrednosti ključa ili statusnim poljem sa tri vrednosti: zauzeta, inicijalno prazna i oslobođena

• traženje se zaustavlja kada se pregleda cela memorija ili kada se naiđe na inicijalno praznulokaciju

30

nagomilavanje (clustering, pile-up)

• tendencija stvaranja dugih nizova zauzetih lokacija

j j+1

• verovatnoća smeštanja na lokaciju j+1 dva puta je veća od verovatnoće smeštanja na bilo koju drugu lokaciju

11

31

Kvadratno sondiranje

• ako dođe do kolizije, novo mesto neće se tražiti na sledećoj lokaciji nego na lokaciji koja je na promenljivom rastojanju

i0 = h(key)

Ako se traženje mora nastaviti, ono se obavlja u kpokušaja tako da bude

ik = (i0 + k2)%SIZE k=1,2,...

(novi pokušaji će biti na rastojanjima 1, 4, 9, ... od prvobitne lokacije i0)

• mana: neće sve lokacije biti obuhvaćene za upis

32

Slučajno sondiranje

• ako je lokacija određena heširanjem popunjena, tada se aktivira sekundarno heširanje nekom drugom funkcijom h’ i računa

inc = h’(arg)

• pri dodavanju i traženju koristi se izraz

i = (i+inc)%SIZE

• funkcija h' (sekundarna transformacija) mora biti različita od primarne transformacije h:

h’(key) = 1+*key%(SIZE-1) //ne sme biti 0!

33

Rekonfigurisanje

• pošto je realizacija sekvencijalna, može doći do prepunjenosti

• da bi se to rešilo, vrši se rekonfigurisanje, tj. ponovno formiranje nove, povećane heš tabele

• rekonfigurisanje se vrši kada je faktor popunjenosti q=n/SIZE (n je broj zauzetih lokacija) tabele oko 80%

12

34

Lančanje• izbegava se rekonfigurisanje, po cenu izvesnog

usporavanja operacija

• sinonimi se međusobno sprežu pomoću pokazivača

u ovom lancu su elementi za koje je h(key)=i

i

1

4 POLUDINAMIČKE STRUKTURE

1

2

• strukture specijalne namene

• dozvoljene su sve osnovne operacije, uz ograničenja

• stek

• red (red čekanja, queue)

• dek (deque)

• sekvenca

3

Logička struktura steka

• Stek je uređeni par

L = (S(L), r(L))

• struktura je linearna

• pristupa se isključivo prvom elementu

• uklanja se isključivo prvi element

• dodaje se isključivo ispred prvog elementa

• prvi element zove se vrh steka (a poslednji dnosteka)

"vidljiv" je samo vrh

2

4

• definiciona osobina steka je Last In First Out(poslednji unutra-prvi napolje): LIFO

• osnovne operacije:

– top (pristup)

– pop (uklanjanje)

– push (dodavanje)

– isEmpty (provera da li je stek prazan)

• u praksi se pristup i dodavanje kombinuju u jednu operaciju: destruktivno očitavanje(asemblerska operacija POP)

ključna reč!

5

Fizička struktura steka

• zbog brzine operacija: sekvencijalna

• može doći do prepunjenosti (overflow) i zato se uvodi operacija isFull za proveru da li je stek pun

• realizuje se u statičkoj memoriji ili na hipu

• ako je statičkoj memoriji ne može mu se menjati veličina; stanje overflow rezultuje havarijskim prekidom programa

• realizacija na hipu pruža mogućnost da se u slučaju stanja overflow, stek rekonfiguriše

6

• realizacija u statičkoj memoriji

typedef struct {

int c;

int t;

T sCAPACITY; } Stack;

• realizacija na hipu

typedef struct {

int c;

int t;

T *s;

} Stack;

CAPACITY je konstanta

niz!

3

7

• kreiranje steka u statičkoj memorijivoid create(Stack* stk) {stk->c=CAPACITY;stk->t=-1;

}• kreiranje steka na hipuvoid create(Stack* stk,int capacity) {stk->c=capacity;stk->t=-1;stk->s=malloc(capacity*sizeof(T));

}

u oba slučaja stek je inicijalno prazan

8

• uništavanje steka kada je na hipuvoid destroy(Stack* stk) {free(stk->s);

}• provera da li je prazanint isEmpty(const Stack* stk) {return stk->t<0;

}• provera prepunjenostiint isFull(const Stack* stk) {return stk->t==stk->c-1;

}• očitavanje (nedestruktivno)T top(const Stack* stk) {return stk->s[stk->t];

}

9

• očitavanje (destruktivno) odn. uklanjanjeT pop(Stack* stk) {return stk->s[stk->t--];

}• dodavanjevoid push(Stack* stk,T item) {stk->s[++stk->t]=item;

}

s

spop

push

t

t

4

10

Prevođenje izraza

• problem: prioritet operatora i zagrade

a + b * c //prvo se mnozi

(a + b) * c //prvo se sabira

• postfiksna ("inverzna poljska") notacija eliminiše zagrade

sabiranje oduzimanje množenje deljenje

infiksno A+B A-B A*B A/B

prefiksno +AB -AB *AB /AB

postfiksno AB+ AB- AB* AB/

11

• prevođenje u postfiksnu notaciju vrši algoritam koji je baziran na steku

• nema zagrada i izraz se skenira linearno, s leva u desno

A + B * 3 / (5 - H) A B 3 * + 5 H - /

12

Programski stek

• povezivanje potprograma: pozivajuća rutina se privremeno prekida i prelazi se na izvršavanje potprograma, a kada se on završi nastavlja se sa izvršenjem pozivajuće rutine od mesta (adrese!) na kojem je prekinuta

• povratne adrese su na steku

• rekurzivne funkcije mogu se realizovati upravo zahvaljujući steku

5

13

P0 P1 P2 P3

A0 A1 A2

A0

A1

A2

A0

A1

A0

14

lokalne promenljive, argumenti, adresa povratka,prethodni bp

bp

sp

stek frejm

15

Logička struktura reda (queue)

• definiše se kao uređeni par

F = (S(F),r(F))

– struktura je linearna

– pristupa se isključivo prvom elementu

– uklanja se isključivo prvi element

– dodaje se isključivo iza poslednjeg elementa

– struktura je homogena

• ključna reč je First In First Out (FIFO) – prvi unutra, prvi napolje

6

16

• operacije:– kreiranje (create)

– uništavanje (destroy, ako je na hipu)

– pristup (front, get)

– dodavanje (put, add, append)

– uklanjanje (delete, remove)

– provera da li je prazan (isEmpty)

– provera da li je pun (isFull, za sekvencijalno realizovan red)

– određivanje broja elemenata (size)

– pražnjenje (clear)

začelje

čelo

17

sekvencijalna fizička realizacija

• deskriptor:typedef struct {

int c, getPos,putPos;T *q;

} Queue;– T tip elemenata reda (tj. tip informacionog sadržaja)– c dužina niza u koji se smeštaju elementi– q niz sa elementima koji je na hipu– getPos mesto (indeks niza q) sa kojeg se čita element

(dakle, indeks čela reda)– putPos mesto (indeks niza q) na koje se upisuje

element pri dodavanju

niz!

18

• lažna prepunjenost: poslednja lokacija je popunjena i ne može se dodati, iako na početku ima mesta

0

x

1

y

2 c-1

. . .

getPos putPos

0

x

1

y

2 c-1

. . .

getPos

z

7

19

cirkularna fizička realizacija

• ako nema mesta na kraju reda, dodaje se kružno na početak

0

x

1

y

2 c-1

. . . z

getPosputPos

20

• međutim, sada se ne mogu razlikovati pun i prazan red (u oba slučaja je putPos==getPos)!

getPos

putPos

pun red prazan red

putPos==getPos

21

• rešenje: žrtvuje se jedna lokacija u koju nije dozvoljen upis

pun red prazan red

8

22

operacije• kreiranjevoid create(Queue* que,int capac) {que->c=capac+1; --stvarna duzina je za 1 veca od

deklarisanog kapacitetaque->getPos= que->putPos= 0;que->q=malloc(que->c*sizeof(T));

}• uništavanjevoid destroy(Queue* que) {free(que->q);

}

23

• prazan?int isEmpty(const Queue* que) {return que->getPos==que->putPos;

}• pun?int isFull(const Queue* que) {return que->getPos==(que->putPos+1)%que->c;

}• određivanje dužine (broja elemenata)int size(const Queue* que) {return (que->putPos>=que->getPos) ?

que->putPos-que->getPos :que->c+que->putPos-que->getPos;

}• pražnjenjeNa kraju, pražnjenje reda je vrlo jednostavno:void clear(Queue* que) {que->putPos=que->getPos;

}

24

• pristupT front(const Queue* que) {return que->q[que->getPos];

}• uklanjanjeT removeItem(Queue* que) {T item;item=que->q[que->getPos];que->getPos=(que->getPos+1)%que->c;return item;

}• dodavanjevoid putItem(Queue* que,T item) {que->q[que->putPos]=item;que->putPos=(que->putPos+1)%que->c;

}

9

25

alternativa

• U deskriptor treba uneti dodatno polje, recimo int n koje uvek sadrži aktuelnu dužinu reda

• U stanju praznog reda važi n=0, a za pun red n=c

• operacije se usporavaju

• koristi se ako iz drugih razloga treba pratiti dužinu reda

26

spregnuta fizička realizacija

• ostvaruje se povezivanjem elemenata (čvorova) pomoću pokazivača

• format čvora čine element (tj. sadržaj) i pokazivač na sledeći čvor

sadržaj elementa

pokazivač na sledeći

. . .last

first

pokazivač na čelo

pokazivač na začelje

27

typedef struct node {

T item; //sadrzaj elementa

struct node* next; //pokazivac na sledeci

} Node;

typedef struct {

int n; //duzina reda

Node *first,*last; //pok. na celo i zacelje

} Queue;

10

28

uklanjanje i dodavanje

. . .last

first

n

. . .last

first

n

29

Red sa prioritetima

• elementi sa većim prioritetom dodaju se bliže čelu

• prioritet se izražava celim nenegativnim brojem, tako da je najviši prioritet 0

• implementira se spregnuto, zbog dodavanja

. . .

last

first

nprioritet veći od p0

p0

prioritet jednak p0 prioritet manji od p0

30

typedef struct node {

int priority;

T item;

struct node* next;

} Node;

11

31

Logička struktura deka (deque)

• akronim od Double Ended Queue

• definiše se kao uređeni par

DK = (S(DK),r(DK))– struktura je bilinearna

– pristupa se elementima na oba kraja

– uklanjaju se elementi na oba kraja

– dodaje se na oba kraja

– struktura je homogena

. . .

. . .

32

• osnovne operacije

. . .

33

Fizička struktura deka (deque)

• može biti

– sekvencijalna: problemi isti kao i kod reda, ali udvostručeni

– spregnuta: sprezanje je dvostruko

. . .

right

left

n

12

34

Logička struktura sekvence

• definiše se kao uređeni par

D = (S(D),r(D))

. . .

. . .

35

. . .

tekući element

• struktura je linearna

• dozvoljen je pristup svakom elementu, po pravilu navigacijom

• ukloniti se mogu samo svi elementi odjednom

• element se dodaje na kraju sekvence

• sekvenca je homogena

36

operacije

• Operacija kreiranja, između ostalog, ima za zadatak da definiše poziciju tekućeg elementa

• pristup u svrhu čitanja informacionog sadržaja elementa

• pristup u svrhu izmene informacionog sadržaja elementa

• dodavanje na kraj sekvence

• uklanjanje svih elemenata (pražnjenje)

13

37

• operacija promene pozicije tekućeg elementa• operacija očitavanja pozicije tekućeg elementa• operacija provere da li je marker tekućeg elementa

postavljen iza poslednjeg elementa (uslov za dodavanje u sekvencu)

• operacija vraćanja markera na početak sekvence• uništavanje sekvence• provera da li je sekvenca prazna• određivanje dužine sekvence (može biti izražena

brojem elemenata ili u bajtovima)• redosledna obrada sekvence• sortiranje sekvence

38

Fizička realizacija sekvence

• najpoznatiji oblik sekvence je masovna struktura datoteke (koja nije deo programa)

• realizacija je kombinovana (sekvencijalno-spregnuta)

39

Sortiranje datoteke

• bitno drukčija problematika od sortiranja niza jer se izbegava promena mesta elemenata

• kombinacija internog sortiranja (sortiranja u operativnoj memoriji) segmenata datoteke i prepisivanja čitavih segmenata na disk

• nosi naziv sortiranje mešanjem

• ima više varijanata

14

40

Sortiranje mešanjem

1. podeliti datoteku na manje delove (segmente) koji mogu da stanu u operativnu memoriju i sortirati svaki od njih nekom od ranije opisanih metoda (faza disperzije, dispersion); broj segmenata zove se red mešanja

2. kombinovati segmente u jednu, sortiranu, datoteku (faza mešanja, merge)

41

file

sort

sort

sort

sort

F$0

F$1

F$2fazadisperzije

F$0

F$1

F$2merge filefaza

mešanja

1

5 LISTE

1

2

• među najčešće korišćenim kontejnerskim strukturama

• ključna reč: fleksibilnost

• isključivo spregnuta realizacija

• vrste:

– jednostruko spregnuta lista

– dvostruko spregnuta lista

– multilista ili višestruka lista

važne!

3

Logička struktura jednostruko spregnute liste

• Jednostruko spregnuta lista je uređeni parL = (S(L), r(L))

• struktura je linearna• dozvoljen je pristup svakom elementu, pri čemu su

zastupljene sve tri vrste pristupa: prema poziciji, prema ključu i navigacijom

• dozvoljeno je uklanjanje bilo kojeg elementa• element se može dodati na bilo kojem mestu u listi.

2

4

• zbog osobine fleksibilnosti, postoji mnogo varijanata liste koje se različito ponašaju, npr.– lista sa ključevima i bez njih

– sortirana i nesortirana lista

– lista sa navigacijom i bez nje

– i sve moguće kombinacije prethodnih stavki

• od predviđenih osobina liste direktno zavisi njena fizička realizacija što znači

• da se lista mora projektovati u skladu sa konkretnom namenom

• može se, čak, dogoditi da se u istom programu koristi više različitih vrsta liste!

5

• dve karakteristične varijante jednostruko spregnute liste (nisu jedine!):

– jednostavna lista

– jednostruko spregnuta lista sa ključevima

6

Jednostavna lista (Simple List)• Osobine:

– redosled elemenata (čvorova) liste je proizvoljan (dakle, u principu, dodaje se na početak liste)

– osnovni način pristupa je pristup prema poziciji

– ne postoji mehanizam navigacije

3

7

typedef struct node {T item;struct node* next;

} Node;typedef struct {

int n;Node *first;

} SimpleList;

item next

element (čvor) liste

pokazivač na sledeći

. . .first

n

deskriptor

dužina

8

Operacije//Kreiranje listevoid create(SimpleList* lst) {lst->first=NULL;lst->n=0;

}//Provera da li je lista prazna:int isEmpty(const SimpleList* lst) {return lst->first==NULL;

}//Odredjivanje duzine listeint size(const SimpleList* lst) {return lst->n;

}

9

Pristup

T* getItem(const SimpleList* lst, int position) {

Node *curr; int pos;

for(curr=lst->first,pos=0;pos<position;pos++) curr=curr->next;

return &(curr->item);

}

position

. . .first

n

O[n] (kod niza je O[1])

4

10

Uklanjanje

T removeItem(SimpleList* lst, int position) {T itm; Node *prev,*curr; int pos;prev=curr=lst->first;for(prev=curr=lst->first,pos=0;pos<position;pos++) {prev=curr; curr=curr->next;}if(pos==0) lst->first=curr->next; //uklanjanje prvogelse prev->next=curr->next; //uklanjanje cvora koji nije prviitm=curr->item;lst->n--;free(curr);return itm;

}

. . .first

n

prev curr

11

Dodavanje

void putItem(SimpleList* lst, T item) {Node *newNode;newNode=malloc(sizeof(Node));newNode->item=item;newNode->next=lst->first;lst->first=newNode;lst->n++;

}

. . .first

n

newNode

12

• inače, jednostavna lista može se snabdeti i dodavanjem na zadatu poziciju

void putItem(SimpleList* lst, int position, T item);

• štaviše, mogu postojati dva dodavanja: ispred zadate pozicije i iza zadate pozicije

void putBefore(SimpleList* lst, int position, T item);

void putAfter(SimpleList* lst, int position, T item);

. . .first

n

position

5

13

Pražnjenje liste

void clear(SimpleList* lst) {Node *curr=lst->first,*tmp;while(curr) {

tmp=curr;curr=curr->next;free(tmp);

}lst->first=NULL;lst->n=0;

}

. . .first

n

currtmp

14

Redosledna obrada

void traverse(SimpleList* lst, void (*pDoIt)(T* pItem)) {

Node *curr=lst->first;

do {

(*pDoIt)(&(curr->item));

} while((curr=curr->next)!=NULL);

}

. . .first

n

f-ja koja se izvršava za svaki element

15

Lista s ključevima• elementi sadrže polje koje ih jednoznačno određuje (ključ)• razlika u odnosu na jednostavnu listu: pristup i uklanjanje se ne obavljaju

na osnovu zadate pozicije, nego na osnovu zadatog ključa (argument traženja); mogu biti i neuspešni

• obično se lista održava sortiranom po vrednosti ključa (nije obavezno)

typedef struct node {int key;T item;struct node* next;

} Node;

typedef struct {int n;Node *first;

} KeyedList;

ključ

6

16

int putItem(KeyedList* lst, int key, T item) {Node *newNode,*curr,*prev;prev=NULL; curr=lst->first;while(curr&&(curr->key<key)) {prev=curr; curr=curr->next;} //trazenje mestaif(curr&&(curr->key==key)) return 0; //dupliran kljucnewNode=malloc(sizeof(Node)); //formiranje novog cvoranewNode->key=key; newNode->item=item;if(!prev) {newNode->next=lst->first; lst->first=newNode;} //novi cvor je prvielse {newNode->next=curr;prev->next=newNode;} //novi cvor nije prvilst->n++;return 1;

}

Dodavanje u sortiranu listu s ključevima

km km+1. . .first

n

k0

km < k0 < km+1

17

• striktno izbegavati metode koje zahtevaju pristup prema poziciji; ova stavka, recimo, eliminiše quicksort kao efikasnu metodu za sortiranje jednostruko spregnute liste

• izbegavati metode koje zahtevaju kretanje po listi u oba smera; metoda umetanja je upravo takva metoda

Sortiranje jednostruko spregnute liste

18

• prilikom izrade funkcije za sortiranje ni pod kojim uslovima ne vršiti izmenu mesta čvorovima; dovoljno je razmenjivati njihov sadržaj.

• najpogodnije: metoda izbora i bubblesort

A B . . .first

n

NE!

A B . . .first

n

DA

7

19

void bubbleSort(SimpleList* lst) {T tmp; Node* curr; int i,j,chn; //chn=0: nije bilo zamena u prolazu; zavrsiti

for(chn=1,i=lst->n-1;chn&&(i>0);i--)for(curr=lst->first,j=chn=0;j<i;curr=curr->next,j++)

if(curr->item>curr->next->item){tmp=curr->item;curr->item=curr->next-

>item;curr->next->item=tmp;chn=1;}}• napomena: lista s ključevima se obično ne

sortira nego se, pri dodavanju, održava sortiranom

20

Logička struktura dvostruko spregnute liste

• Dvostruko spregnuta lista je uređeni parDL = (S(DL), r(DL))

• struktura je bilinearna, tj. relacija r(DL) može se razbiti na dve, r1 i r2 tako da bude

r1Ur2 = r(DP), (S(DL), r1) je linearna struktura

(a,b)r1 (b,a)r2

r1

r2

21

• dozvoljen je pristup svakom elementu, pri čemu su zastupljene sve tri vrste pristupa: prema poziciji, prema ključu i navigacijom

• dozvoljeno je uklanjanje bilo kojeg elementa

• element se može dodati na bilo kojem mestu u listi

• omogućuje prolazak kroz elemente u oba smera

• i zato je pogodna za realizaciju navigacije

8

22

Fizička struktura dvostruko spregnute liste

• spregnuta• svaki čvor snabdeven sa dva pokazivača koji

realizuju dve veze

item rightleft

pokazivač na levog suseda

pokazivač na desnog suseda

23

Dvostruko spregnuta lista sa navigacijom

• umesto "čistog" pokazivača na levi i desni kraj koristi se tehnika sentinela

• sentinel ima isti format kao i čvor, ali nije član liste• pojednostavljuje algoritme• backupcurrent privremeno memoriše adresu

tekućeg, za slučaj da je treba restaurisati

. . .leftSentinel

n

rightSentinel

current

*

*

backupCurrent

24

typedef struct node {T item;struct node* left;struct node* right;

} Node;

typedef struct {int n;Node leftSentinel;Node rightSentinel;Node *current;Node *backupCurrent;

} DoubleList;

9

25

• operacija create kreiranja liste, koja mora postojati i koja dovodi listu u početno stanje prazne liste

• operacije čitanja i upisa u listu, lread i lwrite• operacije uklanjanja i dodavanja, removeItem i

putItem• operacije vezane za upravljanje pozicijom tekućeg

elementa, lseek i ltell• indikatori koji daju informaciju o veličini liste (size), o

tome da li je lista prazna (isEmpty) i o tome da li je trenutna pozicija tekućeg elementa na sentinelu (isSentinel)

• operacija clear za pražnjenje liste• operacije saveCurrent i restoreCurrent za odlaganje i

restaurisanje pozicije tekućeg elementa

Operacije

26

kreiranje i pražnjenje liste

leftSentinel

0

rightSentinel

current

*

*

-

nbackupCurrent

void create(DoubleList* lst);void clear(DoubleList* lst);

27

int lread(DoubleList* lst,void* item, int itemsize, int direction);

čitanje sadržaja tekućeg elementa

adresa prom. u koju se učitava

veličina prom. u koju se učitava

položaj markera posle učitavanja:LEFT - ulevoRIGHT - udesnoCURRENT ostaje na istom mestu

10

28

int lwrite(DoubleList* lst,void* item, int itemsize, int direction)

upis sadržaja tekućeg elementa

adresa prom. koja se upisuje

veličina prom. koja se upisuje

položaj markera posle upisa:LEFT - ulevoRIGHT - udesnoCURRENT ostaje na istom mestu

29

int removeItem(DoubleList* lst) ;

• vraća 1 ako je uspelo, inače 0

uklanjanje čvora

current

30

int putItem(DoubleList* lst,T item,int direction);

dodavanje čvora

current

novi čvor se dodaje:LEFT - levo od tekućegRIGHT - desno od tekućeg

rezultat: 1 ako je uspelo, inače 0

11

31

int lseek(DoubleList* lst, int offset, int base);• pomeranje markera na zadatu poziciju

upravljanje markerom

base = LEFT base = RIGHTbase = CURRENT

offset

32

• lista prazna?

int isEmpty(const DoubleList* lst);

• položaj markera u odnosu na levi kraj

int ltell(DoubleList* lst);

• marker na sentinelu?

int isSentinel(const DoubleList* lst);

indikatori

33

• može početi na levom kraju i pomerati se ka desnom i obrnuto

T info; //promenljiva za ucitavanje informacionog sadrzaja

lseek(&lst,0,LEFT); //postavljanje tekućeg na levi kraj liste

while(lread(&lst,&info,sizeof(T),RIGHT)) obraditi info

T info;

lseek(&lst,0,RIGHT); //postavljanje tekućeg na desni kraj liste

while(lread(&lst,&info,sizeof(T),LEFT)) obraditi info

Redosledna obrada

tip polja item

12

34

• ako treba obraditi čvor na poziciji position, prvo se tekući postavlja na tu poziciju, pa se vrši obrada

T info;

lseek(&lst,position,LEFT); //pozicioniranje tekuceg

lread(&lst,&info, sizeof(T),CURRENT) //marker tekuceg se ne pomera

obraditi promenljivu info

Direktna obrada na zadatoj poziciji

35

• kod dvostruko spregnute liste može se koristiti i metoda umetanja jer ova lista dozvoljava kretanje u oba smera (Quicksort i dalje ne!)

void insertionSort(DoubleList* lst) {

Node *first,*pI,*pJ; T tmp;

if(lst->n<2) return;

for(first=lst->leftSentinel.right,pI=first->right;pI->right;pI=pI->right)

for(pJ=pI;(pJ!=first)&&(pJ->item)<(pJ->left->item);pJ=pJ->left)

{tmp=pJ->item;pJ->item=pJ->left->item;pJ->left->item=tmp;}

lst->current=lst->leftSentinel.right;

}

Sortiranje dvostruko spregnute liste

36

Logička struktura multiliste

• Multilista je uređena n+1-orka

ML = (S(ML),r1,...,rn)

gde je S(ML) skup elemenata, dok su r1,...,rn

binarne relacije u tom skupu takve da svaki uređeni par (si,ri), siS(ML), i=1,...,n, čini jednostruko ili dvostruko spregnutu listu

13

37

• realizuje se isključivo spregnuto, pri čemu se za svaku podlistu, čvor proširuje dodatnim pokazivačem (ili parom pokazivača ako je podlista dvostruka)

• U deskriptoru se nalaze pokazivači (ili sentineli) na svaku podlistu ponaosob

• Broj i vrsta podlisti (jednostruko ili dvostruko spregnuta) mora se znati unapred i ne može se menjati bez reprogramiranja

Fizička struktura multiliste

38

• multilista je pogodna za pretraživanje po tzv. sekundarnom ključu (deo sadržaja koji neopisuje element jednoznačno)

• dodavanje u multilistu: novi čvor se uključuje u potrebne podliste

• dodavanje u podlistu: već postojeći čvor se uključuje u podlistu

• isto važi i za uklanjanje• ako se izmeni polje koje je sekundarni ključ to

zahteva promenu podliste

Operacije

39

• primarna podlista koja povezuje sve čvorovetreba da postoji i ona može biti jednostruko ili dvostruko spregnuta

• ostale podliste treba da budu realizovane dvostrukim sprezanjem

preporuke

1

6 STABLO

1

2

opšte

• stablo (tree) odražava fundamentalni odnos hijerarhije

ključna reč

3

digraf

• ulazni (izlazni) stepen čvora: broj grana koje ulaze u čvor (izlaze iz čvora)

• Niz čvorova i grana x1v1x2v2x3v3...xnvnxn+1 takav da je grana vi predstavlja ili par (xi,xi+1) ili par (xi+1,xi) nosi naziv lanac dužine n

• put dužine n je skup čvorova i grana x1v1x2v2x3v3...xnvnxn+1 u kojem je vi=(xi,xi+1)

• slabo povezan digraf: svaka dva čvora povezana lancem

ab

c d

e

f

gulazni stepen: 3izlazni stepen: 1

put dužine 3

lanac dužine 4

2

4

orijentisano stablo

1. postoji tačno jedan čvor sa ulaznim stepenom 0 (tzv. koren stabla)

2. svi ostali čvorovi imaju ulazni stepen 1

3. digraf je slabo povezan

nadređeni b i podređeni d

podstablo generisano čvorom f

5

• umesto prethodnik-sledbenik govorimo nadređeni-podređeni• list: čvor bez podređenih• visina stabla: broj čvorova na najdužem putu• red stabla: najveći izlazni stepen čvora• hijerarhijski nivo čvora: rastojanje od korena

a

cb

d f ge

i j k lh

koren

list

visina: 4red: 4

hij. nivo 2

kompletno stablo

6

• kompletno stablo reda n je stablo u kojem svi čvorovi osim listova imaju izlazni stepen n.

• puno stablo je stablo u kojem su putevi od korena do proizvoljnog lista iste dužine

• perfektno balansirano stablo: broj čvorova u podstablima na istom hijerarhijskom nivou razlikuje se najviše za 1

puno stablo perfektno balansirano stablo

3

7

Stablo kao struktura podataka

• stablo je struktura podataka

T = (S(T),r(T))

za koju važi:

– pripadajući digraf je (orijentisano) stablo

– dozvoljen je pristup svakom elementu

– dozvoljene su operacije uklanjanja i dodavanja, pod uslovom da ne narušavaju definicione osobine konkretne vrste stabla.

• u opštem slučaju, pristupa prema poziciji nema, jer je nemoguće definisati poziciju

8

n-arno stablo

• u skupu podređenih svakog elementa postoji eksplicitno linearno uređenje i to na nivou logičke strukture

• stablo je reda n, što znači da element ne može imati više od n podređenih, pri čemu se projektovani red n ne može menjati.

9

pristup prema ključu

• sub(k0,e): oznaka podređenog koji je odabran na osnovu argumenta traženja k0 i trenutno razmatranog elementa e

• složenost je O[N] u (retkom) najgorem slučaju ili (mnogo češće) O[lognN], gde je N broj elemenata

ne

ne

da

da

ekoren

e= element nije pronađen

k(e)=k0 element je pronađen

esub(k0,e)

n = 4

4

10

fizička realizacija n-arnog stabla

• spregnuta, a u specijalnom slučaju sekvencijalna• svaki čvor proširen sa n pokazivača na podređenetypedef struct node {

T item;struct node* next[ORDER]; //ORDER je konst.

} Node;typedef struct {

Node *root;} NaryTree;

item p[0] p[1] ... p[n-1]

pokazivač na koren

11

A

B C D

E F G H

A

C * * *B * D *

E * * * F * * * G * * * H * * *

deskriptor

12

sekvencijalna realizacija• samo u (vrlo) specijalnom slučaju kada je

– stablo binarno (reda 2)

– stablo malo

– stablo nepromenljivo

5

13

1. koren se smešta na adresu 12. ako je čvor na adresi k tada se levi podređeni

smešta na adresu 2k, a desni podređeni na 2k+1

• brze operacije, ali i (pre)velik utrošak memorijskog prostora

A

B C

D

F

E

G

A B C D E F G

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 201 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

14

Binarno stablo• po definiciji, to je stablo reda 2

• najviše korišćeno od svih n-arnih stabala i na logičkom i na fizičkom nivou

• tradicionalno, podređeni se zovu levi i desni podređeni

• traženje se obavlja opštim algoritmom i

• u proseku složenosti traženja je O[log2N] (vrlo brz algoritam!)

15

redosledna obrada ("obilazak")

• nužno rekurzivan algoritam

• rekurzija bazirana na rasporedu– čvor

– levo podstablo

– desno podstablo

• svaki redosled ove tri stavke generiše poseban algoritam (tj. algoritama ima 3!=6)

• svi počinju od korena

6

16

• obilazak s leva u desno (inorder traversal)– levo podstablo

– čvor

– desno podstablo

• obilazak s vrha ka dnu (preorder traversal)– čvor

– levo podstablo

– desno podstablo

• obilazak s dna ka vrhu (postorder traversal)– levo podstablo

– desno podstablo

– čvor

CF

17

A

obilazak s leva u desno

• prilikom prelaska na niži nivo adresa nadređenog odlaže se u pomoćnu strukturu koja je stek

• s leva u desno: G, D, H, B, A, E, C, I, F

• s vrha ka dnu: A, B, D, G, H, C, E, F, I

• sa dna ka vrhu: G, H, D, B, E, I, F, C, A

A

B

D

G H

C

E F

IB

D

18

postupcitypedef struct node {

T item;

struct node *left,*right;

} Node;

typedef struct {

Node *root;

} BinTree;

item rightleft

7

19

void _inorder(Node *node,void (*visit)(Node* x)) {if(node) {_inorder(node->left,visit);visit(node);_inorder(node->right,visit);

}}

void _preorder(Node *node,void (*visit)(Node* x)) {if(node) {visit(node);_preorder(node->left,visit);_preorder(node->right,visit);

}}

void _postorder(Node *node,void (*visit)(Node* x)) {if(node) {_postorder(node->left,visit);_postorder(node->right,visit);visit(node);

}}

20

void inorder(BinTree* bt,void (*visit)(Node* x)) {_inorder(bt->root,visit);

}

void preorder(BinTree* bt,void (*visit)(Node* x)) {_preorder(bt->root,visit);

}

void postorder(BinTree* bt,void (*visit)(Node* x)) {_postorder(bt->root,visit);

}

"omotači"

21

pražnjenje• primenom obilaska sa dna ka vrhu

void clearNode(Node* x) {

free(x);

}

void clear(BinTree* bt) {

_postorder(bt->root,clearNode);

bt->root=NULL;

}

8

22

tehnika prošivki• ubrzanje obilaska s leva u desno eliminisanjem steka• na mestu gde je desni pokazivač NULL ubacuje se

pokazivač na sledeći u procesu obilaska• statusno polje indikuje da li je pokazivač ili prošivka

A 0

B 1 C 0

D 0 E* 1 F 0 *

G* 1 H* 1 I* 1

statusno polje

prošivkapokazivač

23

dvostruke prošivke• ubrzanje obilaska s leva u desno i obrnuto• na mestu gde je desni pokazivač NULL ubacuje se pokazivač na sledeći u procesu

obilaska• na mestu gde je desni pokazivač NULL ubacuje se pokazivač na sledeći u procesu

obilaska• statusno polje indikuje da li je pokazivač ili prošivka

A 0

B 1 C 0

D 0 E 1 F 0 *

G* 1 H 1 I 1 desna prošivka

0

0

0

0

1

1

0

1leva prošivka

24

Binarno stablo pristupa

• binarno stablo s ključevima

• za svaki čvor važi:

– ključevi u levom podstablu manji od njegovog, a u desnom podstablu veći od njegovog (BST invarijanta)

50

80

90

95

60

55 67

62 75

70

30

4020

10 35

9

25

typedef struct node {

K key;

T item;

struct node *left,*right;

} Node;

typedef struct {

Node *root;

} BinSearchTree;

26

traženje

ne

ne

da

da

ekoren

k(e)=

k(e)=k0

k0:k(e)

eright(e)eleft(e)

><

element nije pronađen

element je pronađen

O[log2N]

27

40

50

80

90

95

60

55 67

62 75

70

30

4020

10 35

100

55

10

28

dodavanje• na mestu lista (novi čvor postaje list)

50

80

90

95

60

55 67

62 75

70

30

4020

10 35 47

15

dodati elementi

29

uklanjanje

• nešto veći problem, jer se mora održavati BST invarijanta

• logičko brisanje i Hibardova metoda

30

logičko brisanje

• čvorovi se snabdevaju binarnim statusnim poljem "važi-ne važi"

• prilikom uklanjanja čvor ostaje, a statusno polje se setuje na "ne važi"

• broj čvorova je neopadajući

• pristupni putevi se produžavaju

• zahteva povremeno rekonfigurisanje

11

31

Hibardova (Hibbard) metoda

• dva slučaja:

1. čvor za uklanjanje ima manje od dva podređena

2. čvor za uklanjanjanje ima dva podređena

• u prvom slučaju moguće je prevezivanje

20

10* *

* *

30

40

35* *

*

30

uklanja se

uklanja se

32

• u drugom slučaju prevezivanje nije moguće

nadređeni

uklanja se

nema mesta za dvapokazivača

33

• neka je d čvor koji treba ukloniti, a koji ima oba podređena

1. pronaći element e čiji je ključ prvi manji od ključa elementa d (alternativa: prvi veći); taj element ne može imati desnog podređenog zbog invarijante BST

2. prepisati ključ i informacioni sadržaj tog elementa u element d, a zatim osloboditi element e, pri čemu je prevezivanje njegovog (eventualnog) podređenog sada moguće.

12

34

• preći u levo podstablo elementa d (alternativa: desno); ovde su elementi čiji su ključevi manji (alternativa: veći) od ključa elementa d

• pratiti desne pokazivače (alternativa: leve) sve dok se ne dođe do čvora koji nema desnog (alternativa: levog) podređenog; to je traženi element.

75

80

75 *

50

briše se

60

55* * 67

62* *

70* *

treba ukloniti 80

35

80

75 *

50

60

55* * 67

62* *

70* *

treba ukloniti 80

75

36

Balansiranje binarnog stabla• osnovni uticajni faktor na performansu stabla

jeste njegova visina (broj čvorova na najdužem putu); manja visina-bolja performansa i obrnuto

• najbolju performansu za zadati red i broj čvorovadaje perfektno balansirano stablo

• dva pristupa:

– povremeno balansiranje posebnim algoritmom (offline balansiranje), koje je nepogodno

– održavanje stabla u balansiranom stanju (online balansiranje)

13

37

Rotacija• operacija preuređenja čvorova koja ujednačava

visine levog i desnog podstabla uz održavanje BST invarijante

38

rotacija ulevo

Node* rotL(Node* x) {Node *node = x->right;x->right = node->left;node->left = x;return node;}

x

y z

A B C D

z

y

A B

C

D

x

rezultat: z

rotL(x)

39

rotacija udesno

Node* rotR(Node* x) {Node *node = x->left;x->left = node->right;node->right = x;return node;}

x

y z

A B C D

y

zA

B

C D

x

rezultat: y

rotR(x)

14

40

AVL stablo• G. Adelson-Velskij i E.M.Landis, 1962.

• poboljšava performansu tako što održava stablo u visinskom balansu

• visinski balans: visina levog i desnog podstabla ma kojeg čvora razlikuju se najviše za 1

• AVL invarijanta: u svakom trenutku svaki čvor je visinski balansiran

41

• perfektno balansirano stablo je i visinski balansirano; obrnuto ne važi

perfektno balansiranovisinski balansirano(nije perfektno balansirano)

42

• da bi se održao visinski balans, za svaki čvor mora se pratiti visina h odgovarajućeg podstabla

typedef struct node {K key;T item;struct node *left,*right;int h;

} Node;typedef struct {

Node *root;} AVLTree;

• faktor balansa čvora x: bf(x) = x.left.h- x.right.h• AVL invarijanta: |bf(x)| 1

15

43

#define max(A,B) (((A)>(B))?(A):(B))#define geth(NODE) ((!(NODE))?0:((NODE)->h))#define getBalance(NODE) ((NODE)?(geth(NODE->left)-geth(NODE->right)):0)

//rotate leftNode* leftRotate(Node* x) {Node *y = x->right;x->right = y->left;y->left = x;//azurirati visinux->h=max(geth(x->left),geth(x->right))+1;y->h=max(geth(y->left),geth(y->right))+1;return y;

}

//rotate rightNode* rightRotate(Node* x) {Node *y = x->left;x->left = y->right;y->right = x;//azurirati visinux->h=max(geth(x->left),geth(x->right))+1;y->h=max(geth(y->left),geth(y->right))+1;return y;

}

44

dodavanje• u prvoj fazi, pronalazi se mesto za dodavanje

čvora standardnom rekurzivnom varijantom metode

• u drugoj fazi vrši se visinsko balansiranje čvorova u smeru ka korenu; pošto se radi o rekurzivnoj funkciji, na steku se nalazi kompletan put (adrese čvorova) od čvora nadređenog novododatom do korena.

45

u slučaju disbalansa ...• ako je dodavanje izazvalo disbalans u nekom

čvoru, taj čvor mora biti negde na putu do korena• Neka je z čvor u kojem je detektovan disbalans, y

njegov neposredni podređeni, a x neposredni podređeni čvora y; moguća su četiri slučaja:– y je levi podređeni z i x je levi podređeni y (slučaj levi-

levi)– y je levi podređeni z i x je desni podređeni y (slučaj

levi-desni)– y je desni podređeni z i x je desni podređeni y (slučaj

desni-desni)– y je desni podređeni z i x je levi podređeni y (slučaj

desni-levi)

16

46

z

y t4rightRotate(z)

x

t1 t2

t3

levi-levi

y

x z

t1 t4t3t2

z

y t4leftRotate(y)

t1

t3t2

x

levi-desni

x

y z

t1 t4t3t2

z

x t4

y

t2t1

t3

rightRotate(z)

47

z

yt14leftRotate(z)

t2

t3 t4

x

desni-desni

y

z x

t1 t4t3t2

z

y

t4rightRotate(y)

t1

t3t2

x

desni-levi

x

z y

t1 t4t3t2

z

xt1

t2

t4t3

y

leftRotate(z)

48

uklanjanje• ukloniti čvor standardnim (Hibardovom)

algoritmom; neka je to čvor w

• počev od w pratiti put ka korenu (put se nalazi na steku); neka je z prvi čvor sa disbalansom, ynjegov podređeni sa većom visinom, a xpodređeni čvora y, opet sa većom visinom; izvršiti rebalansiranje podstabla sa korenom z; nastaviti sa postupkom sve dok se ne obradi i koren celog stabla.

17

49

u slučaju disbalansa ...• moguća su 4 slučaja:

– y je levi podređeni čvora z i x je levi podređeni čvora y (slučaj levi-levi)

– y je levi podređeni, a x je desni podređeni (slučaj levi-desni)

– y je desni podređeni i x je desni podređeni (slučaj desni-desni)

– y je desni podređeni, a x je levi podređeni (slučaj desni-levi)

• postupci su isti kao kod dodavanja!

50

Uopšteno (generalisano) stablo

• raspored podređenih elemenata datog elementa je proizvoljan i njihov broj nije ograničen

• rekurzivna definicija: stablo je ili prazno ili je uređeni par (x,P) gde je x izdvojeni element, a P jednostruko spregnuta lista čiji su elementi međusobno različ ita uopštena stabla– dozvoljen je pristup svakom elementu

– element se može dodati na bilo kojem mestu

– može se ukloniti bilo koji element

51

u praksi ...• glavna vrsta pristupa je navigacija• dodaje se na mestu lista• pri uklanjanju, briše se čitavo podstablo generisano zadatim

elementom• elementi se prepoznaju po jedinstvenom identifikatoru iz skupa u

kojem nema linearnog uređenja (te, stoga, nije ključ); identifikator se sastoji od imena koje ne mora biti jedinstveno i puta od korena do tog elementa

A

CC

GCE

B

F

C

C

D

H XA-D-H

18

52

dodatne operacije• kreiranje stabla

• provera da li je stablo prazno

• brisanje celog stabla

• promena tekućeg elementa te, s njom u vezi, operacija prelaska na nadređeni element

• dodavanje podstabla

• obilazak (tj. redosledna obrada)

53

Fizička realizacija• Standardni način: tzv. binarna realizacija

informacioni sadržaj

pokazivač na sledeći u listi

pokazivač na početak liste podređenih

54

A

CC

GCE

B

F

C

C

D

H

deskriptor

Akoren *

B C * D *

E * F * G * * H * *

tekući

1

1 UOPŠTE O ALGORITMIMA

1

2

Uvod• naziv "algoritam" - od imena velikog

arapskog matematičara Abu Jaffar Mohammed ibn Musa Al-Khowarizmi (Al-Horezmi)

• dao je i ime algebri (knjiga Al Jabbar-"uzglobljavanje")

3

Empirijska definicija algoritma

• Algoritam je pravilo, formulisano na nekom jeziku, koje jednoznačno definiše redosled operacija neophodan za transformaciju dozvoljenih ulaznih podataka u traženi rezultat.

2

4

Sintetička definicija algoritma

• apstraktni alfabet: konačan skup simbola bez semantike, X = , , ,

• reč dužine n: sekvenca od n simbola iz alfabeta; n je dužina reči; , , (prazna reč) i su reči dužine respektivno 6, 2, 0 i 3

• X*: skup svih reči nad alfabetom X, uključujući i praznu reč

• X+: skup svih reči nad alfabetom X bez prazne reči• alfabetski operator: relacija između reči dva (ne

obavezno različita) alfabeta X i Y;G X* x Y*

5

• Algoritam je uređena četvorka (X, Y, G, Z), gde su X i Y respektivno ulazni i izlazni alfabet, G X* x Y*alfabetski operator, a Z konačni skup zakona kojima se G zadaje. Skup Znazvaćemo kodeks.

6

• Dva algoritma su ekvivalentna po izvršenju ako se slažu odgovarajući alfabetski operatori i kodeks po kojima se oni izvršavaju. Drugim rečima, algoritmi A1 = (X1, Y1, G1, Z1) i A2 = (X2, Y2, G2, Z2) su ekvivalentni po izvršenju ako je, u matematičkom smislu, A1 = A2

• Dva algoritma su funkcionalno ekvivalentna ako se razlikuju samo po kodeksu, tj. ako za iste ulazne podatke daju isti izlaz, pri čemu se do vrednosti izlaza dolazi na drugi način. Za gornji primer to bi značilo da se u uređenim četvorkama mogu razlikovati samo Z1 i Z2.

3

7

• algoritmi mogu biti deterministički kada se za isti ulaz uvek dobija isti izlaz (tj. alfabetski operator je funkcija), ali i stohastički za koje to ne važi; za determinističke algoritme, dakle, važi

G: X* Y*

1

2 ALGORITAMSKI SISTEMI

1

2

• Postoje li sredstva kojima bi se zadao bilo koji algoritam ili bar algoritam koji mu je funkcionalno ekvivalentan?

• Odgovor na ovo pitanje još nije dat, osim na nivou (doduše krajnje verovatnih) hipoteza. Formalizmi (sredstva) kojima se zadaju algoritmi nose naziv algoritamski sistemi

• svi algoritamski sistemi su međusobno ekvivalentni

3

Osnovna hipoteza teorije algoritama

• svaki algoritam može se predstaviti algoritamskim sistemom

2

4

najpoznatiji algoritamski sistemi su

• rekurzivne funkcije

• Tjuringove mašine

• Markovljevi normalni algoritam

5

Tjuringove mašine• Alan Turing, 1936.• pogled na algoritam iz ugla izvršioca• matematička apstrakcija čija je konkretizacija

računar• više varijeteta koji su međusobno ekvivalentni• specijalna i univerzalna Tjuringova mašina

(opet ekvivalentne!)• specijalna TM odgovara jednom algoritmu, a

univerzalna obuhvata sve algoritme

6

osnovni zadatak:

• formalno pretvaranje ulazne rečinekog apstraktnog alfabeta u izlaznu reč koja predstavlja rezultat

3

7

izgled Tjuringove mašine

... ...B a1 a2 a3 ... an-1 an B B

sbeskonačna traka

upisno-čitajuća glava

upravljački blok

prazna ćelija ćelija sa simbolom

stanje upravljačkog bloka

8

• beskonačna traka igra ulogu memorije; podeljena je na ćelije u kojima se nalaze simboli iz tzv. spoljašnjeg alfabeta ili su prazne (oznaka B)

• upravljački blok nalazi se u nekom stanju iz skupa stanja (tzv. unutrašnji alfabet); upravlja radom TM

• upisno-čitajuća glava upisuje/čita simbol; može se pomerati

9

rad Tjuringove mašine• na početku rada, upravljački blok je u

početnom stanju, a između praznih ćelija nalazi se ulazna reč

• dalji rad odvija se u tzv. pokretima (engl. move):

1. menja se stanje upravljačkog bloka2. upisuje se slovo koje nije B ispod UČG; slovo

može biti i tzv. prazno slovo3. UČG se pomera za jedno mesto ulevo ili udesno

• rad se završava kada upravljački blok uđe u neko od završnih stanja

4

10

Formalna definicija TM

• uređena šestorka (K, , , , q0, F) čije su komponente:

K je konačan skup stanja upravljačkog bloka (unutrašnji alfabet) je spoljašnji alfabet koji sadrži i B (praznu ćeliju), a po potrebi i

prazno slovo ( \ B) je podskup skupa koji ne sadrži B i koji nosi naziv

skup ulaznih slova: ((K x ) K x ( \ B) x L, R je funkcija prelaza koja ne

mora biti definisana na celom domenu. L i R su specijalni simboli koji označavaju kretanje UČG (L = ulevo, R = udesno)

q0 K je početno stanjeF K je skup završnih stanja.

11

funkcija prelaza

: ((K x ) K x ( \ B) x L, R

• (q,x)=(q',x',R) znači:

– ako je upravljački blok bio u stanju qi ispod UČG bilo slovo x, tada će upravljački blok preći u stanje q', biće upisano slovo x' i UČG će se pomeriti za jedno mesto udesno

x'x

q'

12

... ...B a1 a3 ... an-1 an B B

q

(q,x) = (q',x',R)

5

13

• Pod konfiguracijom Tjuringove mašine podrazumevamo uređenu trojku (q, , i) gde je q tekuće stanje, aktuelna reč na traci, a iudaljenost upisno-čitajuće glave od početka (krajnjeg levog slova) reči

• funkcionalna shema - tablica čije vrste odgovaraju stanjima iz skupa K, a kolone slovima spoljašnje azbuke

14

Prikaz TM na kvazi-C

• Beskonačna traka: beskonačni niz cell čiji su indeksi celi brojevi

• Na početku rada UČG se nalazi iznad pozicije sa indeksom 0, gde je i prvi simbol ulazne reči.

• Ceo broj i: tekuća pozicija upisno-čitajuće glave, tako da je na početku rada i=0.

• Označimo sa cell[i] simbol koji se nalazi na poziciji i.

• Neka važi L,R.

15

• Rad Tjuringove mašine može se predstaviti sledećim ciklusom:

q = q0; i = 0;

while(qF) {

(q,a,) = (q, cell[i]);

cell[i] = a;

i = (==R) ? i+1 : i-1;

}

6

16

primer

Neka je data Tjuringova mašina T = (K, , , , q0, F) gde je

• K = s1, s2, s3

• = 0, 1, , B ( je prazno slovo!)

• = 0, 1

• q0 = s1

• F = s3

17

funkcionalna shema

0 1 B

s1 s20R s21R - -

s2 s21R s20R - s3R

s3 - - - -

Zadatak ove mašine je da prihvati ulazne nizove koji sesastoje od slova 0 i 1 i da zameni sve nule jedinicama iobrnuto, osim za prvi simbol koji ostaje nepromenjen

18

Halting problem (problem zaustavljanja TM)

• Da li se može unapred zaključiti hoće li Tjuringova mašina za zadatu ulaznu reč završiti rad?

Odgovor je NE!

7

19

Univerzalna Tjuringova mašina

• konstrukcija se zasniva se na ideji oponašanja (simulacije) različitih specijalnih Tjuringovih mašina, a tehnika kojom se to postiže je kodiranje kako spoljašnje azbuke, tako i kompletne funkcionalne sheme pri čemu su sami kodni simboli univerzalne mašine fiksirani, ali se pridruživanje vrši na različite načine u zavisnosti od specijalne mašine koja se oponaša.

• različite funkcionalne sheme se takođe memorišu na traci, tako da svaka takva shema nije ništa drugo do program, a sama univerzalna Tjuringova mašina predstavlja apstraciju računara

20

Normalni algoritmi Markova• A.A. Markov, 1954.

• pogled na algoritam iz ugla izvršavanja

• kanonički oblik algoritma

• transformacija ulazne reči iz skupa X* u reč iz Y*, a posredstvom G, može realizovati u etapama uz primenu samo dve vrste elementarnih operatora:– operatora obrade čiji je zadatak da tekući oblik reči preradi

u sledeći koji vodi (ili ne vodi) konačnom rešenju i

– upravljačkih operatora što, na osnovu osobina tekuće reči, odlučuju o tome koji će operator obrade biti odabran za narednu transformaciju

21

operator obrade

• predstavlja se kao smena (zamena). Izvršava se nad rečju. Ako je tekuća reč iz nekog alfabeta A označena sa X tada smena

• znači "prvu podreč (čitano sleva) reči X zameniti sa

• ako se na reč 4923746592367 primeni smena 9230 dobija se reč 40746592367

8

22

• postoje završne smene po čijem se izvođenju smatra da je procedura završena. Označavaju se, obično, tako što se iza simbola dopisuje tačka, to jest smena

.

označava kraj obrade.

• smena , koja može biti i završna, ima značenje "zameniti prvu s leva praznu reč sa ", to jest "postaviti na početak reči". Za praznu reč upotrebljava se oznaka.

23

upravljački operator

predikatT

24

T

T

T

X

P(1,X) X = 1(X) K(1)

P(2,X) X = 2(X) K(2)

P(n,X) X = n(X) K(n)

1

1

1

1

T

T

T

• P(i,X) je tačno ako i samo ako je smena i

primenljiva na reč X

• X=i(X) znači "primeniti smenu i

na reč X"

• K(i) je tačno ako i samo ako je smena i

završna smena

9

25

• normalni algoritam može se završiti na dvanačina:

– kada se izvede završna smena

– kada nijedna od predviđenih smena nije primenljiva na aktuelnu reč

• kao ni kod Tjuringove mašine, ne zna se unapred da li će se algoritam završiti za neku ulaznu reč X

26

Osnovne osobine algoritama

• diskretnost (definiciona osobina!)

• rezultativnost (konačnost)

• determinisanost

• masovnost

1

3 ANALIZA ALGORITAMA

1

2

• analiza strukture algoritma

• analiza performanse (vremenske i prostorne)

3

ANALIZA STRUKTURE

ALGORITAMA

2

4

Strukturirano programiranje• nastalo početkom sedamdesetih, kao

odgovor na softversku krizu

• povod: eliminisanje naredbe goto

• Pod strukturiranim programiranjempodrazumeva se skup tehnika za razvoj programskih modula koje koriste strogo definisane grupe upravljačkih struktura i struktura podataka.

• paskal, C

5

Graf toka programa

• kvazi-digraf čiji čvorovi odgovaraju naredbama, njihovim delovima ili pak grupama naredbi

• podseća na blok dijagram algoritma bez posebne oznake početka/kraja

6

elementi grafa toka programa

• Proces ili funkcionalni čvor koji predstavlja operaciju transformacije (obrade) podataka; ulazni stepen 1, izlazni stepen 1

f

• Predikat realizuje grananje; ulazni stepen 1, izlazni stepen 2

T

p

3

7

• Kolektor služi samo za povezivanje dve grane koje se stiču na istom mestu; ulazni stepen 2, a izlazni stepen 1

8

primer

double maxEl(double v[], int n) {

double vmax; int i;

for(maxv=v[0],i=0;i<n;i++) if(v[i]>vmax) vmax=v[i];

return vmax;

}

T

T

vmax=v[0]

i=0

i<n

v[i]>vmax

vmax=v[i]

i++

9

• Pravilan program je program čiji graf toka zadovoljava sledeća tri uslova:

– Postoji tačno jedna ulazna grana.

– Postoji tačno jedna izlazna grana.

– Kroz svaki čvor prolazi najmanje jedan put od ulazne do izlazne grane (put je skup grana g1,...gm

takav da grana gi+1 počinje u čvoru u kojem se završava grana gi, za i=1,2,...)

nepravilan (i besmislen) program

4

10

• Podgraf grafa toka programa nosi naziv potprogram; potprogram koji je pravilan nosi naziv pravilan potprogram

• Prost program je program kojem odgovara graf toka takav da nijedan od njegovih pravilnih potprograma nema više nego jedan čvor (a to je proces)

11

• Skup prostih programa čijom se superpozicijom može realizovati bilo koji pravilan program nosi naziv baza strukturiranih programa

• strukturirani program definiše se kao program sastavljen od skupa prostih programa iz zadate baze.

12

prosti programi sa bar jednim procesom

if-then-else

do-while-do

proces

if-then

while-do

repeat-until

sekvenca

ovo su kandidati za bazu strukturiranih programa

5

13

Prosti programi u C-u

• izraz; (proces)

• naredba1 naredba2 (sekvenca)

• if(izraz) naredba

• while(izraz) naredba

• do naredba while(izraz);

• if(izraz) naredba1 else naredba2

14

Strukturna teorema• bavi se definisanjem jedne baze

strukturiranih programa (koja je, usput, redundantna)

• Svaki pravilan program može se transformisati u ekvivalentan, formalno strukturiran program uz korišćenje tri osnovne upravljačke strukture: sekvence, selekcije if-then-else i ciklusa while-do

15

dokaz

• označiti sve procese i predikate proizvoljnim simbolima (npr. 1, 2, 3...)

• označiti okolinu proizvoljnim simbolom (npr. 0)

A

p

B

1

2

3

0

0

6

16

• formirati matricu prelaza L (kvadratna logička matrica reda k gde je k broj označenih čvorova

• L[i,j] jednako je T ako iz čvora sa oznakom ipostoji grana koja vodi u čvor j, a u suprotnom

A

p

B

1

2

3

0

0

0 1 2 3

0 T 1 T 2 p p3 T

u svakoj vrsti tačno jedan element ima vrednost T

17

• funkcija next(n) koja izračunava oznaku čvora koji se izvršava kao sledeći posle čvora sa oznakom n:

{j=0; while(!L[n,j]) j++;}

• funkcija next(n) realizuje se samo pomoću sekvence i ciklusa while-do!

18

sada je kanonički oblik bilo kojeg pravilnog programa

{

n=1; //1 je oznaka prvog cvora koji se izvrsava

while(n!=0) //0 je oznaka okoline

if(n==1) {obraditi cvor n; n=next(n);}

else if(n==2) {obraditi cvor n; n=next(n);}

else if(n==3) {obraditi cvor n; n=next(n);}

...

else if(n==k) {obraditi cvor n; n=next(n);}

} koriste se samo sekvenca, if-then-else i while- do

7

19

još jedna baza strukturiranih programa

• prost program

if(p) A else B

može se transformisati u ekvivalentnu sekvencu oblika

{ if(p) A if(!p) B}

• sekvenca {}, ciklus while-do i selekcija if-then takođe čine bazu strukturiranih programa

20

Minimalna baza strukturiranih programa• prost program

if(p) A else B

može se transformisati u ekvivalentnu sekvencu oblika

{

q=p; r=!p;

while(q) {A q=!q;}

while(r) {B r=!r;}

}

• minimalna baza strukturiranih programa je baza: sekvenca {} i ciklus while-do

sadrži samo sekvencu i ciklus while-do

21

Strukturna teorema i algoritamski sistemi

Kombinovanjem osnovne hipoteze teorije algoritama i Strukturne teoreme zaključujemo

svaki algoritam može se prikazati naprogramskom jeziku čije upravljačke struktureobuhvataju bar jednu bazu strukturiranihprograma, odnosno

svaki algoritam može se prikazati naprogramskom jeziku koji sadrži bar sekvencu iciklus while-do

8

22

Metoda sukcesivne dekompozicije

• svrha: izbeći naredbe skoka

• primer: ako je a<0 staviti x=1 i y=2

if(a>=0) goto 5;x = 1;y = 2;5: ……..

if(a<0) {x = 1; y = 2;}

loše!

23

1. Formulisati problem u obliku pogodnom za računarsko rešavanje.

2. Formulisati osnovnu ideju algoritamskog rešenja.

3. Napisati osnovne komponente programskog rešenja u vidu niza komentara.

4. Izdvojiti pogodnu manju celinu (iskazanu u vidu komentara) i razložiti je na

detaljnije programske zahteve.

5. Ponavljati korak (4) dok se ne dobiju programski zahtevi koji su dovoljno

jednostavni da se mogu realizovati kao programski segmenti na nekom

pseudojeziku.

6. Odabrati neki od programskih zahteva i realizovati ga na pseudojeziku

koristeći pri tome jedino upravljačke strukture iz određene usvojene baze.

7. Sistematski ponavljati korak (6) dok god je to moguće i pri tome povećavati

nivo detaljisanja kako za programe tako i za podatke koje program obrađuje.

8. Na kraju, dobijeni program na pseudojeziku prevesti u program na nekom od

konkretnih jezika.

24

primer

• odrediti proizvod p zbira elemenata niza x dužine m i niza ydužine n

odrediti p

ulaz m,n,x i y

• faza n+1 počinje kada se završi faza i

• garantovano nema skokova

odrediti zbir elemenata x (pod imenom s1)i y (s2)

p = s1*s2izlaz p

ulaz m,x ulaz n,yodrediti s1 = zbir elemenatax

odrediti s2 = zbir elemenatay