Upload
truongnhi
View
226
Download
7
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