You are on page 1of 31

Algoritmi i Strukture Podataka

[IR2ASP]

Profesor: Milo Tomašević


Asistent: Đorđe Đurđević (zorz@etf.bg.ac.yu, kab. 36)
Pregled kursa

• Linearne strukture (nizovi, liste, stekovi, redovi)


• Stabla (obilasci, primene); statički Huffman-ov algoritam
• Kompresija: dinamički Huffman-ov alg., LZW alg.
• Grafovi

KOLOKVIJUM

• Osnovne metode pretraživanja


• Stabla binarnog pretraživanja
• Stabla opšteg pretraživanja
• Heširanje
• Sortiranje
2
I
1. Nizovi
Zadatak 1

Potrebno je izvršiti sumiranje svih elemenata matrice


M[32,16] čiji svaki element staje u jednu memorijsku reč.
Matrica je u memoriji smeštena po vrstama.
vrstama Neka je keš
memorija za podatke kapaciteta 256 reči podeljena na 16
blokova dužine 16 reči. Keš memorija je direktno mapirana,
a matrica je smeštena tako da se prvi element matrice
mapira u prvu reč prvog bloka. Podaci nisu pre početka u
keš memoriji. Koliki je faktor uspešnosti kod sledeća dva
primera?

4
Zadatak 1

SUM1 SUM2

sum=0 sum=0
for i=1 to 32 do for j=1 to 16 do
for j=1 to 16 do for i=1 to 32 do
sum=sum+ M[i,j] sum=sum+ M[i,j]
end_for end_for
end_for end_for

5
Rešenje
Zadatak ilustruje posledice razlike u redosledu pristupanja
elementima matrice, uzimajući u obzir hardversku
realizaciju računara.
Dva najčešća načina smeštanja matrica u memoriju
računara:
– Po vrstama
– Po kolonama
Primer:
po vrstama po kolonama
1 5 9 13 1 5 9 13
2 6 10 14 2 6 10 14
3 7 11 15 3 7 11 15
4 8 12 16 4 8 12 16
adresa a a+1 a+2 a+3 a+4 a+5 a a+1 a+2 a+3 a+4 a+5
1 5 9 13 2 6 ... 1 2 3 4 5 6 ... 6
Rešenje

Keš (cache) memorija


– veoma brza memorija
– veoma mali kapacitet (u odnosu na Operativnu Memoriju)
– hardversko rešenje (radi bez softverske intervencije)
Uloga
– smanjiti komunikaciju CPU↔OM
– približiti podatke CPU (kraće vreme dohvatanja podataka)

traži podatak traži podatak na adresi A


nanaadresi
adresiA+1
A i nekoliko narednih

CPU CACHE MEM


vraćanema
podatak vraća podatke sa adresa
traženi podatak
na adresi A+1
A A, A+1, A+2, A+3, ...

7
Rešenje

U postavci zadatka, keš memorija ima sledeće karakteristike


– kapacitet: 256 memorijskih reči
– 16 nezavisnih blokova po 16 memorijskih reči
Keš memorija iz OM dohvata čitav blok (16 reči)
To su obavezno susedne (konsekutivne) memorijske lokacije

Očigledno, redosled smeštanja elemenata matrice


u memoriju, i redosled kojim se obrađuju elementi matrice
utiče na stepen efikasnosti keš memorije.
Matrica je dimenzija 32x16 (32 vrste, 16 kolona)

U jedan blok keš memorije staje jedna vrsta matrice


8
Rešenje M[2,1]
M[1,1] ?
M[2,1], M[2,2],
M[1,1], M[1,2],
M[1,3], ...
M[2,3],
MEM
................
SUM2 CACHE
................
................
................
xxxxxxxxx
................
CPU ................
sum=0 ................
................
................
for j=1 to 16 do ................
................
for i=1 to 32 do ................
sum=sum+ M[i,j] ................
................
end_for ...
end_for

Program pristupa elementima matrice po kolonama


Samo jedan podatak iz dohvaćenog bloka keš memorije će
biti upotrebljen
Pristupi keš memoriji stalno “promašuju” (q=0)
Radi sporije nego da nema keš memorije
NEEFIKASNO!
9
Rešenje M[1,1], M[1,2],
M[1,2]
M[1,1] ? MEM
M[1,3], ... ................
SUM1 ................
CACHE
................
................
xxxxxxxxx
sum=0 CPU ................
................
................
for i=1 to 32 do ................
................
................
for j=1 to 16 do ................
................
sum=sum+ M[i,j] ................
end_for ................
...
end_for

Program pristupa elementima matrice po vrstama


Svi podaci iz dohvaćenog bloka keš memorije će biti upotrebljeni
Pristupi keš memoriji “promašuju” jednom za svaku vrstu matrice
Efikasno!
q=(512-32)/512=0.9375

