Professional Documents
Culture Documents
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)
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
7
Bài toán tháp Hà Nội
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
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)
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
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ị
26
Nhân số nguyên chia để trị
[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
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!!!
28
Giải thuật Karatsuba
Thủ thuật
XY = ( ac )10n + ( ad + bc )10n/2 + ( bd )
29
Phân tích Giải thuật Karatsuba
Thủ thuật
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 (*)
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 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