Professional Documents
Culture Documents
Algoritmi I Strukture Podataka
Algoritmi I Strukture Podataka
tehniku i informatiku
Milo V. Tomašević
III Pretraživanje
IV Sortiranje
Algoritmi i strukture podataka Uvod
Najčešće u pseudojeziku
Uvod
Algoritmi i strukture podataka Zapis
Koristi se u implementaciji
dinamičkih struktura
datoteka
Po mestu čuvanja
unutrašnje (u operativnoj memoriji)
spoljašnje (datoteke)
a)
b)
Operacije
obilazak po poretku 1..n
pretraživanje
pristup elementu
umetanje
brisanje, ...
Algoritmi i strukture podataka Linearne strukture podataka
Implementacija
sekvencijalna – niz
ulančana – ulančana lista
Disciplina pristupa
LIFO - stek
FIFO - red
Algoritmi i strukture podataka Nizovi
Niz - homogeni struktuirani tip
Selekcija elementa
Operacije
Linearne strukture podataka
Algoritmi i strukture podataka Smeštanje vektora
Sekvencijalna reprezentacija,
ne razdvaja se logički koncept od implementacije
Al Ai
Sa dopunjavanjem (padding)
iskorišćenje prostora Su = s / s
efikasniji pristup
X i i,1 i, j i,N
M M,1 M, j M,N
Linearizacija
po vrstama (row-major)
po kolonama (column-major)
Linearne strukture podataka Nizovi Predstavljanje nizova u memoriji
Algoritmi i strukture podataka Smeštanje po vrstama
X[l1:u1, l2:u2]
1,1 1, j 1,N ... i,1 i,j i,N ... M,1 M,j M,N
X[1:M,1:N]
1,1 i,1 M,1 ... 1,j i,j M,j ... 1,N i,N M,N
X[1:M,1:N]
Leksikogafski poredak
Efikasno izračunavanje
offset = 0
for j = 1 to n do
offset = U [j ] offset + I [j ] - 1
end_for
A = A1,..,1 + s * offset
x x
x 0 x X
a) b)
X 0
x x
0 0
0 0 0 X
c) d)
X 0
0 0
X X
Y Y
n n
a) b)
Vektorska reprezentacija
Neefikasne operacije!
R C V
0 0 4 0 0 0 0 1 3 4
2 4 5
0 0 0 5 0 11 0
2 6 11
X = 0 0 0 0 0 0 0
4 1 9
9 0 0 8 0 0 0
4 4 8
0 0 0 0 0 0 15 5 7 15
Po načinu povezanosti
jednostruko ulančane
dvostruko ulančane
kružne
nekružne
Po organizaciji
uređene
neuređene
INSERT-AFTER(p, x)
q = GETNODE
info(q) = x
next(q) = next(p)
next(p) = q
y z y z
⇒
p p x
q q
y z x z
⇒
p p y
q q
x y z
⇒
p
x z
DELETE(p)
q = next(p)
next(p) = next(q)
info(p) = info(q)
FREENODE(q)
x y y
⇒
p q p
SEARCH(list, x)
p = list
while (p ≠ nil) and (info(p) ≠ x) do
p = next (p)
end_while
return p
SEARCH-ORD(list, x)
p = list
while (p ≠ nil) and (info(p) < x) do
p = next(p)
end_while
if (p ≠ nil) and (info(p) > x) then
p = nil
end_if
return p
list
⇒
y x
list
a) H
list
b) H
next(prev(p)) = p = prev(next(p))
p q
prev info next
p q
prev info next
y z y z
⇒ 3 5 6 4
p p
x
1 2
q q
x y z
q p ⇒ r
x z
q r
Sekvencijalna reprezentacija
efikasniji pristup elementu
pogodna za statičke strukture
Linearne strukture podataka Ulančane liste Poređenje ulančane i sekvencijalne reprezentacije linearnih lista
Algoritmi i strukture podataka Predstavljanje retkih nizova
Jednostruko ulančane liste (čvor - nenulti element)
list
1 3 4 2 4 5 2 6 11
4 1 9 4 4 8 5 7 15
1
1 3 4
2 4 5 2 6 11
4
4 1 9 4 4 8
5
5 7 15
Ulančana implementacija
čvor - element skupa
prostorno efikasnije
manje efikasne operacije
(za uređene liste – O(n),
za neuređene liste – O(n2))
3 15 -8 7 2 1 -6 0
a) A B C D E
b top
b) A B C D E
b top
c) A B F G
b top
6 5 9 1 6 5 9 1 3 2
top top
c)
6 5 9 1 3 2
top
Provera da li je Umetanje
prazan
STACK-EMPTY(S) PUSH(S, x)
if (top[S] = 0) then if (top[S] = n) then
return true ERROR(Overflow)
else else
return false top[S] = top[S] + 1
end_if S[top[S]] = x
end_if
POP(S) TOP(S)
if (top[S] = 0) then if (top[S] = 0) then
return underflow return underflow
else else
x = S[top[S]] return S[top[S]]
top[S] = top[S] – 1 end_if
return x
end_if
S1 S2
a)
S1 S2
b)
a)
b)
S1 S2 S3 S4 S5
c)
POP-M(i) PUSH-M(i, x)
if (top[i] = b[i]) then if (top[i ] = b[i + 1]) then
return underflow ERROR(Overflow)
else else
x = V[top[i]] top[i ] = top[i ] + 1
top[i] = top[i] – 1 V[top[i ]] = x
return x end_if
end_if
s
b) x y
PUSH-L(s, x) POP-L(s)
p = GETNODE if (s = nil) then
info(p) = x return underflow
next(p) = s else
s=p p=s
s = next(p)
x = info(p)
FREENODE(p)
return x
end_if
a)
I H G F E D C B A
rear front
b)
I H G F E D C B A
rear front
a) d) C
front
rear
b) A B e) C D E?
c) B C f) E?
Q[1] Q[n]
Q[n] Q[1]
front = rear = 0
a) b)
front=rear front
front
c) d)
rear
front
rear
INSERT(Q, x)
rear[Q] = rear[Q] mod n + 1
if (front[Q] = rear[Q]) then
ERROR(Overflow)
Umetanje else
Q[rear[Q]] = x
if (front[Q] = 0) then
front[Q] = 1
end_if
end_if
Linearne strukture podataka Redovi Implementacija reda i operacije sa njim
Algoritmi i strukture podataka Operacije sa redom
a) 2 0 3
front rear
b) 8 5 2 0 3 1
rear front
c) 8 5 2 0 3 1
rear front
front
front
Q[n-1] Q[0] rear
Provera Brisanje
QUEUE-EMPTY-0(Q) DELETE_0(Q)
if (front[Q] = rear[Q]) then if (front[Q] = rear[Q]) then
return true return underflow
else else
return false front[Q] = (front[Q] + 1) mod n
return Q[front[Q]]
end_if
end_if
Umetanje
INSERT_0(Q, x)
rear[Q] = (rear[Q] + 1) mod n
if (front[Q] = rear[Q]) then
ERROR(overflow)
else
Q[rear[Q]] = x
end_if
a)
b)
c)
q
a) y z v
rear
q
b) y z v x
rear
q
c) z v x
rear
Uvod
Algoritmi i strukture podataka Prioritetni red
PQ-INSERT(pq, x)
q = nil
p = pq
while (p ≠nil) and (x ≥ info(p)) do
q=p
p = next(p)
end_while
if (q = nil) then
PUSH-L(pq, x)
else
INSERT-AFTER(q, x)
end_if