Cấu trúc dữ liệu và giải thuật – Bài thực hành ôn tập

20 23 0
Cấu trúc dữ liệu và giải thuật – Bài thực hành ôn tập

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

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ớnKhơ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 dhhD –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)

Ngày đăng: 20/04/2021, 14:53

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan