Académique Documents
Professionnel Documents
Culture Documents
a1 , a2 , , a n
a secvenei
corectitudinii algoritmilor i
eficienei acestora
Pseudocod
Convenii de notare
Indentarea descrie o structura de tip bloc
If-then-else, precum si structurile repetitive while, for, repeat-until au
semnificaie similar cu cea din C
// este utilizat pentru comentarii
Variabilele sunt locale fiecarei proceduri
Transmiterea parametrilor in proceduri se realizeaz intotdeauna prin
valoare
Operatorii logici and si or se evalueaz prin scurt-circuitare
=> Nu orice algoritm corect funcioneaz n mod utilizabil pe orice resurse de calcul
Complexitatea algoritmilor
divide-and-conquer
Complexitatea algoritmilor
Problema de dimensiune
1/ b
se imparte in
subprobleme de dimensiune
D(n)
T ( n) =
{ ()
aT
( 1 ) , dac n c
n
+ D ( n )+ C ( n ) ,caz contrar
b
D ( n )=1
Pasul divide:
n
2T ( )
2
T ( n) =
(1)
dac n=1
n
2T
+(n) dac n>1
2
()
Rezult:
T ( n ) =(n log 2 n)
Heap
C ( n ) =(n)
n/2 , deci
PARENT(i) = i/2
LEFT(i) = 2i
RIGHT(i) = 2i+1
- imparire intreag
Max-heap:
A [ PARENT ( i ) ] A [ i ]
Min-heap:
A [ PARENT ( i ) ] A [ i ]
Inlimea unui nod: cel mai mare numr de laturi de la nod la o frunz
descend din acel nod
(log 2 n) rog
Se presupune c:
LEFT(i) i RIGHT(i) sunt Max-heap
A[i] este mai mic dect copii lui
Se poate porni de jos n sus (de la frunze) care sunt heap de heapsize=1
pentru a construi heapul
Loop invariant: la nceputul fiecrei iteraii a buclei for, fiecare din nodurile
i+1, i+2, ..., n sunt rdcinile unui heap
Se execut
O(n)
n
log 2
O
T ( n ) =O(n)
Heapsort
O(n)
Pentru fiecare dintre cele n-1 apeluri din bucla for avem timpul de executie
pentru Max-heapify
O(log 2 n)
Performanta quicksort
Cazul celmaidefavorabil
( n)
T ( n ) =T ( n1 )+ T ( 0 ) + ( n )=T ( n1 ) + ( n )=(n2)
T ( n ) =2T
( n2 )+ ( n) =(n log n)
2
Cazul mediu
n
n log 10
9n
n
T ( n ) =T
+T
+ cn=O
10
10
( ) ( )
=>performanta quicksort:
O ( n log 2 n )
Randomized quicksort
Programarea dinamic
PD rezolv fiecare sub-subproblem o singur dat si salveaz rezultatul intro tabel cu rezultate
Se evit astfel ca o sub-subproblem s fie rezolvat de mai multe ori
Dorim s identificam o solutie cu valoarea cea mai mica / cea mai mare
Programare dinamic pai
1. Se caracterizeaz structura unui soluii optime
2. In mod recursiv, se definete valoarea unui soluii optime
pi
bar de lungime i (lungime intreag). Se cere determinarea locului unde se vor face
taieturile la o bar de lungime n, astfel nct s se obin ctigul maxim
r n= pi + pi ++ pi
1
i1 , i2 , , ik
cu
pi
pentru
rn .
i=1=,n
este maxim
2n1
Rezolvare recursiv
r n=max ( pi +r ni )
1 i n
CUT-ROD(p,n)
1. if
n= 0
2.
Return 0
3.
q=
4. for
i=1
5.
to n
6. Return q
Analiza CUT-ROD
Acelasi apel CUT-ROD(p,j) se face de mai multe ori => program ineficient
Complexitate exponential n n
n1
j =0
2 abordri:
Abordarea top-down
MEMOIZED-CUT-ROD
1. Fie un sir auxiliarr[0..n]
2. for i=0 to n
r [ i ] =
3.
4. return MEMOIZED-CUT-ROD-AUX(p,n,r)
MEMOIZED-CUT-ROD-AUX(p,n,r)
1. if
r [ n] 0
2.
return r[n]
3. if n==0
4.
q=0
q=
5. else
6.
for i=1 to n
7.
q=max(q, p[i]+MEMOIZED-CUT-ROD-AUX(p,n-i,r))
8. r[n]=q
9. return q
Abordarea bottom-up
BOTTOM-UP-CUT-ROD(p,n)
1. fie r[0..n] un sir de numere
2. r[0]=0
3. For j=1 to n
4.
5.
6.
7.
q=
For i = 1 to j
q=max(q, p[i]+r[j-i])
r[j] = q
8. Return r[n]
Ambeleabordri au timp de executie
(n2 )
Programarea dinamic
Reconstruirea solutiei
EXTENDED-BOTTOM-UP-CUT-ROD(p, n)
1. Fie r[0..n] i s[0..n] douasiruri
2. r[0]=0
3. For j = 1 to n
q=
4.
5.
For i = 1 to j
6.
If q < p[i]+r[j-i]
7.
q = p[i]+r[j-i]
8.
s[j] = i
9.
r[j] = q
10. return r si s
Multiplicarea unui sir de matrici
1:
INMULTIRE-MATRICE(A,B)
If coloane[A]!=linii[B]
2:
3:
4:
5:
6:
C[i,j]=0
7:
8:
C[i,j]=C[i,j]+A[i,k]*B[k,j]
9:
returneaza C
A1
A2
de dimensiune 10 x 100,
de dimensiune 100 x 5,
A3
de
dimensiune 5 x 50
A
( 1 A 2) A 3
Problem:
pi1 x
de dimensiune
( A1 , A 2 , , An ) , matricea
Ai
pi
P ( n )=
dac n=1
P ( k ) P (nk )
dac n 2
n1
k=1
Pentru a calcula
(2n )
A i A i+1 A j =A i .. j
A i .. j
A k +1 deci
A i .. j
Ak
este optim
A i .. k
A k +1.. j
A i .. k
A k +1.. j
m [ i , j ]=
A i .. j , atunci
0
dac i= j
min {m [ i, k ] +m [ k +1, j ] + pi 1 pk p j } dac i j
ik j
Determinarea subproblemelor
In total avem
(n2)+n= ( n )
2
subprobleme
1 i j n
A i .. j
o pstrm intr-
3. Else
Ai
print (
4.
5.
PRINT-OPTIMAL-PARENS(s, s[i, j] + 1, j)
6.
Print )
Greedy intotdeauna face alegerea care pare cea mai bun n fiecare moment,
in sperana c aceast alegere va conduce la soluia optim
Input: o mulime
S={a1 , a2 , , a n }
Fiecare activitate
terminare
f i , cu
Dou activiti
ai
ai
si
aj
ai
i un moment de
are loc n intervalul
suprapun
f 1 f 2 f n1 f n
{a 2 , a 4 , a9 , a11 }
Structura optimal
Fie
S ij
Incluzand
ak
subprobleme
S ij
este
A ij
S kj
S ij
, am mprit problema
S ij
Dac
A ik = Aij S ik
n 2
activiti
i acesta
ak .
n soluia pentru
S ik
aj
ai
A kj =A ij S kj , atunci
A ij = Aik {ak } A kj
S ik
pentru
S ij
S kj
Dac
c [i , j ]
S ij , atunci
c [ i , j ] =c [ i , k ] +c [ k , j ] +1
Pentru
c [i , j ]=
dac S ij=
max { c [ i , k ] +c [ k , j ] +1 }
dac S ij
ak Sij
ak
Alegerea greedy
Intuitiv, alegerea greedy este accea activitate care las resursele disponibile
pentru ct de multe activiti posibile, deci s alegem activitatea cu cel mai
devreme moment de terminare
Alegerea greedy:
compatibile cu
a1
Notm
S k = { ai S , astfel nct s i f k }
Sk
si fie activitatea
am
care se
termin cel mai rapid, atunci aceasta face parte din solutia optim a problemei
Sk
Solutia greedy
Timp de execuie :
a0
cu
f 0=0
(n)
Solutia iterativ
Strategii greedy
Determinm structura optimal a problemei
2. Dezvoltm o soluie recursiv pe baza soluiei optimale
S= { v 1 , v 2 , , v m } . Prin
vi
pn cnd
identificm o solutie
2. Pornim de la solutia vid
3. La pasul pasul
elemente posibile pentru
S=
Si
de
vi
{ v1 , v 2 , , v i }
nu poate conduce la o
Si
v i Si
S i1
{ v1 , v 2 , , v i }
Backtracking algoritm
. k = 1, si
S=
2. While k>0
3.
If k>n
4.
5.
k = k -1
6.
Else
7.
v Sk
If exist
S={v 1 , , v k1 , v }
8.
9.
If
(S)
10.
k = k +1
11.
Fie
soluie partial
xi x j
1 i j k
xi x ji j , pentru toti
S= { x 1 , x 2 , xn } ={0, , 0 }
2. While k>0
3.
4.
5.
6.
7.
8.
k = k-1
x i=x i+1
Else
If
xi n
If
(S)
K = k +1
1 i j k
9.
Else
10.
x k =0
k = k-1
Tipuri de date
(I) un mod de interpretare a unei valori reprezentate n memoria
calculatorului
Ex:
Interpretri:
1179796804 - int reprezentat binar
13457.31640625
FRED
- float
- ir de caractere
Un tip de date necesar unui analist, dar care e posibil s nu existe n limbajul
de programare => necesitatea implementrii
Implementri posibile
Un masiv + o var. auxiliar care memoreaz sfritul cozii
Un masiv + 2 var auxiliare: sfritul cozii i nceputul acesteia
Impl. cu pointeri: 2 var auxiliare: sfritul listei i nceputul acesteia
Specificarea unui ADT
Specificarea operaiilor
Semantica operaiei
Pre-condiii
Post-condiii
Secvene, liste sau iruri dinamice: elementele mulimii sunt stocate ntr-o
anumit ordine
Arbori
Caracteristici:
n: lungimea listei
Se spune ca ai precede pe ai+1 i ai succede pe ai-1
Operaii pe list
Insert(x, p, L)
Locate(x, L)
Retrieve(p, L)
Delete(p, L)
Next(p, L)
Previous(p, L)
Makenull(p, L)
First(L)
Printlist(L)
Implementarea listelor cu iruri
Dezavantaj:
Avantaj:
Dezavantaj:
Avantaj:
Variante de implementare
Acces la list printr-un pointer
Santinele la nceput i/sau sfrit
Santinela:
Un element de list gol care marcheaz nceputul sau sfritul listei
Avantaj: permite inserare uoar de elemente la inceput / sfrit
Liste nlnuite
List simplu nlnuit: fiecare obiect are un atribut cheie i un pointer next
List dublu nlnuit: fiecare obiect are un atribut cheie i doi pointeri: next
i prev
Lista circular:
ultimul element din list pointeaz ctre head
primul element din list pointeaz ctre tail
(n)
Dac nu avem un pointer ctre elementul x, atunci acesta trebuie gsit prin
List-search
LIST-DELETE(L,x)
1. if x.prev
2.
NIL
x.prev.next = x.next
NIL
x.next.prev = x.prev
=> Necesitatea santinelelor: obiect dummy care marcheaz inceputul sau sfritul
listei. Introducem un element L.nil , astfel ncat orice referin la Nil s se
transforme in referinta la L.nil
LIST-SEARCH-SANTINELA(L, k)
1. x = L.nil.next
2. While x
3.
x = x.next
4. Return x
LIST-INSERT-SANTINELA(L, x)
1. x.next = L.nil.next
2. L.nil.next.prev = x
3. L.nil.next = x
4. x.prev = L.nil
Stive
Last-in, first-out
Return true
eroare
3. Else
4.
S.top = S.top 1
Return S[S.top + 1]
Coada
First-in, first-out
Operatii de coad
ENQUEUE(Q,x)
1. Q[Q.tail] = x
2. If Q.tail == Q.length
3.
Q.tail = 1
4. Else
Q.tail = Q.tail + 1
DEQUEUE(Q)
1. x = Q[Q.head]
2. If Q.head == Q.length
3.
Q.head = 1
4. Else
Q.head = Q.head + 1
5. Return x
Conceptul de dictionary
U={0,1, , m1}
T [0. . m1]
Tabele de dispersie
Dac universul de chei U este mare (adic valori mari ale lui m), se pune
problema dimensiunii alocrii unui sir T[0..m-1]
Dac numrul de chei K din dicionar este mult mai mic dect
tabelele de dispersie reduc necesarul de memorie la
(|K|)
m= U ,
iar operaiile
La tabele de dispersie, O(1) pentru cutare este valabil pentru cazul mediu
de utilizare,
La tabele direct adresabile O(1) are loc si pentru cazul cel mai ru
Definiie
h :U {0,1, , m1 }
mU
Deoarece
Plasm elementele care au valori de hash egale in acelai slot, ntr-o list
inlnuit
ntr-o inlnuire
Cel mai rau caz: toate cele n chei se inlnuiesc pe aceai pozitie, unde avem
o list de lungime n => timp de cutare
(n)
nj
este
n
E[ j]==n /m
(1+)
( 1+ )
=> Dac avem n=O(m), atunci operaiile pe tabela de dispersie se fac in O(1)
Adresare deschis
Elementele sunt salvate direct n tabela de dispersie. Deci un slot din tabela
de dispersie contine fie un element fie NIL
h :U { 0,1, , m1 } { 0,1, , m1 }
=1
0,1, , m1
HASH-INSERT(T, k)
HASH-SEARCH(T,
k)
1. i = 0
1. i = 0
2. Repeat
3.
j = h(k,i)
4.
If T[j] == NIL
h ( k , 0 ) ,h ( k ,1 ) , , h ( k ,m1 )
2. Repeat
3.
j = h(k,i)
5.
T[j] = k
0,1, , m1
Probarea liniar
Dac
'
atunci
Probarea ptratic
Dac
atunci
c1
Dispersia dubl
h ( k , i )=( h1 ( k ) +i h2 ( k ) ) mod m
h1
h2 , atunci
h1 ( k )=k mod m
cu m numr prim
Arbore binar de cautare
Fiecare nod de arbore contine cheia, date auxiliare si 3 referinte: left, right si
p care pointeaz ctre nodurile copii stanga respectiv dreapta i ctre nodul
printe
Un arbore este binar de cutare dac este un arbore binar (adic fiecare nod
are cel mult 2 copii) si
INORDER-TREE-WALK(x)
1. If x != Nil
2.
INORDER-TREE-WALK(x.left)
3.
Print x.key
4.
INORDER-TREE-WALK(x.right)
(n)
Return x
3. If k < x.key
4.
Return TREE-SEARCH(x.left, k)
5. Else
Return TREE-SEARCH(x.right, k)
TREE-MINIMUM(x)
1. While x.left != Nil
2.
x = x.left
3. Return x
TREE-MAXIMUM(x)
1. While x.right != Nil
2.
x = x.right
3. Return x
ITERATIVE-TREE-SEARCH(x, k)
1. while x == Nil or k = x.key
2.
If k < x.key
3.
4.
x = x.left
Else
x = x.right
5. Return x
Cutarea nodului cu cheie succesoare in parcurgerea in inordine
TREE-SUCCESSOR(x)
1. If x.right != Nil
2.
Return TREE-MINIMUM(x.right)
3. y = x.p
4. While y != Nil and x == y.right
5.
x=y
6.
y = y.p
7. Return y
Inserarea unui nod
TREE-INSERT(T, z)
1. y = Nil
2. x = T.root
3. While x != Nil
4.
y=x
5.
6.
x = x.left
7.
Else
x = x.right
8. z.p = y
9. If y == Nil
10.
y.left = z
3 cazuri:
Se sterge un nod frunz
Se sterge un nod cu un singur copil: acesta urc in sus in arbore
Se sterge un nod cu 2 copii: se gseste succesorul nodului care se
sterge. Subarborele drept este elevat, subarborele stang este agatat in
stanga succesorului
TREE-DELETE(T, z)
1. If z.left == Nil
2.
TRANSPLANT(T, z, z.right)
TRANSPLANT(T, z, z.left)
5. Else
6.
y = TREE-MINIMUM(z.right)
If y.p != z
7.
TRANSPLANT(T, y, y.right)
8.
y.right = z.right
9.
y.right.p = y
10.
TRANSPLANT(T, z, y)
11.
y.left = z.left
12.
y.left.p = y
TRASNPLANT(t, u, v)
1. If u.p == Nil
2.
T.root = v
3. Elseif u == u.p.left
4.
u.p.left = v
5. Else u.p.right = v
6. If v != Nil
7.
v.p = u.p
Definire, proprieti
Arbore rou-si-negru: arbore binar de cutare la care fiecare nod are bit
suplimentar, reprezentnd culoarea: rou sau negru.
Proprieti
O ( log ( n ) )
LEFT-ROTATE (T,x)
1. y = x.right
2. x.right = y.left
3. If y.left != T.nil
4.
y.left.p = x
5. y.p = x.p
6. If x.p ==T.nil
7.
2 log ( n+ 1)
T.root = y
8. Elseif
9.
x == x.p.left
x.p.left = y
Inserare
RB-INSERT(T,z)
1. y = T.nil
2. X = T.root
3. While x != T.nil
4.
y=x
5.
6.
x = x.left
7.
Else
x = x.right
8. z.p = y
9. If y == T.nil
10
T.root = z
y.left = z
If z.p == z.p.p.left
3.
y = z.p.p.right
4.
If y.color == RED
5.
6.
y.color = BLACK
7.
z.p.p.color = RED
8.
Z = z.p.p
9.
Else if z == z.p.right
10
Z = z.p // caz 2
11
LEFT-ROTATE(T,z)
12.
13.
z.p.p.color = RED
14.
RIGHT-ROTATE(T, z.p.p)
15.
Else (similare cu partea then, doar ca se interschimba intre ele right cu left)
T.root = v
3. Elseif u == u.p.left
4.
u.p.left = v
5. Else u.p.right = v
6. v.p = u.p
TREE-TRASNPLANT(t, u, v)
1. If u.p == Nil
2.
T.root = v
3. Elseif u == u.p.left
4.
u.p.left = v
5. Else u.p.right = v
6. If v != Nil
7.
v.p = u.p
RB-DELETE(T, z)
1. y = z
2. y-original-color = y.color
3. If z.left == T.nil
4.
x = z.right
5.
RB-TRANSPLANT(T, z, z.right)
x = z.left
8.
RB-TRANSPLANT(T, z, z.left)
9. Else y = TREE-MINIMUM(z.right)
10.
y-original-color = y.color
11.
x = y.right
12.
If y.p == z
13.
14.
x.p = y
Else
RB-TRANSPLANT(T, y, y.right)
15.
y.right = z.right
16.
y.right.p = y
17.
RB-TRANSPLANT(T, z, y)
18.
y.left = z.left
19.
y.left.p = y
20.
y.color = z.color
TRANSPLANT(T, z, z.right)
TRANSPLANT(T, z, z.left)
5. Else
6.
y = TREE-MINIMUM(z.right)
If y.p != z
7.
TRANSPLANT(T, y, y.right)
8.
y.right = z.right
9.
y.right.p = y
10.
TRANSPLANT(T, z, y)
11.
y.left = z.left
12.
y.left.p = y
RB-DELETE-FIXUP(T, x)
If x == x.p.left
3.
w = x.p.right
4.
If w.color == RED
5.
6.
x.p.color = RED
7.
LEFT-ROTATE(T, x.p)
8.
w = x.p.right
9.
10.
11.
x = x.p
12.
13.
14.
w.color = RED
15.
RIGHT-ROTATE(T, w)
16.
w = x.p.right
17.
18.
x.p.color = BLACK
19.
w.right.color = BLACK
20.
LEFT-ROTATE(T, x.p)
21.
X = T.root
22.
Graf:
G=(V , E)
V 2
|E| : liste de adiacen
Liste de adiacen:
Reprezint un sir Adj de |V| liste, cate o list pentru fiecare nod din graf
Pentru fiecare
u V ,
exist un arc
(u , v ) E
G. Adj [u]
Adj [ u]
Notatia
v Adj [u ]
(V + E)
aij =
V V ,
1, dac(i , j) E
0, n caz contrar
(V 2) , indiferent de
numrul de noduri
A= A
Notaii:
Dac
(u , v ) E
Nodurile gri pot avea noduri albe adiacente: acestea reprezint frontiera
dintre nodurile descoperite sau nu
Parcurgere in latime
BFS(G,s)
1. For fiecare nod
u G .V { s }
2.
u.color = WHITE
3.
u.d =
4.
5. s.color = GRAY
6. s.d = 0
7. s. = Nil
8. Q =
9. ENQUEUE(Q, s)
10. While
11.
u = DEQUEUE(Q)
12.
13.
v G . Adj [u]
If v.color == WHITE
14.
v.color = GRAY
15.
v.d = u.d + 1
16.
v. = u
17.
ENQUEUE(Q,v)
18
u.color = BLACK
( s , v )=
Dac avem un graf G=(V,E), si s un nod arbitrar din V, atunci pentru orice arc
(u , v ) E , avem
( s , v ) ( s ,u )+1
v . d= (s , v )
PRINT-PATH(G, s, v)
1. If v == s
2.
Print s
3. Elseif v. == Nil
4.
5. Else
6.
PRINT-PATH(G, s, v.)
Print v
Parcurgerea in adancime
Dac toate arcele unui nod v au fost explorate, atunci algoritmul face backtracking la urmtorul nod care trebuie explorat dup v
DFS(G)
2.
u.color = WHITE
3.
u. = Nil
4. Time = 0
6.
u G .V
u G .V
If u.color == WHITE
7.
DFS-VISIT(G, u)
1. Time = time + 1
2. u.d = time
3. u.color = GRAY
4. For fiecare
5.
If v.color == WHITE
6.
v. = u
7.
DFS-VISIT(G, v)
8. u.color = BLACK
9. Time = time+1
DFS-VISIT(G, u)
v G . Adj [u]
Sortare topologic
TOPOLOGICAL-SORT(G)
1. Apeleaz DFS(G) pentru a calcula v.f pentru fiecare nod v
2. Pe msur ce fiecare nod este terminat de parcurs, inserm acest nod in varful
unei liste inlnuite
3. Return lista inlnuit
maximal de noduri
C exist o cale de la u la v si de la v la u
STRONGLY-CONNECTED-COMPONENTS(G)
1. Apeleaz DFS(G) pentru a calcula u.f pentru fiecare nod u
2. Calculeaz
G =(V , E )
3. Apeleaz DFS( G
G=(V , E)
Graf:
w ( T )=
T E
w(u , v)
(u , v)T
este minim
O ( E log V )
4.
A= A { (u , v ) }
5. Return A
O tietur (S, V-S) a unui graf neorientat G=(V,E) este o partitie a lui V
Un arc
(u , v ) E
V-S
Un arc este un arc usor care taie o tietur dac costul w a arcului este
minimum dintre costurile tuturor arcelor care taie tietura
C=( V C , E C )
Algoritmul gseste arcul safe (u,v) dintre toate arcele care conecteaz 2
arbori in pdurea de arbori arc cu costul cel mai mic
MST-KRUSKAL(G, w)
1. A =
v V
2. For fiecare
3.
MAKE-SET(v)
If FIND-SET(u)
FIND-SET(v)
A= A { (u , v ) }
7.
8.
UNION(u,v)
9. Return A
u.key =
3.
u. = Nil
u V
4. r.key = 0
5. Q = V
6. While Q !=
7.
u = EXTRACT-MIN(Q)
8.
For fiecare
9.
If
v G . Adj [ u ]
v Q
10
v. = u
11.
v.key = w(u,v)
Dac se d harta unei tri, s se gseasc drumul cel mai scurt intre 2 orase
Definirea problemei
p= v 0 , v 1 , , v k
w ( p )= w(v i1 , v i) .
i=1
(u , v )=
(u , v)
de la u la v este:
caz contrar
p= v 0 , v 1 , , v k
pentru orice
vi
0 i j k
pij = v i , v i+1 , , v j
v0
vk
atunci
vj
v .
Notm cu
includem sursa s in
Notm cu
V , E
G = ) este arborele cu cai minime: arborele cu rdcina in
Atunci graful
v.d =
3.
v .
= Nil
4. s.d = 0
Tehnica relaxrii: pentru un arc (u,v) inseam a testa dac se poate
imbunti calea cea mai scurt ctre v trecnd prin nodul u
RELAX(u, v, w)
1. If v.d > u.d + w(u,v)
2.
3.
v .
=u
Algoritmii difer prin numrul de relaxri aplicate pentru fiecare arc din graf
Proprieti ale cilor minimale
( s , v ) ( s ,u )+ w ( u , v )
(s , v)
v . d (s , v ) . Dac
restul algoritmului
v . d= ( s , v )=
u . d= ( s , u )
v . d= ( s , v ) dup relaxare
p= v 0 , v 1 , , v k
(v k1 , v k )
s=v 0
(v 0 , v 1 ) ,
la
vk
(v 1 , v 2 ) ,
relaxri mai sunt realizate de algoritm, si indiferent cum aceste relaxri sunt
mixate cu cele din calea p
v . d= ( s , v ) pentru
7.
Return FALSE
8. Return TRUE
Algoritmul indica FALSE in cazul in care gaseste un ciclu cu cost negativ
Timp de executie: O(VE)
Cai minime in grafuri aciclice (DAG)
DAG-SHORTEST-PATH(G, w, s)
1. Se sorteaz[ topologic nodurile din G
2. INITIALIZE-SINGLE-SOURCE(G, s)
3. For fiecare nod u, considerat in ordinea topologica
4.
G.Adj[u]
5.
RELAX(u, v, w)
(V + E)
w (u , v) 0
S=
u = EXTRACT-MIN(Q)
S=S { u }
6.
7.
Q=
8.
v G . Adj [ u ]
RELAX(u, v, w)
Timp de executie:
O(V )
dac
V
V /log
E=o
2
v . d= ( s , v ) pentru fiecare