Algorithme parallèle - Tri
Le tri est un processus qui consiste à organiser les éléments d'un groupe dans un ordre particulier, c'est-à-dire dans l'ordre croissant, dans l'ordre décroissant, dans l'ordre alphabétique, etc. Nous aborderons ici ce qui suit -
- Tri d'énumération
- Tri de transposition pair-impair
- Tri de fusion parallèle
- Tri hyper rapide
Le tri d'une liste d'éléments est une opération très courante. Un algorithme de tri séquentiel peut ne pas être assez efficace lorsque nous devons trier un énorme volume de données. Par conséquent, des algorithmes parallèles sont utilisés pour le tri.
Tri d'énumération
Le tri par énumération est une méthode d'organisation de tous les éléments dans une liste en recherchant la position finale de chaque élément dans une liste triée. Cela se fait en comparant chaque élément avec tous les autres éléments et en trouvant le nombre d'éléments ayant une valeur inférieure.
Par conséquent, pour deux éléments quelconques, a i et a j l'un quelconque des cas suivants doit être vrai -
- a i <a j
- a i > a j
- a i = a j
Algorithme
procedure ENUM_SORTING (n)
begin
for each process P1,j do
C[j] := 0;
for each process Pi, j do
if (A[i] < A[j]) or A[i] = A[j] and i < j) then
C[j] := 1;
else
C[j] := 0;
for each process P1, j do
A[C[j]] := A[j];
end ENUM_SORTING
Tri de transposition pair-impair
Le tri par transposition impair-pair est basé sur la technique du tri à bulles. Il compare deux nombres adjacents et les change, si le premier nombre est supérieur au deuxième nombre pour obtenir une liste d'ordre croissant. Le cas contraire s'applique pour une série par ordre décroissant. Le tri de transposition impair-pair fonctionne en deux phases -odd phase et even phase. Dans les deux phases, les processus échangent des numéros avec leur numéro adjacent à droite.
Algorithme
procedure ODD-EVEN_PAR (n)
begin
id := process's label
for i := 1 to n do
begin
if i is odd and id is odd then
compare-exchange_min(id + 1);
else
compare-exchange_max(id - 1);
if i is even and id is even then
compare-exchange_min(id + 1);
else
compare-exchange_max(id - 1);
end for
end ODD-EVEN_PAR
Tri de fusion parallèle
Le tri par fusion divise d'abord la liste non triée en sous-listes les plus petites possibles, la compare à la liste adjacente et la fusionne dans un ordre trié. Il implémente très bien le parallélisme en suivant l'algorithme de division et de conquête.
Algorithme
procedureparallelmergesort(id, n, data, newdata)
begin
data = sequentialmergesort(data)
for dim = 1 to n
data = parallelmerge(id, dim, data)
endfor
newdata = data
end
Tri hyper rapide
Le tri hyper rapide est une implémentation du tri rapide sur hypercube. Ses étapes sont les suivantes -
- Divisez la liste non triée entre chaque nœud.
- Triez chaque nœud localement.
- À partir du nœud 0, diffusez la valeur médiane.
- Divisez chaque liste localement, puis échangez les moitiés dans la dimension la plus élevée.
- Répétez les étapes 3 et 4 en parallèle jusqu'à ce que la cote atteigne 0.
Algorithme
procedure HYPERQUICKSORT (B, n)
begin
id := process’s label;
for i := 1 to d do
begin
x := pivot;
partition B into B1 and B2 such that B1 ≤ x < B2;
if ith bit is 0 then
begin
send B2 to the process along the ith communication link;
C := subsequence received along the ith communication link;
B := B1 U C;
endif
else
send B1 to the process along the ith communication link;
C := subsequence received along the ith communication link;
B := B2 U C;
end else
end for
sort B using sequential quicksort;
end HYPERQUICKSORT