Tải bản đầy đủ (.pdf) (36 trang)

Slide cấu trúc dữ liệu phương pháp chia để trị

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (464.27 KB, 36 trang )

Phương pháp chia để trị
Devide and conquer
ThS. Trương Phước Hải


Nội dung
1. Phương pháp chia để trị

2. Binary Search
3. Bài tốn tìm cực trị
4. Merge Sort
5. Quick Sort
6. Giải thuật Strassen
2

Trương Phước Hải


Phương pháp chia để trị
Tư tưởng: chia nhỏ bài toán lớn thành
những bài toán con dễ giải quyết hơn.
Để giải bài tốn kích thước n:
 Chia bài tốn thành các bài tốn con có kích
thước nhỏ hơn. Có thể sử dụng kỹ thuật chia
để trị để tiếp tục chia nhỏ bài toán con.
 Giải các bài toán con rồi tổng hợp lại để được
lời giải cho bài toán ban đầu.

Giải Thuật

3



Trương Phước Hải


Phương pháp chia để trị
Mơ hình tổng qt của kỹ thuật chia để trị
problem P




p1

Giải thuật

p2

Bài toán cơ sở
(base problem)
4

pk

Trương Phước Hải


Phương pháp chia để trị
Các bước tiếp cận phương pháp chia để
trị:
 Bước 1: chia (divide) bài toán thành 2 hay

nhiều bài toán con nhỏ hơn.
 Bước 2: trị (conquer) (giải) các bài toán con
theo phương pháp này một cách đệ quy.
 Bước 3: gộp (combine) lời giải các bài toán
con để tạo thành lời giải cho bài toán ban
đầu.

Giải thuật

5

Trương Phước Hải


Phương pháp chia để trị
Giải thuật tổng quát
CDT(P)
If (P đủ nhỏ) Then
return LờiGiải(P)
Else
chia P thành các thể hiện p1, p2, ..pk
Áp dụng CDT cho từng thể hiện pi
KếtHợp (CDT(p1), CDT(p2), ..., CDT(pk))
End If
Cuối CDT

Giải thuật

6


Trương Phước Hải


Phương pháp chia để trị
Độ phức tạp của giải thuật:
 T(n): thời gian giải bài tốn kích thước n.
 a: số bài tốn con; n/b: kích thước của các bài
tốn con.
 D(n): thời gian chia nhỏ bài toán ban đầu.
 C(n): thời gian kết hợp các bài tốn con.
Phương trình đệ quy:
𝑂 1 ,
𝑛 ≤ 𝑐 𝑣ớ𝑖 𝑐 đủ 𝑛ℎỏ
𝑛
𝑇 𝑛 =
𝑎. 𝑇
+ 𝐷 𝑛 + 𝐶 𝑛 , 𝑛𝑔ượ𝑐 𝑙ạ𝑖
𝑏
Giải thuật

7

Trương Phước Hải


Nội dung
1. Phương pháp chia để trị

2. Binary Search
3. Bài tốn tìm cực trị

4. Merge Sort
5. Quick Sort
6. Giải thuật Strassen
8

Trương Phước Hải


Binary Search
Cho dãy A gồm các phần tử được sắp thứ
tự khơng giảm. Cho biết có tồn tại phần tử
x trong dãy A?
 Input: A[1…n], x
 Output: index với A[index] = x

Giải thuật

9

Trương Phước Hải


Binary Search
Giải thuật chia để trị cho bài toán:
 Chia: chia dãy A thành 2 nửa dãy con.

m

>m


x

 Trị: dựa vào tính chất có thứ tự của A để xác
định nên tìm x trong nửa dãy con nào.
 Gộp: khơng cần vì tìm ngay trên dãy A.

Giải thuật

10

Trương Phước Hải


Binary Search
Giải thuật chia để trị:
BinSearch(A[], l, r, x)
If (l > r) Then return -1
Else
m = [(l + r)/2]
If (A[m] = x) Then return m
Else If (x < A[m]) Then
return BinSearch(A, l, m-1, x)
Else
return BinSearch(A, m+1, r, x)
Cuối If
Cuối If
Cuối BinSearch
Giải thuật


11

Trương Phước Hải


Nội dung
1. Phương pháp chia để trị

2. Binary Search
3. Bài tốn tìm cực trị
4. Merge Sort
5. Quick Sort
6. Giải thuật Strassen
12

Trương Phước Hải


Tìm phần tử cực trị
Bài tốn: cho dãy A gồm N phần tử, tìm
cực trị (cực tiểu, cực đại) của dãy A.
Tư tưởng chia để trị:
 Chia dãy thành 2 dãy con và tìm cực trị trên
từng dãy con.
 Tìm cực trị trên các giá trị cực trị của mỗi dãy
con để tìm ra cực trị của dãy ban đầu.

Giải thuật

13


Trương Phước Hải


Tìm phần tử cực trị
Minh họa tìm giá trị min bằng phương
pháp chia để trị:
Min = 3
10, 16, 7, 39, 3, 24, 17, 41
3
3, 24, 17, 41

