Download as doc, pdf, or txt
Download as doc, pdf, or txt
You are on page 1of 14

VISOKA POSLOVNA ŠKOLA STRUKOVNIH STUDIJA

BLACE

SEMINARSKI RAD

PREDMET: Algoritmi i strukture podataka


TEMA: Ulančane liste – primena

Student:
Aleksandar Ristić 30/08 - III
Ulančane liste

Profesor:
dr Branislav Jevtović
Blace, 2009.

3
Ulančane liste

1. Sadržaj:

1. Osnovni pojmovi i osobine...............................................................................................3


2. Dinamička alokacija..........................................................................................................4
3. Primene ulančanih lista.....................................................................................................6
3.1 Predstavljanje retkih nizova..........................................................................................6
3.2 Predstavljanje skupova..................................................................................................9
3.3 Predstavljanje polinoma..............................................................................................11
4. Literatura................................................................................................................................13

2
Ulančane liste

2. Osnovni pojmovi i osobine

Ulančana implementacija linearne liste se naziva ulančanom listom (linked list). Dok su u
sekvencijalnoj reprezentaciji uzastopni elementi linearne liste susedni u memoriji, a početne adrese
su na fiksnom rastojanju određenom veličinom elementa, u ulančanoj reprezentaciji oni mogu biti
bilo gde u memoriji. Kako se logički poredak elemenata ne može izvesti iz fizičkog poretka, mora
da postoji drugi način za održavanje ovog poretka. Ovo se postiže tako što element liste sadrži
eksplicitnu adresu narednog elementa - pokazivač na njega. Zato svaki element liste (uobičajeni
naziv - čvor) pored informacionog sadržaja elementa (oznaka info) sadrži i pokazivač (oznaka next)
na sledbenika - čvor koji je sledeći u logičkom poretku (slika 1). Informacioni sadržaj može biti bilo
kojeg skalarnog ili strukturiranog tipa, ali je najčešće zapis. Listi se pristupa preko jednog
spoljašnjeg pokazivača koji pokazuje na prvi čvor, a koji nije deo liste (oznaka list). Prvi čvor se
obično naziva glavom (head) liste. Ukoliko je lista prazna, onda pokazivač list ne ukazuje nikuda i
ima vrednost praznog pokazivača (list = nil). Poslednji čvor se obično naziva repom (tail) liste. On
nema svoga sledbenika, pa sadrži prazan pokazivač, što je i oznaka kraja liste.

Slika 1 – Jednostruko ulančana lista

Postoji više vrsta lista u zavisnosti od načina povezivanja. Lista sa slike 1, kod koje svaki
čvor ukazuje samo na svog sledbenika, naziva se jednostruko ulančanom listom. Ukoliko se po
informacionom sadržaju liste info ili nekom njegovom delu može definisati funkcija poređenja i ako
su čvorovi uvezani po rastućim (ili opadajućim) vrednostima, kaže se da je lista uređena. U
suprotnom, kada poredak ne zavisi od vrednosti sadržaja, lista je neuređena. Ukoliko je lista
povezana tako da poslednji čvor ukazuje na prvi čvor, lista je kružna (slika 2). Lista u kojoj svaki
čvor, osim na sledbenika, ukazuje dodatnim pokazivačem (oznaka prev) i na prethodnika je
dvostruko ulančana lista (slika 3). Lista je najčešće homogena što znači da su čvorovi istog tipa.

3
Ulančane liste

Prilikom izlaganja o operacijama sa listama usvojena je sledeća notacija. Ako je p pokazivač na neki
čvor liste, onda info(p) predstavlja korisni sadržaj ovog čvora, next(p) je pokazivač na sledbenika, a
prev(p) je pokazivač na prethodnika.

Slika 2 – Kružna lista

Slika 3 – Dvostruko ulančana lista


Ulančana lista je veoma fleksibilna reprezentacija opšteg tipa linearne liste koja više ili
manje efikasno podržava sve ranije pomenute operacije. Ove operacije se kasnije posebno
razmatraju za različite vrste lista.

