You are on page 1of 22

3.

Linearne strukture

Polja
3.a) jednodimenzionalna (nizovi, vektori)
3.b) dvodimenzionalna (matrice)
višedimenzionalna (tenzori višeg reda)

3.c) Povezani popis


3.d) Stogovi
3.e) Redovi
3.d) Definicija stoga

Princip rada stoga je LIFO (Last In First Out).


Stog kao struktura podataka definiran je pomoću četiri
funkcije:

Push(x) - dodaje element x na stog


Pop( ) - vraća kao rezultat zadnji element stoga i briše ga
Clear( ) - briše sve elemente stoga
Is_empty( ) - vraća TRUE ako je stog prazan, inače FALSE
Izvedba stoga pomoću niza (1/4)
Nije dovoljan samo niz V od N elemenata, potreban
je i dodatni podatak Sp (Stack pointer). Sp je cijeli
broj koji pokazuje na zadnji element u stogu.

6 Prazni dio
5 stoga
4 Pokazivač stoga
3
Popunjeni Sp=4
2
1
dio stoga
Izvedba stoga pomoću niza (2/4)
Stog je prazan ako je Sp = 0
Stog je pun ako je Sp = N
Stog se “puni” i “prazni” na “vrhu”. Podatak koji
je zadnji stavljen na stog, bit će prvi skinut sa stoga.

Algoritam procedure Clear( )

Sp = 0

Algoritam funkcije Is_empty( )

Ako je Sp = 0 vratiti TRUE


vratiti FALSE
Izvedba stoga pomoću niza (3/4)

Algoritam procedure Push( x )

Ako je Sp = N onda
Ispiši “Stack overflow. Aborting...”
Završi algoritam /* obavezan prekid programa! */
Sp = Sp + 1
VSp = x
Izvedba stoga pomoću niza (4/4)
Algoritam funkcije Pop( )

Ako je Sp = 0 onda
Ispiši “Illegal POP. Aborting...”
Završi algoritam /* obavezan prekid programa! */
x = VSp
Sp = Sp  1
Vratiti x

Sve četiri operacije su “atomske”.


Vremenska složenost svake je O(1)
Izvedba stoga pomoću povezane liste (1/4)

Dovoljna je jedna povezana lista za izvedbu stoga.


Vrh stoga mora biti na početku povezane liste ako
želimo biti efikasni.

Sve četiri osnovne funkcije se mogu izvesti kao


“atomske”, međutim procedura Clear( ) u svojoj
pravilnoj izvedbi može zahtjevati O(n) operacija
(n – broj elemenata na stogu).
Izvedba stoga pomoću povezane liste (2/4)

Zadana je povezana lista s osnovnim elementom koji se


sastoji od elementa x i pokazivača sljedeci i pokazivač na
prvi=NULL.

Algoritam procedure Push(x )


novi = novi osnovni element liste (dinamičko alociranje)
Ako je novi = NULL onda
Ispiši “Stack overflow. Aborting...”
Završi algoritam /* obavezan prekid programa! */
novi.x = x
novi.sljedeci = prvi
prvi = novi
Izvedba stoga pomoću povezane liste (3/4)

Algoritam funkcije Pop()


Ako je prvi = NULL onda
Ispiši “Illegal pop. Aborting...”
Završi algoritam /* obavezan prekid programa! */
x = prvi.x
zabrisanje = prvi
prvi = prvi.sljedeci
Oslobodi memoriju na adresi zabrisanje
Vratiti x
Izvedba stoga pomoću povezane liste (4/4)

Algoritam funkcije Is_empty()


Ako je prvi = NULL onda Vratiti TRUE
Vratiti FALSE

Algoritam procedure Clear()


Sve dok nije Is_empty() činiti
Pop()

Procedura Clear() ima složenost O(N), sve ostale procedure


su trenutačne: O(1).
Problem “putne torbe” (1/4)
ZADANO: Niz Tezine od n prirodnih brojeva
T – kapacitet torbe
TRAŽI SE: Naći bilo koji podskup Torba skupa Tezine tako da
zbroj elemenata u Torba bude jednak T.
Ako takvog podskupa nema,
ispisati odgovarajuću poruku.

- Stog će predstavljati torbu. Stavljati i vaditi iz torbe


predmete različitih težina dok se ne dobije tražena
kombinacija. Rezultat su predmeti koji su trenutno na
stogu.
Problem “putne torbe” (2/4)
Algoritam PUTNA TORBA

rješenje_postoji=FALSE
uk_tez=0, pred=0
Pozvati proceduru Torba
Ako rješenje_postoji onda
Za svaki i=1 do pred činiti
Ispisati TezinePop( )
U suprotnom
Ispisati “Nema rješenja”
Problem “putne torbe” (3/4)
Algoritam procedure Torba
Clear( )
Ponavljati
Ako je uk_tez=T onda rješenje_postoji = TRUE
U suprotnom
Ako je uk_tez<T i pred <n onda
pred = pred +1
uk_tez = uk_tez + Tezinepred
Push(pred)
U suprotnom
pred = Pop( )
uk_tez = uk_tez  Tezinepred
Ako je pred<n onda
pred = pred +1
uk_tez = uk_tez + Tezinepred
Push(pred)
Sve dok nije rješenje_postoji i nije Is_empty( )
Problem “putne torbe” (4/4)

