You are on page 1of 35

Polja i liste

Lista
Lista je konačni niz (od nula ili više) podataka istog ili
različitog tipa
Lista je linearna struktura
Podaci koji čine listu nazivaju se njeni elementi
U teoretskim razmatranjima listu obično bilježimo
ovako:
(a1, a2, . . . ,an).
Ovdje je n >0, tzv. duljina liste. Ako je n = 0, kažemo
da je lista prazna.
Lista (2)
Za svaki n > 1, a1 je prvi element, a2 drugi, . . ., ai i-ti
element, an zadnji element
Zbog linearnog svojstva liste možemo reći da je ai
prethodnik elementa ai+1 i sljedbenik elementa ai-1
Moguće je da su neki od elemenata liste jednaki
Identitet elementa određen je njegovom pozicijom
(rednim brojem), a ne njegovom vrijednošću
Elementi liste su linearno uređeni s obzirom na svoju
poziciju
Liste možemo implementirati statički, pomoću polja
(engl. array), ili dinamički, pomoću pokazivača
(povezane liste)
Implementacija liste pomoću polja
polje je statička struktura, što znači da se kapacitet treba
definirati unaprijed i kasnije se ne može mijenjati
jedna od jednostavnijih implementacija liste
polje je neprekidni dio memorije koji je podijeljen na n
jednakih dijelova
elemente liste jednostavno redom spremimo u polje
na taj se način redoslijed elemenata u listi podudara s
fizičkim redoslijedom elemenata u memoriji
uz polje za implementaciju liste koristi se i jedan
brojač u koji se sprema broj elemenata u listi
Implementacija liste pomoću polja
(2)
Svi elementi polja su istog podatkovnog tipa, te zbog
toga zauzimaju istu količinu memorije.

Iz ovoga slijedi da, ako znamo adresu početka polja,


možemo u vremenu O(1) izračunati adresu elementa
na bilo kojem indeksu.
Implementacija liste pomoću polja
(3)
Dodavanje u listu
Moguća su tri slučaja:
dodavanje na početak liste
dodavanje na kraj liste
dodavanje u sredinu liste
S obzirom da znamo veličinu svakog člana pristup bilo
kojem članu je operacija složenosti O(1)
Lista mora biti kontinuirana, te nakon konstantne
operacije ubacivanja člana u sredinu ili na početak
slijedi pomicanje ostatka liste što je u najgorem slučaju
O(n)
Dodavanje u listu (2)
Brisanje iz liste
Složenost operacija
dodavanje na kraj (append) zahtjeva O(1)
Dodavanjem ubacivanjem insert(i, value) zahtjeva
pomicanje podataka od pozicije k da bi napravili
mjesta za novu vrijednost. Najgori slučaj je tada
O(n-i+1) da bi ubacili podatak na poziciju indeksa k.
ako uvijek dodajemo u sredinu složenost je O(n/2 +1)
ako dodajemo na početak uvijek moramo razmicati
cijelo polje, pa je tada najgori slučaj O(n)
Složenost operacija (2)
brisanje iz liste ima složenost O(1) ako se provodi na
kraju liste - operacija pop()
ako se radi izbacivanje na početku liste, svi elementi se
moraju pomicati pa je složenost O(n)
generalno ako se briše element na poziciji i, složenost
je O(n-i)
brisanje može ići po indeksu i po vrijednosti
Složenost operacija (3)
Složenost većina operacija nad LISTOM realiziranom
poljem je
Operacije pretrage O(n) ako se traži po vrijednosti, inače
O(1) ako se traži po poziciji
Brisanje i ubacivanje izvršavaju se za O(n) vremena
Ostale operacije izvršavaju se za O(1)
Operacije nad listom u Python-u
Operacija Vremenska složenost
lista[i]
lista[i] = val
O(1)
lista.append(val)
lista.pop()
lista.insert(i,val) O(n) / n - i
lista.pop(i)
O(n) / n – i
del lista[i]
lista.remove(val) O(n)

lista[k:j] O(n) / k-j

lista.reverse() O(n)
lista.sort() O(n log n)
Nedostaci implementacije poljem
ograničenje veličinom polja koja se mora unaprijed
zadati (statičko polje)
uvijek je u memoriji rezerviran prostor za maksimalnu
duljinu liste, bez obzira bila lista puna, prazna ili
poluprazna
ubacivanja i brisanja traju dugo zbog potrebe za
pomicanjem preostalih elemenata
Polje u Pythonu
Polje je implementirano u Python-u upotrebom
array modula
from array import array
a=array(‘i’,[1,2,3,4,5])