3. Dinamička alokacija

Ulančana lista je dinamička struktura čiji broj čvorova varira saglasno operacijama umetanja
i brisanja. Za razliku od sekvencijalne alokacije, gde se unapred rezerviše prostor za sve elemente
strukture, kod ulančane liste prostor za neki čvor se alocira tek kad je to stvarno potrebno, prilikom
operacije umetanja tog čvora u listu. Za razliku od umetanja, prilikom operacije brisanja zauzeti
prostor treba da se oslobodi i učini raspoloživim za neku naknadnu primenu. Prema tome, kod
ulančane reprezentacije neophodno je postojanje nekog mehanizma koji vrši dinamičku alokaciju i
dealokaciju prostora.

Slika 4 – Korisnička lista na koju ukazuje pokazivač list i lista slobodnog prostora na koga ukazuje pokazivač avail

4
Ulančane liste

Pri formiranju novog čvora liste poziva se posebna funkcija GETNODE. Funkcija
GETNODE izvlači prvi slobodan čvor iz liste, postavlja polje pokazivača na nultu vrednost (nil),
vraća njegovu adresu i ažurira pokazivač avail.

GETNODE
if (avail = nil) then
ERROR(Nema slobodnog čvora)
end_if
q = avail
avail = next(avail)
next(q) = nil
return q

Kada bi broj slobodnih čvorova bio beskonačan, ne bi bilo potrebe za oslobađanjem prostora
koji zauzima čvor kada se on briše iz liste. Međutim, kako je slobodni prostor ograničen, ako ništa
drugo onda ograničenom memorijom, potrebno je da se zauzeti čvor, koji se izbacuje iz liste, vrati u
slobodan prostor i tako učini raspoloživim za ponovno korišćenje. Za tu svrhu predviđena je
procedura FREENODE(p) koja oslobađa čvor sa zadatom adresom p.

Procedura FREENODE(p) vraća oslobođeni čvor takođe na početak liste, pa se pokazivač


avail postavlja na njegovu adresu.

FREENODE(p)
next(p) = avail
avail = p

5
Ulančane liste

4. Primene ulančanih lista

Ulančane liste imaju mnogostruke primene, pogotovo u slučajevima kada je potrebno


efikasno podržati operacije umetanja i brisanja elemenata u dinamičkim skupovima u kojima broj
elemenata varira. Neke karakteristične primene ulančanih lista su:

 predstavljanje retkih nizova,

 predstavljanje skupova i

 predstavljanje polinoma.

3.1 Predstavljanje retkih nizova

Ulančana reprezentacija retkih nizova pruža mogućnost da se, uz uštedu u prostoru,


efikasnost operacija poboljša.

Jedan od glavnih nedostataka vektorske implementacije je to što se pri pojavi novog


nenultog elementa ili postavljanju na nulu postojećeg nenultog elementa zahteva pomeranje svih
sledećih elemenata u vektoru. Potreba za pomeranjem može da se otkloni ulančavanjem nenultih
elemenata i pretvaranjem vektora u listu, pri čemu elementi u listi zadržavaju isti poredak kao u
vektoru. Pošto se lista sekvencijalno pretražuje dovoljno je da ona bude jednostruko ulančana.
Struktura čvora liste je takva da sadrži n + 2 polja: n polja za indekse po n dimenzija, jedno polje za
vrednost elementa i jedno dodatno polje pokazivača na naredni element. Slika 5 prikazuje ulančanu
reprezentaciju retke matrice sa slike 6.

Slika 5 – Predstavljanje retke matrice ulančanom listom

6
Ulančane liste

0 0 4 0 0 0 0
0 0 0 5 0 11 0

X = 0 0 0 0 0 0 0
9 0 0 8 0 0 0
0 0 0 0 0 0 15

Slika 6 – Primer retke matrice

