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

VISOKA POSLOVNA KOLA STRUKOVNIH STUDIJA

SEMINARSKI RAD PREDMET: ALGORITMI I STRUKTURE PODATAKA Tema: Nizovi

Mentor:

Student:

Blace, 2013. Sadraj UVOD........................................................................................................................................3 1. Niz - definicija........................................................................................................................4 2. Vrste Nizova...........................................................................................................................4 3. Operacije sa Nizovima...........................................................................................................5 4. Predstavljanje nizova u memoriji...........................................................................................5 4.1 Smetanje vektora.............................................................................................................6 4.2 Smetanje matrica.............................................................................................................9 4.2.1 Smetanje po vrstama.................................................................................................9 4.2.2 Smetanje po kolonama...........................................................................................10 5. Optimizacije pri smetanju nizova.......................................................................................11 5.1 Trougaone matrice..........................................................................................................11 5.2 Retki nizovi.....................................................................................................................14 Zakljuak..................................................................................................................................15 Literatura..................................................................................................................................16

UVOD Niz je osnovni stukturirani tip podataka koji postoji u praktino svim viim programskim jezicima. To je istovremeno i jedan od najvie korienih sloenih tipova sa irokim spektrom primena. Ovaj tip se ponekad koristi i za simulaciju i implementaciju nekih drugih struktura, pogotovo linearnih, ali i nelinearnih. S obzirom da su primene niza vrlo brojne i raznovrsne, teko je izdvojiti samo neke od njih i prikazati ih na jednom mestu.

1. Niz - definicija Niz je linearno ureena struktura koja se sastoji od konanog broja homogenih elemenata. Osobina homogenosti se ogleda u tome to su svi elementi niza istog skalarnog ili stukturiranog tipa. Osobina ureenosti, u ovom sluaju, znai da se tano zna koji je prvi, drugi, i tako redom do poslednjeg elementa niza. Ponekad se za niz koriste i alternativni termini kao to su polje ili tabela. 2. Vrste Nizova Po svojoj strukturi najjednostavniji su jednodimenzionalni nizovi, za koje se esto upotrebljava uobiajen naziv - vektori. Za definisanje mesta pojedinog elementa u ovakvom nizu koristi se indeks kao pozicija elementa u okviru niza. Na odreeni nain niz predstavlja preslikavanje iz skupa vrednosti indeksa na skup elemenata niza, tako da svakom indeksu odgovara samo jedan element i obratno. U principu, indeks moe biti svakog onog tipa koji se jednoznano mapira na skup celih brojeva (logiki, znakovni, nabrajani, itd.), ali je najee ceo broj. Neka opseg indeksa niza X pokriva celobrojne vrednosti izmeu donje granice l i gornje granice u. Tada se on moe formalno predstaviti kao: X[l:u] = {X[i]}, i = l, l + 1, , u - 1, u . Broj elemenata u ovako definisanom nizu je u - l + 1. Donja granica l je obino 0 ili 1, ali moe biti i bilo koja druga vrednost, pa i negativna, ako je tako pogodno za aplikaciju. Na primer, diskretne vrednosti funkcije f(x) za opseg celobrojnih vrednosti nezavisno promenljive x se mogu predstaviti kao elementi niza F[i]. Poto, u ovom sluaju, indeks predstavlja nezavisno promenljivu, potrebno je da, u optem sluaju, pokriva negativne i pozitivne vrednosti, kao i vrednost 0. Niz je struktura podataka sa ravnopravnim, direktnim pristupom, jer je svaki element jednako dostupan, pa se elementima moe pristupati u proizvoljnom poretku bez ikakvog ogranienja. Tako se svakom elementu niza moe pristupiti navoenjem imena niza i indeksa elementa u zagradama, na primer X[i].