10
Zadatak 2
Prikazati vektorsku prezentaciju retke matrice sa slike:
a) sa jednim vektorom zapisa od po tri polja,
b) sa tri posebna vektora.

0 0 0 0 0 0
0
0 0 0 0 0 0 
4

0 0 5 0 11 0 
0
X  
0 0 0
0 0 0 0
9 0 8 10 0 0 
0
 
0 0 15 0 0 0 0 

11
Rešenje a)

Svaki zapis se sastoji od


– broja vrste (R)
– broja kolone (K)
– vrednosti (V)

0 0 0 0 0 0 0 R K V
0 0 4 0 0 0 0 
2 3 4
3 4 5
 3 6 11
0 0 0 5 0 11 0  5 1 9
X   5 4 8
0 0 0 0 0 0 0
5 5 10
9 0 0 8 10 0 0  6 3 15
 
0 0 15 0 0 0 0

12
Rešenje b)

Potrebno je formirati 3 nezavisna vektora


– Vektor V sadrži vrednosti i ima onoliko elemenata koliko ima
nenultih elemenata matrice
– Vektor K sadrži broj kolone odgovarajućeg elementa vektora V
– Vektor R sadrži indeks prvog elementa vektora K koji odgovara
datom elementu vektora R i ima onoliko elemenata koliko i vrsta
matrice

0 0 0 0 0 00 R C V
0 0 4 0 0 0 0  1 0 1 3 4
 2 1 2 4 5
0 0 0 5 0 11 0  3 2 3 6 11
X   4 0 4 1 9
0 0 0 0 0 0 0 5 4 5 4 8
9 0 0 8 10 0 0  6 7 6 5 10
  7 3 15
0 0 15 0 0 0 0 
13
Zadatak 3

Šta se dobija na izlaznoj jedinici računara nakon izvršenja


sledećeg FORTRAN programa:
PROGRAM PRIMER SUBROUTINE MISSMATCH(K)
DIMENSION K(3,4) DIMENSION K(1,1)
DO I=1,3 K(2,3)=0
DO J=1,4 RETURN
K(I,J)=I+J END
ENDDO
ENDDO
CALL MISSMATCH(K)
PRINT *, ((K(I,J), J=1,4),
I=1,3)
END

14
Rešenje

Programski jezik FORTRAN


smešta elemente matrice po kolonama

DIMENSION K(3,4)
DO I=1,3 2 3 4 5
DO J=1,4
K(I,J)=I+J

K  3 4 5 6 
ENDDO
ENDDO  4 5 6 7 
CALL MISSMATCH(K)
PRINT *, ((K(I,J), J=1,4),
I=1,3)
END

15
Rešenje

SUBROUTINE MISSMATCH(K)
DIMENSION K(1,1)
K(2,3)=0
RETURN
END 2 3 4 5

K  3 4 5 6 
 4 5 6 7 
Adresa elementa:
Ai,j = Al1,l2 + ((j – l2)(u1 – l1 + 1) + i – l1)s
i=2, j=3,l2=1,l1=1,u1=1

A2,3=A1,1+((3-1)(1-1+1)+2-1)s
16
Zadatak 4

Objasniti postupak smeštanja i izvesti adresnu funkciju pri


pristupu proizvoljnom elementu gornje trougaone matrice
smeštene po kolonama.
kolonama Smatrati da se jedan element
matrice smešta u tačno jednu memorijsku reč.
j
j 1
Broj elemenata j ( j  1)
x x x x x pre prvog elementa
kolone j :
 k
2
x x x x k 1

i x x x
Broj elemenata
x x u koloni j
i 1
x pre traženog elementa:

Aij = A11 + (j(j-1)/2 + i – 1)*s

17
Zadatak 5

Tridijagonalna matrica je matrica reda nxn, gde je A[i,j] = 0,


ako je |i-j|>1.
a) Koliki je maksimalan broj nenultih elemenata ?
b) Ako se matrica linearizuje po vrstama izvesti adresnu funkciju.

a11 a12 a) Max. broj nenultih elemenata: nnz = 3*n – 2

b) Matrica se smešta po vrstama:


a21 a22 a23

a32 a33 a34 a11 a12 a21 a22 a23 a32 a33 ...

a43 a44 a45 0 1 2 3 4 5 6 ...

a54 a55 Aij = A11 + (3(i-1) + j - i + 1 - 1)*s, ako je |i-j| <= 1

Aij = A11 + (2*i + j - 3)*s, ako je |i-j| <= 1


18
I
2. Liste
Zadatak 1

Realizovati operaciju INVERT(list) koja menja poredak