Kod ovakvog načina predstavljanja retkog niza umetanje novog elementa i brisanje
postojećeg elementa ne zahtevaju nikakvo pomeranje ostalih elemenata, već samo prosto
prevezivanje liste. Takva pogodnost je postignuta uz nešto veće zauzeće prostora zbog dodatnog
pokazivača. Ovo povećanje je relativno manje ukoliko je dimenzija niza veća (procentualno 100/(n
+ 1)). S druge strane, kod ulančane reprezentacije prostor se alocira samo za onoliko nenultih
elemenata koliko ih trenutno ima, dok vektorska implementacija najčešće zahteva statičko alociranje
prostora za maksimalni očekivani broj elemenata.

Međutim, ovakva ulančana reprezentacija nimalo ne doprinosi efikasnosti pristupa


proizvoljnom elementu, jer je njeno pretraživanje sekvencijalno. Pa zbog toga se svaka vrsta i svaka
kolona matrice predstavljaju sa po jednom listom. Liste su kružne, jednostruko ulančane i imaju
zaglavlje. Čvorovi liste (osim zaglavlja) predstavljaju samo nenulte elemente matrice i imaju format
prikazan na slici 7.

Slika 7 – Format čvora ulančane liste za predstavljanje retke matrice

Polje val sadrži vrednost nenultog elementa, polje row indeks vrste, a polje col indeks
kolone. Prema tome, ako je X[i,j]  0 onda je za odgovarajući čvor val = X[i,j], row = i, a col = j.

7
Ulančane liste

Polje right je pokazivač na sledeći nenulti element u istoj vrsti, a polje down pokazivač na sledeći
nenulti element u istoj koloni. Tako je svaki čvor, koji nije zaglavlje, član dve kružne liste. Za svaku
vrstu i kolonu je predviđena po jedna lista. Zaglavlja lista su organizovana u dva niza R[i] i C[i].
Zaglavlje takve liste ima samo jedno značajno polje koje ukazuje na prvi nenulti element u vrsti
(ako je lista za vrstu) ili koloni (ako je lista za kolonu). Ako neka vrsta ili kolona nema nenultih
elemenata, odgovarajuća lista je prazna, pa zaglavlje ukazuje samo na sebe. Na slici 8 je prikazan
izgled ovakve predstave za retku matricu sa slike 6.

R 1 2 3 4 5 6 7
C

1
1 3 4

2 4 5 2 6 11

4
4 1 9 4 4 8

5
5 7 15

Slika 8 – Predstavljanje vrsta i kolona retke matrice ulančanim listama

Operacija pristupa elementu X[i,j] sada ide po listi na koju ukazuje zaglavlje R[i] ispitujući
elemente sve dok ne naiđe na takav čvor kod kojeg je col = j, pa uzima njegovu vrednost val.
Ukoliko se dođe do elementa čiji je col veći od j ili se vrati do zaglavlja liste, onda je X[i,j] = 0.
Operacija upisivanja vrednosti nekog elementa, koja rezultuje umetanjem novog nenultog elementa,
mora da ulanča novi čvor u dve liste na tačno određenu poziciju, dok postavljanje postojećeg
elementa na nulu mora da izbaci čvor i preveže dve liste. Pri traženju elementa X[i,j] može da se

8
Ulančane liste

krene i po koloni, od zaglavlja kolone C[j], pogotovo ako je i < j, jer je tada verovatnije da se
element nalazi bliže početku kolone nego početku vrste.

Dodatna optimizacija prostora u smislu smanjivanja broja čvorova zaglavlja može da


iskoristi činjenicu da su polja down u zaglavljima vrsta, kao i polja right u zaglavljima kolona
neiskorišćena. Tako se jedan čvor može iskoristiti istovremeno za zaglavlje vrste i i kolone i. Na
ovaj način se broj zaglavlja za matricu M[1:m,1:n] sa m + n smanjuje na max(m, n).

U mnogim algoritmima koji rade sa matricama, elementi se generišu u poretku rastućih


indeksa (na primer, množenje matrica). U tom slučaju je korisno da poredak ulančavanja čvorova po
vrstama i kolonama bude obrnut, pa da umesto pokazivača right i down postoje pokazivači left i up.
Povezivanje u smeru opadajućih indeksa ima za cilj optimizaciju operacije umetanja nenultih
elemenata, jer se tada novi čvor u listu ubacuje odmah iza zaglavlja.