Viedimenzionalni nizovi predstavljaju generalizaciju jednodimenzionalnih nizova. Tako se, na primer, dvodimenzionalni niz (najee nazivan matrica) moe smatrati jednodimenzionalnim nizom iji su elementi jednodimenzionalni nizovi. U optem sluaju, niz sa n dimenzija ima n opsega indeksa, po jedan za svaku dimenziju, pa se moe predstaviti kao: X[l1:u1, l2:u2,..., ln:un] . 3. Operacije sa Nizovima Prilikom deklarisanja niza u viem programskom jeziku se obavezno navodi ime i broj dimenzija, kao i tip elementa niza. U sluaju da se radi o statikom nizu za svaku dimenziju treba navesti i opseg indeksa, jer se prema tome rezervie prostor pri prevoenju. Postoje i dinamiki nizovi gde broj elemenata moe da varira u vreme izvrenja programa. Osnovna operacija sa nizom je selekcija ili ekstrakcija elementa, koja se vri navoenjem imena i po jedne vrednosti indeksa za svaku dimenziju. Prilikom selekcije elementa, indeksi se mogu zadavati kao konstante, promenljive ili kao izrazi. Pritom se pretpostavlja da se izraunate vrednosti nalaze u dozvoljenom, deklarisanom opsegu po odgovarajuoj dimenziji. Veoma je korisno za pouzdanost programa ako sistem ima mogunost provere pri izvravanju programa da li je indeks u deklarisanom opsegu, ime se spreava pogrean pristup nepostojeim elementima niza. Selekcija se vri u cilju manipulacije sa individualnim elementima niza (itanje ili upisivanje), a dozvoljene operacije su odreene tipom samog elementa. Ovo je preovlaujui nain obrade nizova, a da bi se obradilo vie elemenata na isti nain obino se koriste petlje ija se kontrolna promenljiva uzima direktno kao indeks ili slui za njegovo izraunavanje. Na primer, rotacija vektora X[1:n] oko srednjeg elementa gde zamenjuju mesta prvi i poslednji element, drugi i pretposlednji, itd., vri se sledeom petljom:
for i = 1 to n/2 do X[i] X[n i + 1] end_for

4. Predstavljanje nizova u memoriji

Za predstavljanje nizova u memoriji koristi se skoro iskljuivo sekvencijalna reprezentacija, jer ona predstavlja prirodan nain implementacije linearne liste. Zato se praktino i ne razdvaja logiki koncept niza od njegove implementacije. Prema tome, niz se u memoriji implementira kao kontinualni skup susednih memorijskih lokacija. Upravo zbog ovakve sekvencijalne alokacije izuzetno je nepogodno umetati novi element na proizvoljnu poziciju i brisati element sa proizvoljne pozicije. U sekvencijalno alociranom nizu umetanje bi izazvalo pomeranje svih elementa od date pozicije do kraja niza za jednu poziciju navie da bi se oslobodilo mesto za novi element, dok bi, kod brisanja, elementi iznad pozicije uklonjenog elementa morali da se pomere za jednu poziciju nanie da bi se sauvao kontinuitet strukture. U oba sluaja se menjaju indeksi svih elemenata iznad pozicije na kojoj je izvreno umetanje ili brisanje. 4.1 Smetanje vektora Najjednostavnije se implementira jednodimenzionalni niz ili vektor. Ako je za smetaj jednog elementa potrebno s memorijskih rei, onda je za smetaj itavog vektora X[l:u], prikazanog na slici 1, potrebno (u l + 1)s rei.
X [l ] X s Al Ai X[i] X[u]

Slika 1. Predstavljanje vektora u memoriji Elementi su fiziki poreani po redosledu njihovih indeksa, to omoguava jednostavan i ravnopravan pristup svakom pojedinom elementu. Ako je poetna adresa niza, kao adresa prvog elementa u nizu, oznaena sa Al, onda se za pristup elementu X[i] koristi adresna funkcija koja zavisi samo od poetne adrese, indeksa i veliine elementa. Poto se ispred elementa sa indeksom i nalazi i - l elemenata, onda se njegova adresa Ai izraunava kao Ai = Al + (i - l)s .