Algoritam isprobava sve moguće kombinacije.


Vremenska složenost nije polinomijalna, već:
O(povrh(n,1)+povrh(n,2)+...+povrh(n,n))=O(2n)
(U stvari se radi o kombinacijama bez ponavljanja
za svaki podskup od 1,2,...,n elemenata, što na kraju
rezultira danom ukupnom složenosti), najviše
dominira srednji element povrh(n,n/2) koji iznosi
n!/((n/2)!(n/2)!), ali složenot je eksponencijalna.

U ovom slučaju govorimo o NP-teškim problemima.


(NP kao nedeterministički polinomijalni)
Problem računanja ‘povrh’ (1/3)
ZADANO: Nenegativni brojevi a,b; a≥b
a
TRAŽI SE: ()
Dati algoritam koji će izračunati b

a a!
Dobro je poznato da je () =
b b! ( a− b )!
Ali, čim je a veličine preko 20, rezultat je 20znamenkast i
izlazi iz okvira SVIH cjelobronih tipova (čak i 64-bitnih)

n n−1 n−1 k 1 k
( ) ( )( ) () () ()
= +
m m−1 m
; =1, =1, =1
k k 0
Problem računanja ‘povrh’ (2/3)
Algoritam POVRH
s1.Clear( ), s2.Clear( )
s1.Push( a ), s2.Push( b )
povrh = 0
Ponavljati
n = s1.Pop( )
m = s2.Pop( )
Ako je m=n ili m=0 onda povrh = povrh +1
U suprotnom
s1.Push( n-1 )
s2.Push( m-1 )
s1.Push( n-1 )
s2.Push( m )
Sve dok nije s1.is_empty( )
Ispisati povrh
Problem računanja ‘povrh’ (3/3)
Algoritam koristi 2 stoga, ali može se lako
realizirati sa samo jednim stogom.

Algoritam uvijek uvećava rezultat za 1. Osim toga


može i stavljati na stog ali otprilike isto toliko puta.
a!
Tako da imamo 2 ponavljanja.
b!(a−b)!
Vremenska složenost opet nije polinomijalna, ona
iznosi:
a!
O( ).
b!(a−b)!
Problem sortiranja
QUICKSORT (1/5)
ZADANO: Niz V od N elemenata
TRAŽI SE: Preurediti elemente niza tako da bude
V1V2 ... VN

Ovaj put želimo bolje od kvadratne složenosti!

- Uzeti neki element u nizu (pivot) i naći mu konačno


mjesto, tako da svi lijevo od njega budu manji od
njega, a svi desno od njega veći od njega (zapravo,
mogu biti i jednaki, a ne strogo manji ili veći)
To se može postići u linearnom vremenu O(N)!
Problem sortiranja
QUICKSORT (2/5)
- Isti postupak ponavljati s lijevim i desnim podnizom,
stogove iskoristiti samo za praćenje granica podnizova

12 9 15 7 31 25 19

Vs>Vgg
7 9 15 12 31 25 19

Vdg>Vs
7 9 12 15 31 25 19
Problem sortiranja
QUICKSORT (3/5)
Algoritam QUICKSORT
Push( 1 ), Push( N )
Ponavljati Ključna funkcija za
gg = Pop( ) ispravan rad
dg = Pop( )
s = Nadji_s(dg,gg)
Ako je dg < s–1 onda
Push( dg )
Push( s–1 )
Ako je gg > s+1 onda
Push( s+1 )
Push( gg )
Sve dok nije Is_empty( )
Problem sortiranja
QUICKSORT (4/5)
Algoritam funkcije Nadji_s(dg,gg)

Ponavljati
s = dg
Sve dok je Vgg≥Vs i gg  s činiti gg = gg – 1
Ako je gg = s onda vratiti s
Pozovi proceduru Zamjeni( Vs, Vgg )
s = gg
Sve dok je Vdg ≤ Vs i dg  s činiti dg = dg + 1
Ako je dg = s onda vratiti s
Pozovi proceduru Zamjeni( Vs, Vdg )
Problem sortiranja
QUICKSORT (5/5)
Algoritam funkcije Nadji_s ima najviše gg – dg
ponavljanja.

Glavni program razdvaja dijelove niza na podnizove.


Dubljom analizom može se utvrditi da se razdvajanje u
slučaju polovljenja većih dijelova niza, proteže na log2N
razina, a u općem sluačju i na više razina.

Složenost algoritma je u slučaju polovljenja O( N log N )


Međutim, pivot ne završava uvijek na polovici, tako da
algoritam može doseći i O( N 2 ). Jedan primjer je ako je niz
već sortiran ili obrnuto sortiran.

You might also like