Ovo nije “pravo” polje jer je Python u stanju


dinamički promijeniti veličinu ovog polja
Najveća razlika u odnosu na Python-u listu je što ne
postoje pokazivači na vrijednosti elemenata, već su
oni kontinuirano pohranjeni u memoriji (kao u
običnom polju)
Dinamička implementacija liste
Povezana lista
realizacija se ostvaruje pomoću pokazivača (memorijski se
prostor alocira i dealocira za vrijeme izvršavanja programa)
može imati proizvoljnog broja čvorova
svaki čvor se sastoji od jednog elementa liste i pokazivača na
sljedeći element
U svrhu pronalaženja prvog elementa definira se glava
(header) tako da ne sadrži niti jedan element liste već samo
pokazivač na prvi element liste. Na taj način koristeći jedan
statički definiran podatak zadržava se kontrola nad cijelom
dinamički implementiranom listom.
Čvor liste
Jednostruko povezana lista
Jednostruko povezana lista (2)
Prvi i zadnji čvor povezane liste poznati su po
nazivima glava i rep.
Rep možemo identificirati kao čvor koji u svojoj next
referenci sadrži None ili NULL. Zajedničko ime za taj
proces je prolaženje kroz listu.
Kako referenca na sljedeći čvor može biti smatrana kao
poveznica (link) ili pokazivač (pointer) na sljedeći čvor
proces prolaženja kroz listu je poznat još kao skokovi
preko poveznice ili pokazivača.
Jednostruko povezana lista (3)
Svaki čvor je prikazan kao jedinstveni objekt s instancama
reference na svoj element i referencom na sljedeći čvor (ili
None). Ostali objekti predstavljaju povezanu listu u cjelini.
Minimalno, povezana lista mora imati referencu na glavu
liste. Bez eksplicitne reference na glavu liste ne bi mogli
identificirati taj element u listi, a posredno i ostale
elemente.
Referenca na rep i nije nužna jer preko glave možemo doći
do repa prolaženjem kroz listu, no uobičajeno je da
definiramo i referencu na rep kako do repa ne bi morali
prolaziti kroz cijelu listu.
Jednostruko povezana lista (4)
Najvažnija osobina povezane liste je da ona nije
unaprijed definirane veličine (za razliku od polja) već
ona koristi prostor u memoriji proporcionalan
trenutnom broju elemenata (čvorova) liste.
Proces ubacivanja na početak
liste
Proces ubacivanja na kraj liste
Izbacivanje čvora s početka liste
Izbacivanje čvora s kraja liste
izbacivanje čvora na kraju liste kod jednostruko
povezane liste nije tako jednostavan proces
bez obzira što imamo pokazivač na zadnji čvor preko
repa (tail) najprije se mora pristupiti čvoru ispred
čvora kojeg brišemo kako bi njegovu referencu next
preusmjeriti na None
to se može napraviti samo tako da se krene od glave
(head) liste i pretražuje po cijelom putu od čvora do
čvora dok se ne dođe do predzadnjeg čvora
kretanje kroz listu troši vrijeme tako da je vremenska
složenost te operacije O(n)
Dvostruko povezana lista
omogućuje da na jednostavan način realiziramo više
različitih metoda koje imaju konstantno vrijeme
izvršenja O(1), kao što su ubacivanje i izbacivanje iz
liste na željenoj poziciji unutar liste (a ne samo na
početku i kraju)
ovakva implementacija liste zahtjeva najviše memorije
Ubacivanje čvora u sredinu liste
Ubacivanje čvora na početak
liste
Izbacivanje iz liste
Zadatak 1
Ubacivanje (dodavanje) elementa u LISTU (u polju) je
operacija složenosti?

a) O(n)
b) O (1)
c) O(n log n)
d) O(log n)
Zadatak 2
Zadnji čvor linearno povezane liste:

a) Ima vrijednost None.


b) Ima next pokazivač čija vrijednost je None.
c) Ima next pokazivač koji pokazuje na prvi čvor liste.
d) Ne može čuvati nikakav podatak.
Zadatak 3
Pokazivačka varijabla čija jedina namjena je određivanje
prvog čvora u jednostruko povezanoj listi zove se:

a) Vrh liste
b) Poveznica čvora
c) Poveznica liste
d) Glava liste

You might also like