Adresna funkcija je, oigledno, linearna, to predstavlja vrlo poeljan oblik jer je jednostavna za izraunavanje. Izraunavanje je jo lake ako je l = 0, jer je tada nepotrebna operacija oduzimanja donje granice od indeksa i. Ova injenica objanjava zato je u jeziku C izabrano da prvi element niza ima indeks 0. Pored toga, u jeziku C postoje i druge pogodnosti za adresnu aritmetiku koja olakava pristup elementima niza. Tako, na primer, ime niza predstavlja konstantni pokaziva na prvi element niza, X = adr(X[0]), a pokazivai u okviru niza se inkrementiraju i dekrementiraju za kvant koji odgovara veliini elementa - s. Iskorienje prostora kod sekvencijalne reprezentacije je optimalno, a pristup efikasan, ako je veliina elementa s jednaka jednoj memorijskoj rei ili njenom celom multiplu. Problemi nastaju kada s nije ceo broj memorijskih rei. U tom sluaju moe da se postupi na dva naina koji imaju implikacije na iskorienje prostora i efikasnost operacija. Ako je iskorienje prostora prioritetni cilj, onda se elementi kontinualno smetaju jedan za drugim. Meutim, ovde se potpuno iskorienje prostora u nekim sluajevima plaa neefikasnou pristupa. Na slici 2a. prikazan je sluaj kada je s = 1.6 memorijskih rei (granice rei su prikazane isprekidanim linijama, a granice elementa punim linijama). Tada se element X[l + 1] protee preko tri memorijske rei (druge, tree i etvrte), pa, da bi se on dohvatio, treba proitati sve tri rei i izvesti potrebne ekstrakcije, pomeranja, spajanja, itd. Pored toga, ovaj mehanizam pristupa ne mora biti uniforman za svaku komponentu. Na primer, element X[l + 2] je smeten u dve rei i to na razliitim mestima u odnosu na prethodni sluaj. Zato pristup elementima ovako alociranog niza zahteva dodatne instrukcije i poveava izvrni kod, ime se umanjuju prednosti dobrog iskorienja prostora, a svakako se gubi na vremenu.

a)

X [l] X [l+ 1 ] X [l+ 2 ]

b) X [l] X [l+ 1 ] X [l+ 2 ]

c)

X [l]

X [l+ 5 ]

X [l+ 6 ]
7

Slika 2. Razliiti naini sekvencijalne alokacije niza: a) bez dopunjavanja, s = 1.6, b) sa dopunjavanjem, s = 1.6, i c) pakovanje, s = 0.15 Zbog navedenih nedostataka ee se koristi drugi nain, smetanje sa dopunjavanjem (padding), prikazan na slici 2b. Kod ovog naina za smetanje jednog elementa uzima se s memorijskih rei. Tako se, pri smetanju jednog elementa, preostali prostor u poslednjoj memorijskoj rei koju element zauzima do poetka naredne rei ostavlja neiskorienim, pa sledei element uvek poinje od poetka memorijske rei. Zbog toga su operacije za pristup elementu uniformne i efikasnije, to se plaa neto slabijim iskorienjem prostora. Ovde se iskorienje moe izraunati kao odnos stvarne veliine elementa i veliine prostora koji je rezervisan za element, Su = s / s . Kako je Su > 0.5 kada je s > 0.5, obino se u ovakvim sluajevima usvaja nain smetanja sa dopunjavanjem, jer je efikasnost pristupa esto vanija od iskorienja prostora. Meutim, ako je s < 0.5, faktor iskorienja prostora se moe popraviti stavljanjem vie od jednog elementa u jednu memorijsku re primenom tehnike pakovanja. Ovaj nain smetanja je ilustrovan na slici 2c. za sluaj kada je s = 0.15 memorijskih rei, pa se u jednu memorijsku re stavlja 6 elemenata. Ako se u jednu re stavlja k elemenata, onda se iskorienje popravlja na Su = ks / ks gde je k = 1/s. Eventualni ostatak po smetanju k elemenata u jednu re do poetka sledee rei se ostavlja praznim zbog efikasnosti pristupa. Tada se adresna funkcija za pristup rei u kojoj se nalazi i-ti element niza modifikuje na Ai = Al + (i - l)/k . Kada se pristupi odgovarajuoj rei, element se nalazi na poziciji pomaknutoj od poetka rei za (i - l) mod k elemenata.

