Phương pháp trộn đa lối cân bằng các tập tin chưa được sử dụng một cách có hiệu quả bởi vì trong cùng một lần duyệt thì phân nửa số tập tin luôn luôn giữ vai trò trộn (nguồn) và phân[r]
(1)ĐHSP
Sắp xếp ngoại (External sort) http://fit.hcmup.edu.vn/~tienttt
Nội dung
Phương pháp trộn Run
1
Phương pháp trộn tự nhiên
2
Phương pháp trộn đa lối cân bằng
3
Phương pháp trộn đa pha
(2)Sắp xếp ngoại
Mục tiêu:
Bài toán kinh điển: Sắp xếp tìm kiếm
Đặc trưng SX file: Bài toán trộn
TT tìm kiếm bản: Tuần tự, nhị phân
TT xếp: Trộn trực tiếp, trộn tự nhiên, trộn n-đường cân bằng, trộn đa pha
Đánh giá thuật tốn
Các nội dung chính:
Thuật toán cài đặt phương pháp xếp
20/06/2010
3
Đặt vấn đề
Vì phải xây dựng thuật toán xếp file?
Thao tác SX hoán vị
Thực hoán vị file Tần suất thao tác lên vùng đĩa q
lớn Khơng an tồn
(3)Bài toán trộn
Input: Cho trước (hay nhiều) dãy: A[0], A[1], A[2], …, A[N-1]
B[0], B[1], B[2], …, B[M-1]
Output: Kết hợp dãy cho thành dãy C
20/06/2010
5
Thuật toán – Trộn phần tử int nCurrA = 0;
int nCurrB = 0;
A[N] = MAX_VALUE; // phần tử lính canh B[M] = MAX_VALUE; // phần tử lính canh for (int nCurrC=0; nCurrC < N+M; nCurrC++)
if (A[nCurrA] < B[nCurrB]) { C[nCurrC] = A[nCurrA]; nCurrA++;
} else {
C[nCurrC] = B[nCurrB]; nCurrB++;
(4)Thuật toán 2: Trộn dãy phần tử int nCurrA = 0;
int nCurrB = 0;
while (nCurrA < N && nCurrB < M) {
if (A[nCurrA] < B[nCurrB]) C[nCurrC] = A[nCurrA++]; else
C[nCurrC] = B[nCurrB++]; nCurrC++;
}
// Xét phần tử lại dãy A for ( ; nCurrA < N; nCurrA++) {
C[nCurrC] = A[nCurrA]; nCurrC++;
}
// Xét phần tử lại dãy B for ( ; nCurrB < M; nCurrB++) {
C[nCurrC] = B[nCurrB]; nCurrC++;
} 20/06/2010
7
Phương pháp trộn Run – Giải thuật
Giải thuật xếp tập tin phương pháp trộn Run tóm lược sau:
Input: f0 tập tin cần thứ tự
Ouput: f0 tập tin thứ tự
Gọi f1, f2 tập tin trộn.
(5)Phương pháp trộn Run – Minh họa
Bước 1:
Giả sử phần tử f0 là: 24 12 67 33 58 42 11 34 29 31
Khởi tạo f1, f2 rỗng
Thực phân bố m=1 phần tử từ f0 vào f1, f2:
f1: 24 67 58 11 29 f2: 12 33 42 34 31
Trộn f1,f2 vào f0
f0: 12 24 33 67 42 58 11 34 29 31
20/06/2010
9
Phương pháp trộn Run – Minh họa
Bước 2:
Phân bố m=2 *m = phần tử từ f0 vào f1, f2 f0: 12 24 33 6742 58 11 3429 31
f1: 12 24 42 58 29 31 f2: 33 67 11 34
Trộn f1, f2 thành f0:
(6)Bước 3:
Tương tự bước 2, phân bố m= * m = phần tử từ f0 vào f1, f2
f0: 12 24 33 67 11 34 42 58 29 31 f1: 12 24 33 67 29 31
f2: 11 34 42 58
Trộn f1, f2 thành f0:
f0: 11 12 24 33 34 42 58 67 29 31
20/06/2010
11
Phương pháp trộn Run – Minh họa
Phương pháp trộn Run – Minh họa
Bước 4: Phân bố m=2 * m = phần tử
lần lượt từ f0 vào f1, f2
f1: 11 12 24 33 34 42 58 67 f2: 29 31
Trộn f1, f2 thành f0:
f0: 11 12 24 29 31 33 34 42 58 67
(7)Phương pháp trộn Run – Cài đặt m = 1
while (m < số phần tử f0) {
Chia[Distribute] m phần tử f0 cho
f1, f2
Trộn[Merge] f1, f2 vào f0 M = M *
}
20/06/2010
13
Phương pháp trộn Run – Đánh giá
Đánh giá:
Cần N khơng gian trống đĩa để hoạt động
Số bước log2N(vì lần xử lý dãy tăng gấp 2)
Mỗi bước:
• Distribute: Copy Nlần
• Merge: Copy Nlần, so sánh N/2lần
Tổng cộng: • Copy: 2N * log2N
• So sánh: N/2 * log2N Hạn chế:
Không tận dụng liệu phận
(8)Run – Khái niệm
Run dãy liên tiếp phần tử thứ tự
Ví dụ: 12 55 Run
Chiều dài Run số phần tử Run Chẳng hạn Run ví dụ có chiều dài
20/06/2010
15
PP trộn tự nhiên – Đặc điểm
Trong phương pháp trộn mục 1, giải thuật chưa tận dụng chiều dài cực đại Run trước phân bố chưa tối ưu
(9)PP trộn tự nhiên – Giải thuật
While (số Run F0 > 1) {
Phân bốF0 vào F1, F2 theo Run tự nhiên Trộncác Run F1, F2 vào F0
}
- [Distribute] Chia xoay vòng liệu file F0 cho F1 F2, lần run file F0 hết
- [Merge] Trộn cặp run F1 F2 tạo thành run F0
20/06/2010
17
PP trộn tự nhiên – Minh họa
Ví dụ: F0: 9 8 7 6 5
Bước 1:
F1:
F2:
F0:
Bước 2:
F1:
F2:
(10)PP trộn tự nhiên – Minh họa
Bước 3:F0: 9 5
F1:
F2:
F0:
Bước 4: Dừng F0 có Run.
20/06/2010
19
PP trộn đa lối cân – Đặt vấn đề
Thuật tốn xếp ngồi cần giai đoạn: Phân phối trộn
Giai đoạn làm thay đổi thứ tự?
Chi phí cho giai đoạn phân phối?
Rút kết luận:
Thay thực giai đoạn, ta cần thực 01 giai đoạn trộn
ã Tit kim ẵ chi phớ Copy
(11)PP trộn đa lối cân – Đặt vấn đề
Chi phí xếp ngoại tỉ lệ với số bước thực hiện:
Nếu bước cần N thao tác copy
Nếu dùng 2file trung gian cần log2Nbước cần N * log2Nthao tác copy
Để giảm số bước Phân bố số Run nhiều file trung gian
Nếu dùng nfile trung gian: cần lognNbước cần N * lognNthao tác copy
Rút kết luận:
Dùng nhiều file trung gian để giảm số bước
Tiết kiệm thao tác copy cách thực giai đoạn
Sử dụng 2*nfile trung gian: • nfile nguồn
• n file đích
20/06/2010
21
PP trộn đa lối cân – Thuật toán
B1: Gọi tập nguồn S = {f1, f2, …, fn} Gọi tập đích D = {g1, g2, …, gn} Chia xoay vòng liệu file F0 cho
file thuộc tập nguồn, lần Run F0 hết
B2: Trộn Run file thuộc tập nguồn S, tạo thành Run mới, lần ghi lên file thuộc tập đích D
B3: Nếu (số Run file D > 1) thì:
Hốn vị vai trị tập nguồn (S) tập đích (D)
Quay lại B2
(12)PP trộn đa lối cân – Minh họa fInput: U Q N M K I H F D C B, N=3
// Phân phối (lần 1) f1: UMH C
f2: QK FB f3: N ID
// Trộn (lần 1) g1: N Q UB C g2: I K M g3: D F H
// Trộn (lần 2)
f1: D F H I K M N Q U
f2: B C f3: NULL // Trộn (lần 3)
g1: B C D F H I K M N Q U
g2: NULL g3: NULL
20/06/2010
23
PP trộn đa lối cân – thuật giải
Các ký hiệu:
fInput: file liệu gốc cần xếp
N: số phần tử file fInput
n: số file trung gian tập nguồn/đích
S: tập file nguồn
D: tập file đích
Sdd: tập file nguồn run dở dang
Str: tập file nguồn chưa hết (!EOF), cịn tham gia vào
q trình trộn
“Lượt”: trình trộn run từ nguồn đ đích, “luợt” kết thúc file đích (trong tập D) nhận run
Drun: tập file đích nhận run “lượt” hành
Suy diễn:
(13)PP trộn đa lối cân – Thuật toán chi tiết
[Bước 1] S = {f1, f2, … , fn}
D = {g1, g2, … , gn}
// Chia xoay vòng liệu fInput cho file thuộc tập nguồn S
i = 1;
while (!feof(fInput)) {
Copy_1_Run(fInput, fi); i = (i % n) + 1;
}
Str = S; Drun = {}; nDemRun = 0;
20/06/2010
25
PP trộn đa lối cân – Thuật toán chi tiết [Bước 2]
a Sdd = Str
b Gọi dhhD –Drunlà file đích hành (sẽ nhận run)
c Đọc phần tử xfi, fi Sdd
d Gọi xf0= MIN { xfi, fi Sdd}
e Copy xf0lên dhh
f Nếu (file f0 hết) { Str= Str– {f0}
Sdd= Sdd– {f0}
Nếu (Str== {}) { // Xong trình trộn N đ D nDemRun++;
Goto [Bước 3] }
ngược lại Nếu (Sdd<> {}) Goto [Bước 2.d] ngược lại { // Sdd=={}: hết run hành
nDemRun++; Drun= Drun+ {dhh};
(14)PP trộn đa lối cân – Thuật toán chi tiết ngược lại { // File f0 chưa hết
Nếu (!EOR(f0)) {
Đọc phần tử kế xf0 từ file f0; Goto [Bước 2.d]
}
ngược lại { // Hết run hành f0 Sdd= Sdd– {f0}
Nếu (Sdd<> {}) Goto [Bước 2.d]
ngược lại { // Sdd=={}: hết run hành
nDemRun++; Drun= Drun+ {dhh};
Nếu (Drun==D) Drun= {}; // Xong “lượt”
Goto [Bước 2.a] }
} // end of file f0 chưa hết
20/06/2010
27
PP trộn đa lối cân – Thuật toán chi tiết [Bước 3]
Nếu (nDemRun == 1) Kết thúc thuật tốn
ngược lại {
Nếu (nDemRun < n) Str = Drun; // Không đủ n run ngược lại Str = D;
(15)PP trộn đa lối cân – Minh họa
Ví dụ: Cho dãy số sau
3 12 15 20 23 21 27
Nhập :
f0 :3 12 15 20 23 21 27
Xuất :
f0: 2 7 8 12 15 20 21 23 27
20/06/2010
29
PP trộn đa lối cân – Minh họa Các bước tiến hành: Chọn file
3 12 15 20 23 21 27 Bước 0: đặt nh = 3
Bước 1:
Phân phối run luân phiên vào f[1], f[2], f[3] f1: 5 4 15 20
(16)PP trộn đa lối cân – Minh họa
Bước 2:
-Trộn run f[1], f[2], f[3] luân phiên phân phối vào file g[1], g[2], g[3]
g1: 12
g2: 15 20 21 23 27 g3:
- Do số run sau trộn >1 nên tiếp tục trộn run từ g[1], g[2], g[3] vào ngược trở lại f[1], f[2], f[3]
f1: 2 7 8 12 15 20 21 23 27 f2:
f3:
- Do số run trộn = nên kết thúc thuật toán 20/06/2010
31
PP trộn đa lối cân – Minh họa
3 12 15 20 23 21 27
3 12 15 20 23 21 27
f1 f2 f3
(17)PP trộn đa lối cân – Minh họa
20/06/2010
33
3
2 12
8
4 15 20
7 21 27
1 23
2 12
8
4 15 20
7 21 27
1 23
5
7 12
3
g1 g2 g3
4 15 20 21 27
1 23
f1 f2 f3
Bước 2
PP trộn đa lối cân – Minh họa
1 2 2 3 4 5 7 7 8 8 12 15 21 27
6 15 18 20 21 27
1 2 8 23
5 12
2 3 7
g1 g3 g2 f1 f2 f3
4 8 15 20 21 27
1 2 7 23
5 12
2 3 7
4 8 15 20 21 27
1 2 7 23
5 12
2 3 7
4 8 15 20 21 27
1 2 7 23
5 12
2 3 7
(18)PP trộn đa pha – Đặt vấn đề
Phương pháp trộn đa lối cân tập tin chưa sử dụng cách có hiệu lần duyệt phân nửa số tập tin ln ln giữ vai trị trộn (nguồn) phân nửa số tập tin luôn giữ vai trị phân phối (đích) Cải tiến: Thay đổi vai trò tập tin lần duyệt phương pháp trộn đa pha
20/06/2010
35
PP trộn đa pha – thuật giải Ta xét ví dụ sau với tập tin f1, f2, f3
Bước 1: Phân phối luân phiên run ban đầu f0 vào f1 f2
Bước 2: Trộn run f1, f2 vào f3 Giải thuật kết thúc f3 có run
Bước 3: Chép run f3 vào f1
Bước 4: Trộn run f1 f3 vào f2 Giải thuật kết thúc f2 có run
Bước 5: Chép số run f2 vào f1 Lặp lại bước
(19)PP trộn đa pha
-20/06/2010
37
Ví dụ: Trường hợp n = 7, tổng số run ban đầu 13 + = 21 run
Pharse F1 F2 F3
0 1,1,1,1,1,1,1,1 1,1,1,1,1 Sort
1 1,1,1 2,2,2,2,2 Merge1
2 3,3,3 2,2 Merge2
3 5,5 Merge3
4 Merge4
5 13 Merge4
6 21 Merge6
PP trộn đa pha
(20)