Sunteți pe pagina 1din 5

Algoritmul Roy Floyd

Enunt: Fie G=(V, E) un graf neorientat, unde V are n elemente (n noduri) si E are m
elemente (m muchii) memorat prin matricea ponderilor. Sa se determine pentru orice
pereche de noduri u si v lungimea minima a drumului de la nodul u la nodul v.
Descriere Algoritm Serial: Algoritmul foloseste tehnica programarii dinamice. La pasul
k sunt calculate drumurile optime dintre u si v care folosesc ca noduri intermediare
nodurile din multimea {1, 2, ... k}.

Algoritm Serial

for each vertex u in V

for each vertex v in V

dist[u][v] =

end for

dist[u][u] = 0

end for

for each edge (u,v) in E

dist[u][v] = w(u,v)

end for

for k from 1 to |V|

for i from 1 to |V|

for j from 1 to |V|

dist[i][j] = min( dist[i][k] + dist[k][j], dist[i][j])

end for

end for

end for
Complexitate: Timpul de execuie al algoritmului Roy Floyd este determinat de cele 3
cicluri for imbricate. Fiecare execuie a if-urilor necesit un timp O(1), deci algoritmul se
3
execut n timp O( n ), unde n reprezint numrul de vrfuri a grafului (timpul de
execuie este independent de numrul de arce ale grafului).

dist[k][j] = min( dist[k][k] +dist[k][j],

dist[k][j])

dist[i][k] =min( dist[i][k]+dist[k][k],

dist[i][k])
Observam ca dist[i][k] si dist[k][j] nu-si modifica valoarea dupa executia unui pas k
din forul exterior.
Cum fiecare element d[i][j] depinde doar de elemente de pe linia si coloana k deducem
ca elementele matricii pot fi calculate in mod independent..

Algoritmul paralel

for each vertex u in V


for each vertex v in V

dist[u][v] =

end for

dist[u][u] = 0

end for

for each edge (u,v) in E

dist[u][v] = w(u,v)

end for

for k from 1 to |V|


for p from 1 to Processes

for t from 1 to Threads//fiecare thread va executa urmatoare


instructiuni

for i from p * n/ Processes to t * (p/ Processes +1) -1

for j from t * n/ Threads to t* (n/ Threads +1) -1

dist[i][j] = min( d ist[i][k] + dist[k][j], dist[i][j])

end for

end for

end for

end for

end for

Analizarea performantei: Cazul paralel

notam cu P = threads * processes


T(P,n) = n3/P + n2
Bibliografie
Parallel Programmingin C with MPI and OpenMP Michael J, Quinn

http://www.cs.umsl.edu/~sanjiv/classes/cs5740/lectures/floyd.pdf

S-ar putea să vă placă și