4.2 Smetanje matrica Zahvaljujui tome to je memorija jednodimenzionalni niz rei sa linearno rastuim adresama, vektor se u memoriju smeta na prirodan nain, gde su logiki i fiziki redosled elemenata isti. Meutim, kako je matrica dvodimenzionalna struktura, radi smetanja u memoriju mora se izvriti njena linearizacija. Prema tome, dvodimenzionalni logiki poredak elemenata treba prevesti u jednodimenzionalni fiziki poredak. Ovo mora biti uraeno na takav nain da se dobije efikasna adresna funkcija koja dvodimenzionalnu referencu prevodi u linearnu adresu, kao i da se jednostavno moe izraunati veliina prostora potrebnog za smetanje matrice. Za linearizaciju postoje dva osnovna metoda: smetanje po vrstama i smetanje po kolonama. 4.2.1 Smetanje po vrstama Kod smetanja po vrstama (row-major) u alociranom prostoru od poetne adrese matrice se smeta prva vrsta, pa druga vrsta, i tako redom do poslednje vrste. Na neki nain, vrsta se tretira kao zapis koji ima onoliko elemenata koliko ima kolona. Ovakav nain se primenjuje u programskim jezicima C, Pascal, Cobol, PL/I, itd. Za neku matricu X[l 1:u1, l2:u2] adresna funkcija za pristup proizvoljnom elementu X[i,j] se izvodi na sledei nain. Ispred vrste u kojoj se nalazi ovaj element ima i - l 1 vrsta, a svaka vrsta ima onoliko elemenata koliko ima kolona, znai u2 - l2 + 1, pri emu svaki element zauzima prostor od s memorijskih rei. Pored toga, u ovoj vrsti ispred traenog elementa ima jo j - l 2 elemenata, pa je traena adresna funkcija koja daje adresu elementa X[i,j] Ai,j = Al1,l2 + ((i - l1)(u2 - l2 + 1) + j - l2)s gde je Al1,l2 adresa elementa u prvoj vrsti i prvoj koloni. Kao i kod vektora, adresna funkcija za matricu je linearna funkcija indeksa. Na primeru matrice X[1:M,1:N] prikazane na slici 3a. ilustrovano je smetanje po vrstama na slici 3b. Tada se adresna funkcija svodi na Ai,j = A1,1 + ((i - 1)N + j - 1)s .

Moe se primetiti da u poretku elemenata u memoriji prvo varira desni indeks (broj kolone), a zatim levi indeks (broj vrste). Takoe, vidi se da se u adresnom izrazu ne pojavljuje broj vrsta, to objanjava injenicu da u jezicima koji koriste ovakav nain smetanja, pri prenosu matrice po referenci kao argumenta u potprogram, nije potrebno preneti prvu dimenziju.

1 1 1 ,1

j 1, j

N 1 ,N

i,1

i, j

i ,N

M M ,1

M ,j

M ,N

a)
1 ,1 1, j 1 ,N

...

i ,1

i,j

i ,N

...

M ,1

M ,j

M ,N

v r s ta 1

v r s ta i b)

v r s ta M

1 ,1

i,1

M ,1

...

1 ,j

i,j

M ,j

...

1 ,N

i ,N

M ,N

k o lo n a 1

k o lo n a j c)

k o lo n a N

Slika 3. Izgled matrice u memoriji: a) matrica X[1:M,1:N], b) smetanje po vrstama i c) smetanje po kolonama

4.2.2 Smetanje po kolonama Alternativni nain, smetanje po kolonama ( column-major), koristi suprotan nain linearizacije. Od poetne adrese se smeta prva kolona, zatim druga kolona, pa tako redom do poslednje kolone. Ovakav nain alokacije je karakteristian za FORTRAN. Pri izraunavanju
10

