2 NIZ 1 Logika struktura niza Niz je

  • Slides: 27
Download presentation
2 NIZ 1

2 NIZ 1

Logička struktura niza • Niz je uređeni par A = (S(A), r(A)) gde je

Logička struktura niza • Niz je uređeni par A = (S(A), r(A)) gde je S skup elemenata, a r binarna relacija, sa sledećim osobinama: – struktura A je linearna i homogena tj. elementi skupa S(A) su istovrsni – dozvoljen je pristup svakom elementu i to indeksiranjem ključna reč za niz! – operacije dodavanja i uklanjanja mogu, ali ne moraju biti definisane. 2

 • ako se u toku izvršenja programa broj elemenata niza ne menja, tada

• ako se u toku izvršenja programa broj elemenata niza ne menja, tada je u pitanju statički niz; u suprotnom, radi se o dinamičkom nizu. 3

Multiindeksne strukture • Nekada su nizovi skalara, matrice i slične višedimenzionalne strukture bile posebne

Multiindeksne strukture • Nekada su nizovi skalara, matrice i slične višedimenzionalne strukture bile posebne strukture • Danas su ove strukture podvrsta nizova sa imenom multiindeksne strukture – Vektor (niz skalara) je multiindeksna struktura reda 1. – Multiindeksna struktura reda k >1 je niz Nk=(S(Nk), r(Nk)) u kojem su elementi skupa S(Nk) multiindeksne strukture reda k-1. • Multiindeksna struktura reda 2 nosi naziv matrica i predstavlja niz čiji su elementi nizovi skalara (vektori) 4

Operacija pristupa • izvodi se indeksiranjem i najvažnija je operacija kod nizova • pristup