3.2 Predstavljanje skupova

Skup je jedna od osnovnih struktura podataka, fundamentalna za mnoge računarske primene,


naročito u matematici. Veoma česta je primena skupova za implementaciju mnogih apstraktnih
tipova podataka, kao i korišćenje u mnogim algoritmima.

Skup se jednostavno može definisati kao kolekcija članova ili elemenata, gde je svaki član ili
skup ili primitivni, atomski element (celobrojni, znakovni, itd.). Svi članovi jednog skupa su
različiti. Sve moguće vrednosti koje članovi skupa mogu imati čine osnovni skup (universal set).
Među članovima skupa može (ali ne mora) postojati poredak uređenja zasnovan na relacijama veće,
manje i jednako. Skupovna vrednost se obično predstavlja velikim zagradama (na primer, skupovna
vrednost sa četiri celobrojna člana {1, 4, 7, 9}).

Osnovna relacija u teoriji skupova je pripadnost elementa skupu (operator ). Ako x pripada
osnovnom skupu nad kojim je definisana skupovna vrednost A, onda je relacija x  A istinita ako je
x član skupa A, na primer 5  {8, 2, 5}. Skup koji nema nijednog člana se naziva prazan skup - .
Relacija x   je uvek neistinita. Ako je svaki član skupa A takođe i član skupa B, tada je skup A
podskup skupa B (A  B), a skup B je nadskup skupa A (B  A). Prazan skup je podskup svakog

9
Ulančane liste

skupa. Ako je A podskup od B i B je podskup od A, onda je A = B. Ako je A različito od B i A je


podskup od B, onda je A pravi podskup od B (A  B).

Osnovne operacije sa skupovima su unija (+), presek(*) i razlika (-). Unija dva skupa je skup
sa elementima koji su članovi ili skupa A ili skupa B ili oba skupa:

x  (A + B)  (x  A) or (x  B) .

Presek dva skupa čine samo oni elementi koji se nalaze i u jednom i u drugom skupu:

x  (A * B)  (x  A) and (x  B) .

Razliku dva skupa čine oni elementi skupa A koji nisu elementi skupa B

x  (A - B)  (x  A) and not (x  B) .

Na primer, ako skupovi A i B imaju elemente A = {1, 4, 7, 9} i B = {2, 4, 5}, onda je A + B =


{1, 2, 4, 5, 7, 9}, A * B = {4} i A – B = {1, 7, 9}.

Pored ovih operacija javljaju se i operacije umetanja i brisanja pojedinog elementa skupa.

Način reprezentacije skupa se bira na osnovu broja elemenata u skupu i tipičnih operacija.
Dve najčešće implementacije su sekvencijalna i ulančana. Zbog poređenja sa ulančanom, ovde se
ukratko razmatra i sekvencijalna reprezentacija u vidu vektora bitova. Ako osnovni skup fiksne
veličine ima n vrednosti kojima se mogu pridružiti redni brojevi 1..n (vrednosti x1,…, xn), onda se
svaki skup A definisan nad ovim osnovnim skupom može predstaviti vektorom bitova dužine n, gde
i-ti bit predstavlja i-ti element xi osnovnog skupa. Ako je ovaj bit jednak 1, to znači da xi pripada
skupu A, a ako je nula, znači da element xi nije član skupa A.

Osnovna prednost vektorske reprezentacije skupa je efikasna podrška tipičnim operacijama.