adresne funkcije za pristup proizvoljnom elementu X[i,j], polazi se od toga da ispred kolone u kojoj se nalazi ovaj element ima j - l2 kolona, a svaka kolona ima onoliko elemenata koliko ima vrsta (u1 - l1 + 1), pri emu svaki element zauzima prostor od s memorijskih rei. Pored toga, u ovoj koloni ispred traenog elementa ima jo i l1 elemenata, pa je traena adresna funkcija Ai,j = Al1,l2 + ((j l2)(u1 l1 + 1) + i l1)s . Smetanje po kolonama je ilustrovano na slici 3c. na primeru matrice X[1:M,1:N] sa slike 3a. za koju je sada adresna funkcija Ai,j = A1,1 + ((j - 1)M + i - 1)s . Pri smetanju po kolonama, kako se ide po rastuim adresama u memoriji, prvo varira levi indeks (broj vrste) elementa, a zatim desni indeks (broj kolone) sa sporijim periodom jednakim M. Takoe, poto u adresnom izrazu nema broja kolone, oigledno je da pri prenosu matrice u potprogram na FORTRAN-u moe da se izostavi druga dimenzija. 5. Optimizacije pri smetanju nizova Naini smetanja nizova po vrstama i kolonama su izabrani tako da se omogui efikasan pristup proizvoljnom elementu niza izraunavanjem adresne funkcije koja predstavlja linearnu funkciju indeksa elementa. Ovo je postignuto tako to je za svaki element predvieno tano odreeno mesto u memoriji koje zavisi samo od njegovih indeksa, a ne i od njegove vrednosti. S druge strane, postoje posebne vrste nizova kod kojih znaajan broj elemenata ima nultu vrednost, pa se otvaraju mogunosti optimizacije iskorienja prostora tako to bi se pamtile samo nenulte vrednosti. Naravno, to treba uraditi na nain koji nedvosmisleno garantuje eksplicitno oitavanje nenultih elemenata i implicitno oitavanje nultih elemenata. Ovde se razmataju dve vrste ovakvih nizova: trougaone matrice i retki nizovi. 5.1 Trougaone matrice

11

Trougaona matrica je kvadratna matrica kod koje su svi elementi iznad ili ispod glavne dijagonale jednaki nuli. Neka je data kvadratna matrica X[1:n, 1:n]. Ako je X[i,j] = 0 za i < j onda se ova matrica naziva donjom trouganom matricom (slika 4a.), a ako je X[i,j] = 0 za i > j onda se radi o gornjoj trougaonoj matrici (slika 4b.). Ako su i elementi na glavnoj dijagonali jednaki nuli, onda se radi o strogo donjoj (X[i,j] = 0 za i j) (slika 4c.) ili strogo gornjoj (X[i,j] = 0 za i j) trougaonoj matrici (slika 4d.).

x x a)

0
x

x x b)

X
x

X
0 0 c)

0
0 0 d)

0
0

X
0

Slika 4. Trougaone matrice: a) donja, b) gornja, c) strogo donja i d) strogo gornja Ako je X donja trougaona matrica, onda je broj nenultih elemenata najvie

i
i= 1

= n(n + 1)/2 ,

pa se praktino polovina prostora moe utedeti ako se ne pamte elementi iznad glavne dijagonale, jer su oni sigurno jednaki nuli. Ako se primeni modifikovani nain smetanja po vrstama, gde se pamte samo elementi na glavnoj dijagonali i ispod nje, onda bi poredak elemenata u memoriji bio X[1,1] X[2,1] X[2,2] X[3,1] X[3,2] X[3,3] ... Kako je sada pomeraj i-te vrste u odnosu na poetni element
i 1

k
k =0

= i(i - 1)/2 ,
12

proizvoljni elemenat X[i,j] se nalazi na adresi Ai,j = A1,1 + (i(i - 1)/2 + j - 1)s ako je i j, a ima vrednost jednaku nuli ako je i < j. Slian izraz se dobija kad se gornja trougaona matrica smeta po kolonama, samo to indeksi i i j zamene mesta. Ukoliko su u programu potrebne dve trougaone matrice istih dimenzija nxn, od kojih je jedna gornja, a druga donja, onda se one mogu na pogodan nain smestiti u jednu matricu nx(n+1). Ako je X[1:n, 1:n] gornja trougaona matrica, a Y[1:n, 1:n] donja trougaona matrica, njihovim kombinovanjem se moe formirati matrica Z[1:n, 1:(n+1)] na nain prikazan na slici 5a. Tada se elementima matrica X i Y pristupa na sledei nain: X[i,j] = Z[i,j +1] ako je i j Y[i,j] = Z[i,j] ako je i j
1 2 n+1

