You are on page 1of 35

Chia để trị

Divide and Conquer


Click to add Text

Lâm Hoài Bảo - Bộ môn Công Nghệ Phần Mềm - CIT - CTU
Nội dung

 Nguyên lý
 Giải bài toán bằng đệ quy
 Hiệu quả
 Tóm tắt

2
Chia để trị - Divide and Conquer

 1 kỹ thuật để tìm lời giải tối ưu của bài toán

 Ý tưởng (a)
 Bài toán P có kích thước n chia thành các bài toán
con nhỏ hơn n
 Giải các bài toán con cách đệ quy (trị).
 Ghép lời giải các bài toán con để có lời giải tổng thể
của bài toán.
T(n) = T1(n) + T2(n) + … + Tk(n) +
[Thời gian ghép các bài toán con]

3
Nguyên lý

(a)

T(n) = T1(n) + T2(n) + … + Tk(n) +


[Thời gian ghép các bài toán con]
4
Áp dụng

 Giải thuật
DAC(P):
IF (small(P)):
S(P) (a)

ELSE:
Divide P into P1, P2, …, Pk
DAC(P1), DAC(P2), …, DAC(Pk)
Combine (S(P1), S(P2), …, S(Pk))

 Có thể giúp giải bài toán phức tạp bằng đệ quy
 Hiệu quả về thời gian ở một số bài toán

5
Nội dung

 Nguyên lý
 Giải bài toán bằng đệ quy
 Hiệu quả
 Tóm tắt

6
Bài toán phức tạp

 Chia thành các bài toán con

 Tìm lời giải phần dừng

 Ghép lời giải các bài toán con thành lời


giải ban đầu

7
Bài toán tháp Hà Nội

 Có 3 cây cọc và một chồng n đĩa có kích thước từ nhỏ


đến lớn (không trùng kích thước). Ban đầu n đĩa được
chồng vào cây cọc thứ nhất, đĩa lớn nhất ở dưới, và
kích thước đĩa giảm dần từ dưới lên.
 Ví dụ: 3 đĩa

8
Bài toán tháp Hà Nội
 Cần phải di chuyển n cái đĩa từ cọc A sang cọc C với
ràng buộc:
 Có một cái cọc trung gian là B
 Mỗi lần chỉ được di chuyển 1 cái đĩa từ một cọc đến cọc khác
 Đĩa lớn phải nằm dưới đĩa nhỏ.

9
Ý tưởng

 Bước 3, 4, 7
 Nếu còn chuyển được đĩa
 Chuyển n-1 đĩa từ A->B, trung gian là C
 Chuyển 1 đĩa từ A->C, trung gian là B
 Chuyển n-1 đĩa từ B->C, trung gian là A

10
Giải thuật
move(n, A, B, C):
IF (n==1):
A->C
ELSE:
move(n-1, A, C, B)
move(1, A, B, C)
move(n-1, B, A, C)
T(1) = 1
T(n) = 2T(n-1) + 1
 T(n) = O(…)

11
Nội dung

 Nguyên lý
 Giải bài toán bằng đệ quy
 Hiệu quả
 Sắp xếp trộn
 Tìm kiếm nhị phân
 Nhân số nguyên lớn
 Nhận xét
 Tóm tắt

12
Sắp xếp chèn
 Với mọi i: [1, n-1] xen A[i] vào danh sách A[0..i-1] có thứ
tự để tạo thành danh sách A[0..i] có thứ tự
 Tương tự sắp xếp những lá bài

13
Giải thuật sắp xếp chèn
insertionSort(A, n):
FOR i=0 TO n-1:
temp = A[i]
j = i
WHILE (j>0 AND temp<A[j-1]):
A[j] = A[j-1]
j = j-1
A[j] = temp

 T(n) = O(n2)
 Can we do better?
14
Sắp xếp trộn (Merge sort)
 Dựa trên kỹ thuật chia để trị, danh sách ban đầu được
chia đôi, rồi chia đôi … thành các danh sách nhỏ hơn;
rồi thành các danh sách kích thước 1. Sau đó trộn các
danh sách này lại theo cách thức chúng được chia đôi

 Giải thuật
mergeSort (A, start, end):
IF(start < end):
mid = (start + end)/2
mergeSort (A, start, mid)
mergeSort (A, mid+1, end)
merge (A, start, mid, end)
15
Ví dụ sắp xếp trộn

16
Độ phức tạp

 merge() mất O(n)


 Phương trình đệ quy
 T(1) = 1
 T(n) = 2T(n/2) + n

T(n) = O(nlogn)

17
Nội dung

 Nguyên lý
 Giải bài toán bằng đệ quy
 Hiệu quả
 Sắp xếp trộn
 Tìm kiếm nhị phân
 Nhân số nguyên lớn
 Nhận xét
 Tóm tắt

18
Tìm khóa x trong mảng

 Đầu vào:
 x: khóa cần tìm
 Mảng A gồm n phần tử
 Đầu ra
 Vị trí của phần tử đầu tiên có khóa là x, nếu
