ulancane liste - seminarski

18
VISOKA POSLOVNA ŠKOLA STRUKOVNIH STUDIJA BLACE SEMINARSKI RAD PREDMET: Algoritmi i strukture podataka TEMA: Ulančane liste – primena

Upload: aleksandar-ristic

Post on 04-Jul-2015

225 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Ulancane Liste - Seminarski

VISOKA POSLOVNA ŠKOLA STRUKOVNIH STUDIJA

BLACE

SEMINARSKI RAD

PREDMET: Algoritmi i strukture podataka

TEMA: Ulančane liste – primena

Student:

Aleksandar Ristić 30/08 - III

Page 2: Ulancane Liste - Seminarski

Ulančane liste

Blace, 2009.

Profesor:

dr Branislav Jevtović

3

Page 3: Ulancane Liste - Seminarski

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

Page 4: Ulancane Liste - Seminarski

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

Page 5: Ulancane Liste - Seminarski

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

Page 6: Ulancane Liste - Seminarski

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.

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.

GETNODE

if (avail = nil) then

ERROR(Nema slobodnog čvora)

end_if

q = avail

avail = next(avail)

next(q) = nil

return q

FREENODE(p)

next(p) = avail

avail = p

5

Page 7: Ulancane Liste - Seminarski

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

Page 8: Ulancane Liste - Seminarski

0

0

0

0

9

0

0

0

0

0

0

4

0

0

0

0

0

5

0

8

0

0

0

0

0

0

0

11

0

0

1 5

0

0

0

0

X =

Ulančane liste

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.

Polje right je pokazivač na sledeći nenulti element u istoj vrsti, a polje down pokazivač na sledeći

7

Page 9: Ulancane Liste - Seminarski

Ulančane liste

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.

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

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.

31

42 1 162

914 844

1 575

4

5

R

C

1

2

3

4

5

1 2 3 4 5 6 7

8

Page 10: Ulancane Liste - Seminarski

Ulančane liste

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

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:

9

Page 11: Ulancane Liste - Seminarski

Ulančane liste

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.

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

10

Page 12: Ulancane Liste - Seminarski

Ulančane liste

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,

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.

11

Page 13: Ulancane Liste - Seminarski

Ulančane liste

Slika 9 – Predstavljanje polinoma ulančanom listom

4. Literatura

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

www.wikipedia.org

12

Page 14: Ulancane Liste - Seminarski

Ulančane liste

13