4 POLUDINAMIKE STRUKTURE 1 strukture specijalne namene dozvoljene

  • Slides: 41
Download presentation
4 POLUDINAMIČKE STRUKTURE 1

4 POLUDINAMIČKE STRUKTURE 1

 • strukture specijalne namene • dozvoljene su sve osnovne operacije, uz ograničenja •

• strukture specijalne namene • dozvoljene su sve osnovne operacije, uz ograničenja • stek • red (red čekanja, queue) • dek (deque) • sekvenca 2

Logička struktura steka "vidljiv" je samo vrh • Stek je uređeni par L =

Logička struktura steka "vidljiv" je samo vrh • 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 dno steka) 3

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

• definiciona osobina steka je Last In First Out (poslednji unutra-prvi napolje): LIFO • osnovne operacije: – top (pristup) – pop (uklanjanje) – push (dodavanje) – is. Empty (provera da li je stek prazan) ključna reč! • u praksi se pristup i dodavanje kombinuju u jednu operaciju: destruktivno očitavanje (asemblerska operacija POP) 4

Fizička struktura steka • zbog brzine operacija: sekvencijalna • može doći do prepunjenosti (overflow)

Fizička struktura steka • zbog brzine operacija: sekvencijalna • može doći do prepunjenosti (overflow) i zato se uvodi operacija is. Full 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 5

 • realizacija u statičkoj memoriji typedef struct { int c; CAPACITY je konstanta

• realizacija u statičkoj memoriji typedef struct { int c; CAPACITY je konstanta int t; T s CAPACITY ; } Stack; • realizacija na hipu typedef struct { int c; int t; niz! T *s; } Stack; 6

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

• kreiranje steka u statičkoj memoriji void create(Stack* stk) { stk->c=CAPACITY; stk->t=-1; u oba slučaja stek je inicijalno prazan } • kreiranje steka na hipu void create(Stack* stk, int capacity) { stk->c=capacity; stk->t=-1; stk->s=malloc(capacity*sizeof(T)); } 7

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

• uništavanje steka kada je na hipu void destroy(Stack* stk) { free(stk->s); } • provera da li je prazan int is. Empty(const Stack* stk) { return stk->t<0; } • provera prepunjenosti int is. Full(const Stack* stk) { return stk->t==stk->c-1; } • očitavanje (nedestruktivno) T top(const Stack* stk) { return stk->s[stk->t]; } 8

t s pop t push s • očitavanje (destruktivno) odn. uklanjanje T pop(Stack* stk)

t s pop t push s • očitavanje (destruktivno) odn. uklanjanje T pop(Stack* stk) { return stk->s[stk->t--]; } • dodavanje void push(Stack* stk, T item) { stk->s[++stk->t]=item; } 9

Prevođenje izraza • problem: prioritet operatora i zagrade a + b * c //prvo

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/ 10

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

A + B * 3 / (5 - H) A B 3 * + 5 H - / • prevođenje u postfiksnu notaciju vrši algoritam koji je baziran na steku • nema zagrada i izraz se skenira linearno, s leva u desno 11

Programski stek • povezivanje potprograma: pozivajuća rutina se privremeno prekida i prelazi se na

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 12

P 0 P 1 A 0 P 2 A 1 P 3 A 2

P 0 P 1 A 0 P 2 A 1 P 3 A 2 A 0 A 1 A 0 13

bp lokalne promenljive, argumenti, adresa povratka, prethodni bp stek frejm sp 14

bp lokalne promenljive, argumenti, adresa povratka, prethodni bp stek frejm sp 14

Logička struktura reda (queue) • definiše se kao uređeni par F = (S(F), r(F))

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 15

čelo začelje • operacije: – – – – – kreiranje (create) uništavanje (destroy, ako

čelo začelje • 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 (is. Empty) provera da li je pun (is. Full, za sekvencijalno realizovan red) određivanje broja elemenata (size) pražnjenje (clear) 16

sekvencijalna fizička realizacija • deskriptor: typedef struct { int c, get. Pos, put. Pos;

sekvencijalna fizička realizacija • deskriptor: typedef struct { int c, get. Pos, put. Pos; niz! 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 – get. Pos mesto (indeks niza q) sa kojeg se čita element (dakle, indeks čela reda) – put. Pos mesto (indeks niza q) na koje se upisuje element pri dodavanju 17

0 1 2 c-1. . . x y get. Pos 0 1 put. Pos

0 1 2 c-1. . . x y get. Pos 0 1 put. Pos 2 c-1. . . x y z get. Pos • lažna prepunjenost: poslednja lokacija je popunjena i ne može se dodati, iako na početku ima mesta 18

cirkularna fizička realizacija 0 1 2 c-1. . . put. Pos x y z

cirkularna fizička realizacija 0 1 2 c-1. . . put. Pos x y z get. Pos • ako nema mesta na kraju reda, dodaje se kružno na početak 19

 • međutim, sada se ne mogu razlikovati pun i prazan red (u oba

• međutim, sada se ne mogu razlikovati pun i prazan red (u oba slučaja je put. Pos==get. Pos)! put. Pos get. Pos pun red prazan red put. Pos==get. Pos 20

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

• rešenje: žrtvuje se jedna lokacija u koju nije dozvoljen upis pun red prazan red 21

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

operacije • kreiranje void create(Queue* que, int capac) { que->c=capac+1; --stvarna duzina je za 1 veca od deklarisanog kapaciteta que->get. Pos= que->put. Pos= 0; que->q=malloc(que->c*sizeof(T)); } • uništavanje void destroy(Queue* que) { free(que->q); } 22

 • prazan? int is. Empty(const Queue* que) { return que->get. Pos==que->put. Pos; }

• prazan? int is. Empty(const Queue* que) { return que->get. Pos==que->put. Pos; } • pun? int is. Full(const Queue* que) { return que->get. Pos==(que->put. Pos+1)%que->c; } • određivanje dužine (broja elemenata) int size(const Queue* que) { return (que->put. Pos>=que->get. Pos) ? que->put. Pos-que->get. Pos : que->c+que->put. Pos-que->get. Pos; } • pražnjenje Na kraju, pražnjenje reda je vrlo jednostavno: void clear(Queue* que) { que->put. Pos=que->get. Pos; } 23

 • pristup T front(const Queue* que) { return que->q[que->get. Pos]; } • uklanjanje

• pristup T front(const Queue* que) { return que->q[que->get. Pos]; } • uklanjanje T remove. Item(Queue* que) { T item; item=que->q[que->get. Pos]; que->get. Pos=(que->get. Pos+1)%que->c; return item; } • dodavanje void put. Item(Queue* que, T item) { que->q[que->put. Pos]=item; que->put. Pos=(que->put. Pos+1)%que->c; } 24

alternativa • U deskriptor treba uneti dodatno polje, recimo int n koje uvek sadrži

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 25

spregnuta fizička realizacija • ostvaruje se povezivanjem elemenata (čvorova) pomoću pokazivača • format čvora

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 čvorpokazivač na čelo sadržaj elementa sledeći first last pokazivač na začelje . . . 26

typedef struct node { T item; //sadrzaj elementa struct node* next; //pokazivac na sledeci

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; 27

uklanjanje i dodavanje n first. . . last n first last . . .

uklanjanje i dodavanje n first. . . last n first last . . . 28

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

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 p 0 n prioritet veći od p 0 prioritet jednak p 0 prioritet manji od p 0 first last . . . 29

typedef struct node { int priority; T item; struct node* next; } Node; 30

typedef struct node { int priority; T item; struct node* next; } Node; 30

Logička struktura deka (deque). . . • akronim od Double Ended Queue • definiše

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 31

 • osnovne operacije . . . 32

• osnovne operacije . . . 32

Fizička struktura deka (deque) • može biti – sekvencijalna: problemi isti kao i kod

Fizička struktura deka (deque) • može biti – sekvencijalna: problemi isti kao i kod reda, ali udvostručeni – spregnuta: sprezanje je dvostruko n left . . . right 33

Logička struktura sekvence. . . • definiše se kao uređeni par D = (S(D),

Logička struktura sekvence. . . • definiše se kao uređeni par D = (S(D), r(D)) 34

tekući element . . . • struktura je linearna • dozvoljen je pristup svakom

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 35

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

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) 36

 • operacija promene pozicije tekućeg elementa • operacija očitavanja pozicije tekućeg elementa •

• 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 37

Fizička realizacija sekvence • najpoznatiji oblik sekvence je masovna struktura datoteke (koja nije deo

Fizička realizacija sekvence • najpoznatiji oblik sekvence je masovna struktura datoteke (koja nije deo programa) • realizacija je kombinovana (sekvencijalnospregnuta) 38

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

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 39

Sortiranje mešanjem 1. podeliti datoteku na manje delove (segmente) koji mogu da stanu u

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) 40

file faza disperzije sort F$0 sort F$1 sort F$2 sort F$0 F$1 faza mešanja

file faza disperzije sort F$0 sort F$1 sort F$2 sort F$0 F$1 faza mešanja F$2 merge file 41