không có kết quả là -1

19
Tìm kiếm tuyến tính
linearSearch(A, n, x):
FOR i=0 TO n-1:
IF (x == A[i].key):
RETURN i
RETURN -1

 T(n) = O(n)
 Can we do better?

20
Tìm kiếm nhị phân

 Giả sử A được sắp thứ tự tăng theo khóa. Cần
tìm x trong mảng A gồm n phần tử
 Ý tưởng:
 So sánh x với khóa của phần tử giữa mảng
 Nếu x = khóa phần tử giữa, trả về vị trí đó
 Nếu x < khóa phần tử giữa, tìm kiếm đệ quy x bên trái
mảng
 Nếu x > khóa phần tử giữa, tìm kiếm đệ quy x bên
phải mảng

21
Giải thuật tìm kiếm nhị phân
binarySearch(A, x, low, high):
IF (low > high): RETURN -1
ELSE:
mid = (low+high)/2
IF (x==A[mid].key): RETURN mid
ELSE IF (x<A[mid].key):
RETURN binarySearch(A, x, low, mid-1)

ELSE: RETURN binarySearch(A, x, mid+1, high)

22
Phân tích tìm kiếm nhị phân
 Phương trình đệ quy
 T(1) = 1
 T(n) = T(n/2) +1, n>1
 T(n) = O(logn)

 Giảm để trị: chia thành 1 bài toán có kích thước nhỏ hơn
 Có thể viết giải thuật không đệ quy
 Mở rộng:
 Tìm kiếm phần tử nhỏ nhất có khóa >= x

 Tìm kiếm phần tử lớn nhất có khóa <= x

23
Nội dung

 Nguyên lý
 Giải bài toán bằng đệ quy
 Hiệu quả
 Sắp xếp trộn
 Tìm kiếm nhị phân
 Nhân số nguyên lớn
 Nhận xét
 Tóm tắt

24
Nhân số nguyên lớn

 Đầu vào:
 2 số nguyên X, Y; mỗi số có n chữ số
45
 Đầu ra
x 63
 R = X.Y
 Nhân cơ bản: O(n2) 135
2700
2835

25
Nhân số nguyên chia để trị

 Bài toán ban đầu: nhân 2 số có n chữ số


 Cần xác định bài toán con
 Ví dụ
1234 x 5678
= ( 12x100 + 34 ) x ( 56x100 + 78 )
= ( 12x56 )1002 + ( 12x78 + 34x56 )100 + ( 34x78 )
1 2 3 4

Một bài toán 4 chữ số 4 bài toán con 2 chữ số

26
Nhân số nguyên chia để trị

 Bài toán ban đầu: nhân 2 số có n chữ số


 Cần xác định bài toán con

[x0x1...xn-2xn-1] x [y0y1...yn-2yn-1]
= ( ax10n/2 + b ) x ( cx10n/2 + d )
= ( a x c )10n + ( a x d + b x c )10n/2 + ( b x d )
1 2 3 4

Một bài toán 4 chữ số 4 bài toán con 2 chữ số

27
Phân tích
 Phương trình đệ quy
 T(1) = 1
 T(n) = 4T(n/2) + n
 T(n) = O(n2)
 Kỹ thuật chia để trị thật sự không hiệu quả?
no!!!

Karatsuba says no!!!

28
Giải thuật Karatsuba

 Thủ thuật

XY = ( ac )10n + ( ad + bc )10n/2 + ( bd )

ac & bd được tính đệ quy như trước

ad + bc Tương đương với (a+b)(c+d) - ac - bd


= (ac + ad + bc + bd) - ac - bd
= ad + bc

Thay vì tính ad & bc như 2 bài toán con, chỉ tính


(a+b)(c+d) !

29
Phân tích Giải thuật Karatsuba

 Thủ thuật

XY = ( ac)10n + (a + b)(c + d) - ac - bd)10n/2 + (bd)

 Phương trình đệ quy


 T(1) = 1
 T(n) = 3T(n/2) + cn

 T(n) = O(nlog3)

30
Nội dung

 Nguyên lý
 Giải bài toán bằng đệ quy
 Hiệu quả
 Sắp xếp trộn
 Tìm kiếm nhị phân
 Nhân số nguyên lớn
 Nhận xét
 Tóm tắt

31
Bài toán con cân bằng

 Bài toán kích thước n được chia thành a bài toán con
mỗi bài toán có kích thước n/b, a ≥ 1, b > 1 (*)

 Giải các bài toán con cách đệ quy

 Ghép lời giải các bài toán con lại để thành lời giải của
bài toán ban đầu

n
T(n) = aT( ) + [Thời gian ghép các bài toán con]
b

32
Nội dung

 Nguyên lý
 Giải bài toán bằng đệ quy
 Hiệu quả
 Tóm tắt

33
Tóm tắt

 Giải thuật đệ quy để giải bài toán

 Để giải thuật hiêu quả, bài toán kích thước n được chia
thành các bài toán con có kích thước đều nhau

34
Thanks for your attention!

35

You might also like