X[i,j] = 0 za i > j Y[i,j] = 0 za i < j .


1 n

1 2

X Y
n a) n b)

X Y

Slika 5. Kombinovanje gornje i donje trougaone matrice: a) istih dimenzija, b) dimenzija razliitih za jedan Ako su matrice X i Y strogo trougaone onda je dovoljna i matrica Z[1:n, 1:n], pa je X[i,j] = Z[i,j], ako je i j. Ovakav nain je pogodan i ako dimenzije matrica nisu iste, ve se razlikuju za jedan. Na primer, kombinovanjem gornje trougaone matrice X[1:n,1:n] i donje trougaone matrice Y[1:(n-1),1:(n-1)] dobija se matrica Z[1:n,1:n], kao na slici 5b.

13

Ako su obe matrice X i Y istog tipa (na primer, obe gornje trougaone matrice istih dimenzija), da bi delile isti prostor jednu od njih treba transponovati (na primer, matricu Y). Sada se elementima matrice X pristupa na isti nain kao i gore, a elementima matrice Y kao Y[i,j] = Z[j,i] ako je i j Y[i,j] = 0 za i > j .

Deljenjem prostora na ovakav nain postie se ne samo bolje iskorienje prostora, ve i pristup elementima niza iste efikasnosti kao i pri uobiajenim nainima smetanja, bez uslonjavanja adresne funkcije. 5.2 Retki nizovi Dok se kod trougaonih matrica pri smetanju moe utedeti oko 50% prostora, postoje nizovi gde uteda moe da bude jo vea. To su retki nizovi kod kojih postoji relativno veliki broj nultih elemenata. Iz same definicije se vidi da ona nije precizna, jer ne uspostavlja taan kriterijum za procenat nultih elemenata, ali je intuitivno jasno o emu se radi. Na primer, niz koji ima preko 80% ili 90% nultih elemenata se moe nazvati retkim. Tako bi se matrica X sa slike 6. mogla nazvati retkom. U numerikim aplikacijama mogu se pojaviti vrlo veliki nizovi, pogotovo matrice sa stotinama i hiljadama vrsta i kolona, koji nemaju vie od nekoliko procenata nenultih elemenata.

0 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 0

0 0 0 0 15

0 9 0

Slika 6. Primer retke matrice

14

Zakljuak Niz je osnovni stukturirani tip podataka koji postoji u praktino svim viim programskim jezicima. To je istovremeno i jedan od najvie korienih sloenih tipova sa irokim spektrom primena. Niz je linearno ureena struktura koja se sastoji od konanog broja homogenih elemenata. Osobina homogenosti se ogleda u tome to su svi elementi niza istog skalarnog ili stukturiranog tipa. Po svojoj strukturi najjednostavniji su jednodimenzionalni nizovi, za koje se esto upotrebljava uobiajen naziv - vektori. Viedimenzionalni nizovi predstavljaju generalizaciju jednodimenzionalnih nizova. Tako se, na primer, dvodimenzionalni niz (najee nazivan matrica) moe smatrati jednodimenzionalnim nizom iji su elementi jednodimenzionalni nizovi. Za predstavljanje nizova u memoriji koristi se skoro iskljuivo sekvencijalna reprezentacija, jer ona predstavlja prirodan nain implementacije linearne liste.

15

Literatura
1. www.sr.wikipedia.org/sr/_(_) 2. www.sr.wikipedia.org/sr/_ 3. http://ttl.masfak.ni.ac.rs/SUK/109-120%20Fortran.pdf 4. http://www.scribd.com/doc/120131691/Nizovi 5. http://imi.pmf.kg.ac.rs/component/docman/doc_view/57-08-nizovi.html

16

You might also like