7
10, 16, 7, 39
10
10, 16

10
Giải thuật

16

7

7

3

7, 39


3, 24

39

3
14

17

24

17, 41

17

41
Trương Phước Hải


Tìm phần tử cực trị
Chia để trị cho bài tốn tìm cực trị:
 Chia: chia dãy A[l..r] thành 2 dãy con A[l..m]
và A[m+1..r] với m = (l + r) div 2.
 Trị: tìm cực trị của mỗi dãy con một cách đệ
quy. Đặt left là cực trị của dãy A[l..m], right là
cực trị của dãy A[m+1..r].
 Gộp: so sánh giá trị của left và right để tìm
cực trị cho dãy ban đầu.

Giải thuật


15

Trương Phước Hải


Tìm phần tử cực trị
Giải thuật tìm cực trị theo phương pháp chia
để trị:
CucTri(A[], l, r)
If (l = r) Then
return A[l]
Cuối If
m = (l + r) div 2
left = CucTri(A, l, m)
right = CucTri(A, m + 1, r)
return (left < right)?left:right
Cuối CucTri

Giải thuật

16

Trương Phước Hải


Nội dung
1. Phương pháp chia để trị

2. Binary Search

3. Bài tốn tìm cực trị
4. Merge Sort
5. Quick Sort
6. Giải thuật Strassen
17

Trương Phước Hải


Merge Sort
Ý tưởng phương pháp trộn tự nhiên:
 Tách và phân phối luân phiên các đường
chạy trên A vào 2 dãy B và C.
 Trộn lần lượt từng cặp đường chạy trên B và
C vào A với mục đích giảm dần số đường
chạy trên A.

Giải thuật

18

Trương Phước Hải


Merge Sort
Ví dụ minh họa:
Dãy ban đầu: 2 2 8 16 4 6 13 15 6 20 3 9
A: 2 2 8 16 4 6 13 15 6 20 3 9
Tách B: 22 8 16 6 20
C: 4 6 13 15 3 9

Trộn A: 4 6 8 13 15 16 22

3 6 9 20

Tách B: 4 6 8 13 15 16 22
C: 3 6 9 20
Trộn A: 3 4 6 6 8 9 13 15 16 20 22
Giải thuật

19

Trương Phước Hải


Merge Sort
Tư tưởng chia để trị của Merge Sort:
 Chia: phân phối các đường chạy từ dãy A
sang 2 dãy con B và C theo nguyên tắc luân
phiên.
 Trị: áp dụng tư tưởng trên để tiếp tục phân
chia các dãy B và C một cách đệ quy.
 Gộp: trộn từng cặp đường chạy trên B và C
để tạo thành dãy A mới.

Giải thuật

20

Trương Phước Hải



Merge Sort
Giải thuật trộn tự nhiên theo phương pháp
chia để trị:
TronTuNhien(A[], N)
If (N > 0) Then
PhanPhoi(A, N, B, nB, C, nC) //chia
//Nếu số đường chạy của A > 1
If (nB > 0) AND (nC > 0) Then
TronTuNhien(B, nB) //trị
TronTuNhien(C, nC) //trị
Cuối If
Tron(B, nB, C, nC, A, N) //gộp
Cuối If
Cuối TronTuNhien
Giải thuật

21

Trương Phước Hải


Merge Sort
Giải thuật phân phối đường chạy trên A:
PhanPhoi(A[], N, B[], &nB, C[], &nC)
nB = 0, nC = 0, i = 0, turn = True
While (i < N) Do
If (turn = True) Then
B[nB++] = A[i++]
Else

C[nC++] = A[i++]
Cuối If
If (A[i] < A[i-1]) Then
turn = NOT(turn) ‘chuyển dãy
Cuối If
Cuối While
Cuối PhanPhoi
Giải thuật

22

Trương Phước Hải


Merge Sort
Giải thuật trộn các đường chạy:
Tron (B, nB, C, nC, A[], &N)
i = 0, j = 0, n = 0
While (i < nB AND j < nC) Do
If (B[i] < C[j]) Then
A[n++] = B[i++]
Else
A[n++] = C[j++]
Cuối If
Cuối While
While (i < nB) Do A[n++] = B[i++]
While (j < nC) Do A[n++] = C[j++]
Cuối Tron
Giải thuật


23

Trương Phước Hải


Nội dung
1. Phương pháp chia để trị

2. Binary Search
3. Bài tốn tìm cực trị
4. Merge Sort
5. Quick Sort
6. Giải thuật Strassen
24

Trương Phước Hải


Quick Sort
Bài toán sắp xếp dãy A bằng phương pháp
QuickSort:
 Phân hoạch dãy A thành 3 dãy con:
• Dãy 1 gồm những phần tử có giá trị nhỏ hơn x.
• Dãy 2 gồm những phần tử có giá trị bằng x.
• Dãy 3 gồm những phần tử có giá trị lớn hơn x.

 Với x là một giá trị tùy ý thuộc dãy A.
 Tiếp tục phân hoạch các dãy con một cách đệ
quy.


Giải thuật

25

Trương Phước Hải


×