Tako se operacije ispitivanja prisustva, ubacivanja i brisanja člana izvode u konstantnom vremenu,
jednostavnim adresiranjem odgovarajućeg bita u vektoru i njegovom proverom, postavljanjem na
vrednosti 1 ili 0, respektivno. Operacije unije, preseka i razlike imaju vremensku složenost
srazmernu veličini osnovnog skupa. Ako je osnovni skup dovoljno mali tako da vektor bitova može
stati u jednu mašinsku reč, onda su ove operacije direktno podržane logičkim operacijama u
mašinskom jeziku. U tom slučaju operacija unije A + B postaje A or B, operacija preseka A * B se
realizuje kao A and B, a razlika A - B kao A and (not B). Operacije provere pripadnosti, umetanja i
brisanja elementa se, takođe, vrlo jednostavno realizuju postavljanjem odgovarajuće maske bitova.

10
Ulančane liste

Osnovni nedostatak vektorske reprezentacije je to što zahteva prostor srazmeran veličini


osnovnog skupa, nezavisno od stvarnog broja članova datog skupa. Zato je vektorska predstava
pogodna samo za male osnovne skupove. Nedostatak u pogledu iskorišćenja prostora se može
prevazići ulančanom reprezentacijom gde je svaki član skupa predstavljen jednim čvorom liste, pa
se zahteva samo prostor srazmeran trenutnom broju elemenata skupa koji se predstavlja. Ovaj način
je i opštiji jer dozvoljava predstavljanje skupova koji nisu podskupovi nekog konačnog osnovnog
skupa. Ukoliko su elementi osnovnog skupa linearno uređeni, ulančana lista takođe može da se
održava uređenom, jer to poboljšava efikasnost operacija. U suprotnom, ulančana lista je neuređena.

Efikasnost skupovskih operacija je smanjena u odnosu na vektorsku reprezentaciju i to je


cena koja se plaća za bolje iskorišćenje prostora. Performansa veoma zavisi od toga da li je lista
uređena ili ne. Tako, na primer, ako se traži presek dva skupa predstavljenih listama i ako su one
neuređene, onda se svaki čvor jedne liste mora porediti sa svakim čvorom druge liste, što, pod
pretpostavkom da su liste dužine n, daje ukupnu složenost reda O(n2). Međutim, ako su liste
uređene, performansa postaje mnogo bolja.

3.3 Predstavljanje polinoma

Potreba za predstavljanjem polinoma u simboličkoj formi i različite operacije sa njima


(sabiranje, oduzimanje, množenje, deljenje, diferenciranje, itd.) je veoma česta i u naučnim i u
poslovnim aplikacijama. Pošto u programskim jezicima ne postoje tipovi koji direktno podržavaju
njihovo predstavljanje, treba da se pronađe takva reprezentacija koja omogućava efikasne operacije.

Ako se radi sa polinomima jedne nezavisno promenljive, polinom je algebarski izraz koji se
sastoji od zbira članova, pri čemu opšti član ima formu aixi. Prema tome, za svaki član treba pamtiti
koeficijent ai i stepen promenljive i. Pri izboru načina predstavljanja treba imati u vidu da polinom
može da ima nepredvidljiv broj članova, da članovi koji odgovaraju mnogim stepenima mogu da
izostanu i da pri operacijama sa njima redovno nastaje potreba za ubacivanjem novih članova ili
brisanjem postojećih. Ovo su upravo tipične okolnosti u kojima je ulančana reprezentacija bolja od
sekvencijalne, pa je prirodno usvojiti predstavu u vidu ulančane liste. Analizom operacija može se
utvrditi da se obično kroz polinom prolazi u jednom smeru, tako da je dovoljno usvojiti jednostruko
ulančanu kružnu listu sa zaglavljem. Prema tome, čvor liste treba da sadrži polja: c za koeficijent,

11
Ulančane liste

exp za stepen promenljive x i next za pokazivač na sledeći čvor. Pored toga, zbog efikasnosti
operacija pogodno je listu držati uređenom po opadajućoj vrednosti polja exp. Tako bi, na primer,
predstava polinoma 3x15 – 8x7 + 2x - 6 izgledala kao na slici 9.

Slika 9 – Predstavljanje polinoma ulančanom listom

12
Ulančane liste

4. Literatura

 Branislav Jevtović - predavanja „Algoritmi i strukture podataka“ 2007-08, Blace

 www.wikipedia.org

13

You might also like