čvorova u listi na čiji prvi čvor ukazuje pokazivač list, tako
da prvi čvor postane poslednji, drugi pretposlednji, itd.

glava

čvor 1 čvor 2 čvor 3 čvor 4


nil

glava

čvor 1 čvor 2 čvor 3 čvor 4


nil

20
Rešenje

5
INVERT(list) čvor l čvor m čvor n
p = list
q = nil
2 1 1 4
while (p  nil)
3
do
r=q
q=p
p = next(p)
r q p
next(q) = r
end_while
list = q

21
Zadatak 2
Realizovati operaciju CONCATENATE(list1,list2) koja
nadovezuje listu na koju pokazuje list2 na listu ukazanu sa
list1:
• ako su liste jednostruko ulančane,
• sa kružno ulančanim listama.

22
Rešenje a)

CONCATENATE(list1, list2) p

if list1 = nil then


list1 = list2 list1 1 2 3

return čvor 1 čvor 2 čvor 3


nil
else if list2 = nil then
return
end_if 4
list2
p = list1
čvor 1 čvor 2 čvor 3 čvor 4
while (next(p)  nil) do nil

p = next(p)
end_while
next(p) = list2

23
Rešenje b)
Spoljni pokazivač (list1 i list2) pokazuje p list1
na poslednji element liste !!

1
CONCATENATE-C(list1, list2)
if (list1 = nil) then čvor 1 čvor 2 čvor 3
3
list1 = list2
return
list2
else if (list 2 = nil) then 2
return čvor 1
4
čvor 2 čvor 3 čvor 4
end_if
p = next(list1)
next(list1) = next(list2)
next(list2) = p
list1 = list2

24
Zadatak 3
Napisati operacije inicijalizacije liste slobodnih ulaza,
alokacije i dealokacije čvora
u slučaju vektorske implementacije ulančanih lista

Vektorska implementacija: umesto pokazivača,


pamte se indeksi u vektoru čvorova

2 3 4 5 6 7 ... 0

indeks 1 2 3 4 5 6 n

25
Rešenje
INIT
avail = 1
for i = 1 to n – 1 do
L[i].next = i +1
end_for
L[n].next = 0

GETNODE
if (avail = 0) then
ERROR(Nema prostora)
end_if
p = avail
avail = L[avail].next
return p

FREENODE(p)
L[p].next = avail
avail = p
26
Zadatak 4
Neka su dva skupa predstavljena uređenim jednostruko
ulančanim listama sa zaglavljima na koja ukazuju
pokazivači A i B. Realizovati funkciju koja vraća pokazivač
na zaglavlje liste koja predstavlja presek ova dva skupa.

Zaglavlje: specifičan čvor na početku liste, čiji informacioni deo


sadrži informacije o samoj listi (koliko čvorova, itd)

glava

zaglavlje čvor 1 čvor 2 čvor 3


nil

27
Rešenje
INTERSECTION(A, B)
r = c = GETNODE Rezultujuća lista obavezno mora da bude
p = next(A) istog tipa kao i liste A i B (sa zaglavljem)
q = next(B)
while (p  nil) and (q  nil) do
if (info(p) = info(q)) then
next(c) = GETNODE
c = next(c)
info(c) = info(p)
p = next(p) r c
q = next(q)
else if (info(p) < info(q)) then
p = next(p)
else
q = next(q) 2 4 6
end_if
end_if zaglavlje čvor 1 čvor 2 čvor 3
end_while
nil
return r 1 3 5

28
Zadatak 5

Neka su dva polinoma sa jednom nezavisnom


promenljivom predstavljena uređenim jednostruko
ulančanim listama sa zaglavljima na koja ukazuju
pokazivači p1 i p2. Realizovati funkciju koja vraća
pokazivač na zaglavlje liste koja predstavlja zbir ova dva
polinoma.

29
Rešenje
POLY-ADD(p1, p2)
r = GETNODE
next(r) = r
exp(r) = -1
t=r
p = next(p1)
q = next(p2)
while (p  p1) or (q  p2) do
if (exp(p) = exp(q)) then
if (c(p) + c(q)  0) then
INSERT-AFTER(t, c(p) + c(q), exp(p))
t = next(t)
end_if
p = next(p)
q = next(q)
else if (exp(p) < exp(q)) then
INSERT-AFTER(t, c(q), exp(q))
q = next(q)
t = next(t)
else
INSERT-AFTER(t, c(p), exp(p))
p = next(p)
t = next(t)
end_if
end_while
return r
30
Zadatak za vežbu
Data je kružna lista sa n elemenata.
Napisati algoritam koji izbacuje svaki osmi član liste.
Uraditi zadatak za jednostruko i za dvostruko ulančane liste.

31

You might also like