Operacija pristupa • izvodi se indeksiranjem i najvažnija je operacija kod nizova • pristup je veoma brz jer se odvija u jednom pokušaju • kada napišemo x[i] u fazi prevođenja izraz će biti zamenjen formulom dužina elementa adr(x[i]) = adr(x[p]) + (i-p) L adresa x[i] adresa elementa sa najmanjim indeksom najmanji indeks 5

 • u C-u najmanji indeks je uvek p=0, pa je indeksiranje brže (za

• u C-u najmanji indeks je uvek p=0, pa je indeksiranje brže (za oko 1/3) adr(x[i]) = adr(x[0]) + (i-p) L 6

Fizička realizacija niza • zbog operacije indeksiranja, fizička realizacija svih nizova mora biti sekvencijalna

Fizička realizacija niza • zbog operacije indeksiranja, fizička realizacija svih nizova mora biti sekvencijalna 7

Realizacija statičkog niza • statički niz može se realizovati – standardno, naredbom programskog jezika

Realizacija statičkog niza • statički niz može se realizovati – standardno, naredbom programskog jezika T a[DUZINA]; gde se unapred (pri prevođenju) rezerviše memorijski prostor – na hipu, pomoću mehanizma pokazivača, gde se u toku izvršavanja zauzima potreban memorijski prostor T *a; int n; . . . . a = malloc(n*sizeof(T)); • u oba slučaja pristupa se indeksiranjem, a[j] 8

Metoda linearizacije (pakovanje) • ubrzanje pristupa kod multiindeksnih struktura • primenjuje se kod svih

Metoda linearizacije (pakovanje) • ubrzanje pristupa kod multiindeksnih struktura • primenjuje se kod svih procedurnih programskih jezika • struktura se "seče" na delove (npr. matrica na vrste ili kolone) i delovi se sukcesivno smeštaju u memoriju vrsta 0 vrsta 1 . . . . poslednja vrsta 9

 • adresa elementa računa se uopštenjem formule za indeksiranje • neka je M

• adresa elementa računa se uopštenjem formule za indeksiranje • neka je M n-indeksna struktura sa najmanjim indeksima pi (u C-u 0) i najvećim indeksima ki, i=1, . . . , n. Adresa elementa M[j 1]. . . [jn] ra; una se po formuli adr(M[j 1]. . . [jn]) = adr(M[p 1]. . . [pn]) + L* gde se faktor D računa rekurzivno kao – Dm = (km+1 -pm+1+1)Dm+1 Dn=1, m=n-1, n-2, . . . , 1 – Dm = (km-1 -pm-1+1)Dm-1 D 1=1, m=2, 3, . . . , n sečenje po horizontali sečenje po vertikali 10

primer • za C-matricu definisanu kao double p[20][30]; indeksirani izraz p[i][j] računaće se po

primer • za C-matricu definisanu kao double p[20][30]; indeksirani izraz p[i][j] računaće se po formuli adr(p[i][j]) = adr(p[0][0]) + (i*30+j)*sizeof(double) 11

Realizacija dinamičkog niza • realizuje se na hipu • rezerviše se više prostora nego

Realizacija dinamičkog niza • realizuje se na hipu • rezerviše se više prostora nego što je trenutno potrebno (zbog dodavanja) . . . 12

d d[0] d[1] . . . d[n-1] • neka je d dinamički niz tipa

d d[0] d[1] . . . d[n-1] • neka je d dinamički niz tipa T koji se inicijalno smešta u blok veličine B izražene brojem elemenata T *d; int B; d = malloc(B*sizeof(T)); • popunjava se redom od lokacije d[0] do d n -1 gde je n aktuelna dužina niza. 13

dodavanje d . . . uklanjanje d . . . • zbog indeksiranja: •

dodavanje d . . . uklanjanje d . . . • zbog indeksiranja: • pri dodavanju elementi se pomeraju udesno • pri uklanjanju elementi se pomeraju ulevo 14

dodavanje • kada se dodavanjem memorijski prostor veličine B napuni (overflow) mora se povećati

dodavanje • kada se dodavanjem memorijski prostor veličine B napuni (overflow) mora se povećati blokom veličine delta. B, tako da algoritam dodavanja ima sledeći izgled: int j; overflow if(n==B) realloc(d, (B+=delta. B)*sizeof(T)); pomeranje udesno for(j=n++; j>i; j--) d[j]=d[j-1]; d[i] = value; na indeks i upisuje se vrednost value 15

uklanjanje • elementi se pomeraju ulevo //uklanjanje elementa na indeksu i pomeranje ulevo int

uklanjanje • elementi se pomeraju ulevo //uklanjanje elementa na indeksu i pomeranje ulevo int j; for(j=i, n--; j<n; j++) d[j]=d[j+1]; • može se (i ne mora) predvideti skraćivanje memorijskog prostora ako uklanjanjem postane slabo popunjen 16

Sortiranje niza • po definiciji, uređivanje elementa niza u skladu sa nekim kriterijumom (npr.

Sortiranje niza • po definiciji, uređivanje elementa niza u skladu sa nekim kriterijumom (npr. po vrednosti elemenata) • izrazito velik broj postupaka • obradićemo: – metodu izbora (selection sort) – metodu izmene (exchange sort ili bubblesort) – metodu umetanja (insertion sort) – Quicksort 17

Metoda izbora • u svakom prolazu posmatra se podniz ai, ai+1, . . .

Metoda izbora • u svakom prolazu posmatra se podniz ai, ai+1, . . . , an-1 i=0, 1, . . . , n-1 • u podnizu se određuje najmanji element i on menja mesto sa elementom ai. 18

1 2 4 i j 9 7 6 8 ndxmin void selection. Sort(int a[],

1 2 4 i j 9 7 6 8 ndxmin void selection. Sort(int a[], int n) { int i, j, ndxmin, tmp; Tsel = O n 2 for(i=0; i<n; i++) { //odredjivanje indeksa najmanjeg u podnizu for(ndxmin=i, j=i+1; j<n; j++) if(a[ndxmin]>a[j]) ndxmin=j; //zameniti mesta a[i] i a[ndxmin] if(i!=ndxmin) {tmp=a[ndxmin]; a[ndxmin]=a[i]; a[i]=tmp; } } } 19

Metoda izmene • u svakom prolazu posmatra se podniz a 0, a 1, .

Metoda izmene • u svakom prolazu posmatra se podniz a 0, a 1, . . . , ai i=n-1, n-2, . . . , 1 • upoređuju se parovi aj+1; ako nisu u dobrom poretku razmenjuju mesta • postupak se završava ili kada je i=0 ili ako u jednom prolazu nema ni jedne zamene mesta 20

3 1 4 6 9 2 7 void bubble. Sort(int a[], int n) {

3 1 4 6 9 2 7 void bubble. Sort(int a[], int n) { int i, j, chn, tmp; //chn=0: nije bilo zamena u prolazu; zavrsiti for(chn=1, i=n-1; chn&&(i>0); i--) Tbubble = O n 2 for(j=chn=0; j<i; j++) if(a[j]>a[j+1]) //los redosled? da: izmena mesta {tmp=a[j]; a[j]=a[j+1]; a[j+1]=tmp; chn=1; } } 21

Metoda umetanja • u svakom prolazu posmatra se element ai i=1, 2, . .

Metoda umetanja • u svakom prolazu posmatra se element ai i=1, 2, . . . , n-1 • element ai se redom upoređuje sa prethodnicima i sve dok je manji od njih menja sa njima mesto (potiskuje se ka početku sve dok se ne naiđe na manji) 22

1 4 6 7 3 2 9 void insertion. Sort(int a[], int n) {

1 4 6 7 3 2 9 void insertion. Sort(int a[], int n) { int i, j, tmp; Tins = O n for(i=1; i<n; i++) for(j=i; (j>0)&&(a[j]<a[j-1]); j--) {tmp=a[j]; a[j]=a[j-1]; a[j-1]=tmp; } } 2 23

Quicksort (Hoare, 1962) • polazi se od celog niza a 0, a 1, .

Quicksort (Hoare, 1962) • polazi se od celog niza a 0, a 1, . . . , an-1 L=0, R=n-1 • utvrđuje se granična vrednost G=a. L • niz se preuređuje tako što se postavlja granica M takva da su levo od nje elementi manji od G, a desno veći ili jednaki • na kraju elementi a. L i a. M menjaju mesta L 1 M 3 2 4 G=4 7 R 9 6 24

 • potom se isti postupak ponavlja za levi deo (L do M-1) i

• potom se isti postupak ponavlja za levi deo (L do M-1) i za desni deo (M+1 do R) • sa postupkom se nastavlja sve dok ima delova koji imaju više od jednog elementa 25

preuređivanje niza M L 4 G=4 1 6 7 3 9 R 2 i

preuređivanje niza M L 4 G=4 1 6 7 3 9 R 2 i for(M=L, G=a[L], i=L+1; i<=R; i++) if(a[i]<G){tmp=a[++M]; a[M]=a[i]; a[i]=tmp; } tmp=a[M]; a[M]=a[L]; a[L]=tmp; Tquick = O nlog 2 n 26

Redosledna obrada niza • Redosledna obrada (traversing) niza je postupak obrade elemenata redosledom kojim

Redosledna obrada niza • Redosledna obrada (traversing) niza je postupak obrade elemenata redosledom kojim su smešteni u niz (recimo, štampanje elemenata) • izvodi se primenom ciklusa for(i=0; i<n; i++) obraditi a[i] • Ako je Tobr vremenska složenost operacije obrade svakog elementa (i ista je za svaki element), tada je vremenska složenost redosledne obrade Ttrav(n) = n Tobr • kako je Tobr približno konstantno, važi Ttrav(n) = O[n] 27