150 likes | 354 Views
Linearne strukture. Polja jednodimenzionalna (nizovi, vektori) dvodimenzionalna (matrice) višedimenzionalna (tenzori višeg reda) Povezani popis Stogovi Redovi. Definicija reda. Princip rada kod reda (eng. Queue) je FIFO (eng. First In First Out).
E N D
Linearne strukture Polja jednodimenzionalna (nizovi, vektori) dvodimenzionalna (matrice) višedimenzionalna (tenzori višeg reda) Povezani popis Stogovi Redovi
Definicija reda Princip rada kod reda (eng. Queue) je FIFO (eng. First In First Out). Red kao struktura podataka definiran je pomoću četiri funkcije: Push(x) - dodaje element x u red Pop( ) - vraća kao rezultat element s početka reda i briše ga Clear( ) - briše sve elemente reda Is_empty( ) - vraća TRUE ako je red prazan, inače FALSE
Izvedba reda pomoću niza Nije dovoljan samo niz V od N elemenata, potrebna su i dva dodatna podatka Ulaz i Izlaz. To su dva cijela broja koji pokazuju na početak i kraj reda. Postoje dvije osnovne izvedbe reda pomoću niza: - konačni red (u praksi se ne koristi) - ciklički red
Konačni red Prilikom stavljanja podatak u redi i prilikom vađenja podataka iz reda, Ulaz i Izlaz se povećavaju. Nakon N uzastopnih korištenja Push i Pop funkcija, konačni red postaje neupotrebljiv iako još uvijek ima veliki nepopunjeni dio. Popunjeni dio reda V 1 2 3 N Izlaz Ulaz
Ciklički red U cikličkom redu, nakon što se popuni N-ti podatak, red se i dalje puni od početka tj. od nultog mjesta. Ovo je dobro za praktičnu upotrebu! U cikličkom redu se ulazni pokazivač povećava izrazom Ulaz = mod( Ulaz+1, N ) . Isto vrijedi i za izlazni pokazivac. Ciklički red je prazan ako je Ulaz = Izlaz– 1 i zadnja promjena bio je Pop( ). Ciklički red je pun ako je Ulaz = Izlaz– 1 i zadnja promjena bio je Push( x ). N 1 N-1 2 3 4
Izvedba procedure Clear( ) i funkcije Is_empty( ) Kako moramo pamtiti koja je zadnja operacija bila, kod cikličkog reda nam je potrebna još jedna logička varijabla: Zadnji_push Algoritam procedure Clear( ) Ulaz = 0 Izlaz = 1 Zadnji_push = FALSE Algoritam funkcije Is_empty( ) Ako je Ulaz = Izlaz– 1 i nije Zadnji_pushonda Vratiti TRUE Vratiti FALSE
Izvedba procedure Push( x ) Push( x ) se često naziva i Enqueue( x ) Algoritam procedure Push( x ) Ako je Ulaz = Izlaz– 1 i Zadnji_pushonda Ispiši “Queue overflow. Aborting...” Završi algoritam /* obavezan prekid programa! */ Zadnji_push = TRUE Ulaz = mod( Ulaz + 1, N ) VUlaz = x
Izvedba funkcije Pop( ) Pop( ) se često naziva i Dequeue( ) Algoritam funkcije Pop( ) Ako je Is_empty( ) onda Ispiši “Illegal POP. Aborting...” Završi algoritam /* obavezan prekid programa! */ Zadnji_push = FALSE x = VIzlaz Izlaz = mod( Izlaz + 1, N ) Vratiti x
Analiza četiri funkcije za red Sve četiri operacije su “atomske”, složenost je O(1). Općenito, nedostatak cikličkih redova, kao i kod stogova je ograničen broj od N mjesta za podatke. U nekim primjenama teško je odrediti koliki N treba biti.
Izvedba reda pomoću povezanog popisa Dovoljan je jedan povezani popis za izvedbu reda. Ali, za efikasnu izvedbu osnovnih operacija potreban je povezani popis koji ima pokazivač na prvi i pokazivač na zadnji zapis. Sve četiri osnovne funkcije se onda mogu izvesti kao “atomske”, međutim procedura Clear( ) u svojoj pravilnoj izvedbi može zahtjevati O(n) operacija (n – broj elemenata u redu).
Izvedba procedure Push( x ) (povezani popis) Algoritam procedure Push( x ) novi= novi osnovni element popisa (dinamičko alociranje) Ako je novi = NULL onda Ispiši “Queue overflow. Aborting...” Završi algoritam /* obavezan prekid programa! */ novi.x = x novi.sljedeci = NULL Ako je Is_empty( ) ondaprvi = zadnji = novi U suprotnom zadnji.sljedeci = novi zadnji = novi
Izvedba funkcije Pop( ) (povezani popis) Algoritam funkcije Pop( ) Ako je Is_empty( ) onda Ispiši “Illegal POP. Aborting...” Završi algoritam /* obavezan prekid programa! */ x = prvi.x zabrisanje = prvi prvi = prvi.sljedeći Ako jeprvi = NULL ondazadnji = NULL oslobodi memoriju dinamički na adresi zabrisanje Vratiti x
Izvedba funkcije Is_empty( ) (povezani popis) Algoritam funkcije Is_empty( ) Ako je prvi=NULL i zadnji=NULLonda Vratiti TRUE Vratiti FALSE
Izvedba procedure Clear( ) (povezani popis) Algoritam procedure Clear( ) prvi=NULL zadnji=NULL InitializeQueue( ) Brza, ali ostavlja ‘smeće’ u memoriji! Algoritam procedure Clear( ) Sve dok nije Is_Empty( ) činiti Pop( ) Ima linearnu složenost, ali ‘počisti’ zauzete zapise! Ne radi dobro ako nema funkcije InitializeQueue( )
Algoritmi s redovima Kao primjere algoritama s redovima mogu se pokazati svi primjeri koje smo radili kada smo govorili o stogovima. Potrebno je napraviti manje preinake zbog FIFO principa kod redova. Redosljed obavljanja operacija u algoritmu će se promjeniti ali će se dobiti isti rezultat!