V. ĐÁNH GIÁ CHƢƠNG TRÌNH SONG SONG
2. Thuật toán sắp xếp so sánh và đổi chổ
Bài toán: cho mảng a[n] các số nguyên. Hãy sắp xếp tăng
dần các phần tử của mảng.
Ý tƣởng thuật toán: so sánh hai phần tử liền kề nhau. Nếu
chưa theo thứ tự thì đổi chổ nhau. Quá trình lặp lại cho đến khi nào không còn cặp nào không thỏa mãn thì dừng.
Thuật toán tuần tự:
5.6 CÁC THUẬT TOÁN SẮP XẾP SONG SONG
for(i=n-1; i > 0; i--){ for(j=0; j < i; i++){ k = j + 1; if(a[j] > a[k]){ temp = a[j]; a[j] = a[k]; a[k] = temp; } } } 306
2. Thuật toán sắp xếp so sánh và đổi chổ
Thuật toán song song: Ý tƣởng thuật toán
• Dùng n tiến trình kết hợp theo nguyên lý hình ống để sắp xếp mảng a[n]
• Hệ thống được chia thành 2 pha: pha chẵn và pha lẻ -Pha chẵn: gồm các tiến trình được đánh số chẵn so sánh
với những tiến trình tiếp theo (số lẻ), nếu nó giữ phần tử lớp hơn thì trao đổi dữ liệu với tiến trình đó.
-Pha lẻ: các tiến trình được đánh số lẻ hoạt động tương tự
như trên
307
Ví dụ: n=8 và a = (4 , 2 , 7 , 8 , 5 , 1 , 3 , 6)
5.6 CÁC THUẬT TOÁN SẮP XẾP SONG SONG
Pha/TT P0 P1 P2 P3 P4 P5 P6 P7 0 4 2 7 8 5 1 3 6 1 2 4 7 8 1 5 3 6 2 2 4 7 1 8 3 5 6 3 2 4 1 7 3 8 5 6 4 2 1 4 3 7 5 8 6 5 1 2 3 4 5 7 6 8 6 1 2 3 4 5 6 7 8 7 1 2 3 4 5 6 7 8
Sắp xếp theo nguyên lý hình ống Đổi chổ
Không đổi chổ 308
Thuật toán song song:
Giả sử A lưu dữ liệu ở tiến trình lẻ và B lưu dữ liệu ở tiến trình chẵn Thuật toán song song theo hình ống được mô tả theo MPI như sau:
5.6 CÁC THUẬT TOÁN SẮP XẾP SONG SONG
Pha chẵn
Pi, i = 0, 2, ..., n-2 Pi, i = 1, 3, ..., n-3 recv(&A, Pi+1); send(&A, Pi-1); send(&B, Pi+1); recv(&B, Pi-1);
if (A>B) B=A ; if (A>B) A=B ;
Pha lẻ
Pi, i = 1, 3, ..., n-3 Pi, i = 0, 2, ..., n-2 send (&A, Pi+1); recv (&A, Pi-1); recv (&B, Pi+1); send(&B, Pi-1);
if (A>B) A=B ; if (A>B) B=A ;
309
Kết hợp 2 pha ta đƣợc thuật toán song song: 5.6 CÁC THUẬT TOÁN SẮP XẾP SONG SONG
Pi, i = 1, 3, ..., n-3 Pi, i = 0, 2, ..., n-2
send(&A,Pi-1); recv(&A,Pi+1); recv(&B,Pi-1); send(&B,Pi-1); if (A>B) A=B ; if (A>B) B=A ; if (i<=n-3){ if (i=>2){
send(&A,Pi+1); recv(&A,Pi-1); recv(&B,Pi+1); send(&B,Pi-1); if (A>B) A=B; if (A>B) B=A;
} }
Nhận xét: thuật toán cóđộ phức tạp là O(n).
310