– Giải thuật là một dãy hữu hạn các bước, mỗi bước mô tả chính xác các phép toán, hoặc hành động cần thực hiện .... Tính chất của thuật toán Input: Mỗi thuật toán đều có một tập các gi
Trang 1Phân tích & Thiết kế Giải
thuật nâng cao
Advanced Algorithm Analysis and Design
TS TRẦN CAO ĐỆ Đại Học Cần Thơ 2012
Bài giảng cho Thạc sĩ Ngành HTTT
Trang 2Phần 1:
KT phân tích và thiết kế giải thuật
TS TRẦN CAO ĐỆ Đại Học Cần Thơ 2012
Trang 3Chương 1:
KỸ THUẬT PHÂN TÍCH GIẢI THUẬT
TS TRẦN CAO ĐỆ Đại Học Cần Thơ 2012
Trang 4Thuật toán
Giải thuật / Thuật toán (algorithm)
– Xuất phát từ nhà toán học Arập Al-Khowarizmi (khoảng năm 825)
– Giải thuật là một dãy hữu hạn các bước, mỗi bước mô tả chính xác các phép toán, hoặc hành động cần thực hiện để cho ta lời giải của bài toán.
Ví dụ thuật toán Euclid
– Input: m, n nguyên dương
– Output: g (ước chung lớn nhất của m và n)
Trang 5Tính chất của thuật toán
Input: Mỗi thuật toán đều có một tập các giá trị đầu vào (có thể rỗng)
Output: Mỗi thuật toán có một tập dữ liệu ra đầu ra (output), tương ứng với input.
Tính xác định: các bước của thuật toán phải xác định (các thao tác phải rõ ràng, không gây nên sự nhập nhằng).
Tính chính xác: Thuật toán phải tạo ra các giá trị đầu ra chính xác tương ứng với giá trị đầu vào Trong cùng một điều kiện hai bộ xử lý cùng thực hiện một thuật toán phải cho cùng một kết quả như nhau.
Tính hữu hạn: Với mọi bộ dữ liệu vào (hợp lệ), thuật toán phải dừng lại sau một số hữu hạn bước thực hiện.
Tính khả thi: Các phép toán có mặt trong thuật toán phải đủ đơn giản, có thể thực hiện được trong một lượng thời gian hữu hạn (có thể thực hiện bởi con người với giấy, bút trong một khoảng thời gian hữu hạn)
Tính tổng quát: phải áp dụng được cho một lớp bài toán.
Trang 6Vấn đề giải được & không giải được
Một bài toán:
– Có một hoặc nhiều thuật toán giải
Giải được Lựa chọn thuật toán
– Không tồn tại thuật toán để giải
gọi là vấn đề không giải được (bằng thuật toán).
Trang 8 Tiếp cận 2: theo số phép toán cơ bản mà chương trình phải thực hiện
Trường hợp xấu nhất
Trường hợp tốt nhất
Trường hợp ngẫu nhiên
Trang 9Độ phức tạp thời gian của giải thuật
Độ phức tạp thời gian của giải
thuật là một hàm theo kích thước của input, T(n)
Trang 11– nếu f(n)= Θ (g(n)) ta nói f(n) có tỷ suất tăng là g(n).
– nếu f(n) biễu diễn cho một hàm thời gian thực hiện chương trình và f(n)= Θ (g(n)), ta nói f(n) có độ phức tạp (thời gian) là g(n)
Θ (1), Ω (1), O(1) biểu diễn cho hằng số.
Trang 12log(n!) = Θ (nlogn)
Trang 13Tính chất của các tiệm cận
Phản xạ
f(n) = Θ(f(n)) f(n) = Ω(f(n)f(n) = O(f(n)
Đối xứng
f(n)= Θ(g(n)) ⇔ g(n)= Θ(f(n)
Bắc cầu
f(n) = Θ(g(n)) ∧ g(n) = Θ(h(n)) ⇒ f(n)= Θ(h(n))f(n) = Ω(g(n)) ∧ g(n) = Ω(h(n)) ⇒ f(n)= Ω(h(n))f(n) = O(g(n)) ∧ g(n) = O(h(n)) ⇒ f(n)= O(h(n))
Trang 14O(2n)
O(n!)
Hằng Logarit Tuyến tính gần tuyến tính Bình phương Lập phương Mũ
Giai thừa
Các độ phức tạp thời gian
Trang 15 Giải thuật đệ qui
– Thiết lập công thức truy hồiT(n) = aT(n/b) + c(n)
- Giải công thức truy hồi (phương trình đệ qui)
Ví dụ: tính độ phức tạp của quicksort
– T(1)=1
– T(n)=2T(n/2)+n
– Giải ra T(n)=O(nlogn)
Trang 16Phương trình hồi quy
T(1)=1
T(n) = aT(n/b) + d(n), n>1
Phương pháp giải
– Phương pháp thay thế (n bởi n/b)
– Phương pháp tổng quát với hàm nhân
– Phương pháp tổng quát (Master theorem)
16
Trang 17= 4k + n (2k-1+…2+1)= n2 + n(2k-1) = n2 + n(n-1) Vậy T(n)=O(n2)
17
Trang 18Phương pháp tổng quát với hàm nhân
Nghiệm riêng
Nếu d là hàm nhân, tức là d(m*n) = d(m)*d(n)
Thì ta có thể giải được nghiệm riêng dễ dàng
∑j=0k-1ajd(bk-j) = d(b)k ∑j=0k-1(a/d(b))j = (ak-d(b)k)/(a/d(b)-1)
Trang 19Lời giải với d(n) là hàm nhân
Nếu a>d(b): T(n)=O(nlog
Trang 20ba)
f(n) = Θ(nlog
balogkn), với k≥0 thì T(n) =
Trang 23Tài liệu tham khảo
R Sedgewick, Algorithms in Java, Addision-Wesley, 2004 Chapter 1.
Aho, A V , J E Hopcroft, J D Ullman Data Structure and Algorihtms, 1983.
Kenneth H Rosen, Discrete Mathematics and its applications,
4th edition, McGraw-Hill, 2000.
R Sedgewick, Algorithms , 1987.
Trang 24Chương 2:
KỸ THUẬT THIẾT KẾ GIẢI THUẬT
TS TRẦN CAO ĐỆ Đại Học Cần Thơ 2012
Trang 25Chia để trị
Divide and conquer
Giải một bài toán kích thước n,
– chia bài toán đã cho thành a số bài toán con có kích thưóc là b nhỏ hơn n
– Giải các bài toán con (chia để trị)
– Tổng hợp kết quả lại để được lời giải của bài toán ban đầu
Ví dụ QuickSort: Sắp xếp một danh sách gồm n phần tử
Tìm một giá trị chốt và phân hoạch danh sách đã cho thành hai danh sách con “bên trái” và “bên phải “
Sắp xếp “bên trái” và “bên phải” thì ta được danh sách có thứ tự
Quá trình phân chia sẽ dẫn đến các bài toán sắp xếp một danh sách chỉ gồm một phần tử hoặc gồm nhiều phần tử có khoá bằng nhau, đó chính là các bài toán cơ sở, vì bản thân chúng đã có thứ tự rồi
Tổng hợp kết quả: hiển nhiên
Trang 26 2 5 6 1 2 6 8 9
2 1 2 5 6 6 8 9
1 2 2 5 6 6 8 9
26
Trang 27Ví dụ
#define null -1
int a[]
int findPivot_ind(int i, int j){
for (int k=i+1; (k<=j) && a[k]==a[i];
QuickSort lấy O(nlogn) thời gian để sắp xếp n phần tử trong trường hợp tốt nhất và O(n 2 ) trong trường hợp xấu nhất
Trang 28Nhân hai số nguyên lớn
Phương pháp truyền thống
1234X
1112 - 2468 1234 12341234 -Kết quả
Độ phức tạp
– T(1)=1
– T(n)= 4T(n/2) + cn
T(n)=O(n2)
Trang 30Nhân hai ma trận
Bài toán: Z=Xmxn*Ynxk
Không mất tính tổng quát, giả sử m=n=k
Giải thuật đơn giản
Trang 32Xếp lịch thi đấu thể thao
Bài toán
– Xếp lịch thi đấu vòng tròn 1 lượt cho n đấu thủ
– Mỗi đấu thủ đấu tối đa 1 trận/ ngày
– Số ngày thi đấu ngắn nhất
3 4
Trang 33Cân bằng các bài toán con
Để giải thuật chia để trị hiệu quả thì các bài toán con phải cân bằng
– chia bài toán đã cho thành a số bài toán con có kích thước là n/b
– Khi đó: T(n)=aT(n/b) + d(n)
Trang 34– Mỗi phần tử X = (x1, x2, xn) D được gọi là một phương án ∈
– Cần tìm một phương án X D sao cho hàm f(X) đạt min/max ∈(Phương án tối ưu)
Phương pháp “vét cạn”: xét tất các phương án trong tập D
(hữu hạn) thời gian hàm mũ!
Phương pháp Greedy:
– Chọn từng Xi cho đến khi đủ n thành phần X = (x1, x2, xn)
– Với mỗi Xi, ta sẽ chọn Xi tối ưu
Cách làm trên không đảm bảo X là phương án tối ưu nhưng nó có thời gian đa thức!
Trang 35– Giả sử các tờ bạc máy ATM cung cấp: 100.000, 50.000, 20.000, 10.000
– Greedy
12 tờ 100.000
1 tờ 50.000
2 tờ 20.000
Trang 36Bài toán người giao hàng
Đường đi ngắn nhất qua tất cả các đỉnh
Trang 37 Greedy: lấy đồ quí trước!
– Tính đơn giá cho Oi
– Xét Oi theo thứ tự đơn giá giãm dần
– Lấy đồ vật Oi theo khả năng của ba lô cho phép
– Tính lại trọng luợng còn chứa được của ba lô, quay lại bước 3 cho đến khi
không còn lấy gì thêm nữa!
Trang 38Chọn Giá trị ba lô W còn lại
Trang 39– Bài toán con phải giải nhiều lần
Ghi lại kết quả các bài toán con
}
Nếu k=1 hoặc k=n
Ngược lại
Trang 41Quy hoạch động cho Comb
tam giác Pascal
C[i,0] = 1;
C[i,i] = 1;
for (j = 1; j < i; j++) C[i,j]=C[i-1,j-1]+C[i-1,j]; }
return C[n,k];
}
= O(n2
) 2
1) -
n(n (
i – 1 ) =
n
∑
i=1
T(n) =
Trang 42Quy hoạch động cho bài toán cái ba lô
Gọi :
- X[k, V] số lượng đồ vật k được chọn.
- F[k, V] giá trị hiện tại của ba lô sau khi đã chọn k đồ vật.
- V sức chứa còn lại của ba lô V=0 W.
Ta có công thức
X[1,V] = V / g1 và F[1,V] = X[1,V] * v1F[k,V] = Max (F[k-1,V-xk*gk] + xk*vk)
Trang 458 2 8 2 8 1 4 1 4 1 4 0 0 0 0 0 0
1
9 8
7 6
5 4
3 2
1 0
V
k
k=1 g1=3 v1=4 F[1,V] = X[1,V] * 4 X[1, V]=V/3
X[1,0]=0/3=0F[1,0]=X[1,0] * 4=0*4=0
X[1,1]=1/3=0F[1,1]=X[1,1] * 4=0*4=0
Trang 4610 1
9 0 8 1 5 1 5 0 4 0 0 0 0 0 0
2
3 12 2
8 2 8 2 8 1 4 1 4 1 4 0 0 0 0 0 0
1
9 8
7 6
5 4
3 2
1 0
X[2,3]=0/4=0
x2=0F[2,3]=Max {F[1,(3-0*4)] + 0*5 =F[1,3] + 0=4} =4
X[2,7]=7/4=1
x2=0,1F[2,3]=Max {F[1,(7-0*4)] + 0*5 =F[1,7] + 0=8 + 0 = 8
F[1,(7-1*4)] + 1*5 = F[1,3] + 5=4 +5 = 9} = 9
Trang 475
4
0 12 0
10 0
9 0 8 1 6 0 5 0 4 0 0 0 0 0 0
3
0 12 2
10 1
9 0 8 1 5 1 5 0 4 0 0 0 0 0 0
2
3 12 2
8 2 8 2 8 1 4 1 4 1 4 0 0 0 0 0 0
1
9 8
7 6
5 4
3 2
1 0
V
k
k=3 g3=5 v3=6 F[3,V] = Max{F[2,(V – x3*5)] + x3*6}
Trang 485
3 13 4
12 2
10 3
9 1 7 2 6 0 4 1 3 0 0 0 0
4
0 12 0
10 0
9 0 8 1 6 0 5 0 4 0 0 0 0 0 0
3
0 12 2
10 1
9 0 8 1 5 1 5 0 4 0 0 0 0 0 0
2
3 12 2
8 2 8 2 8 1 4 1 4 1 4 0 0 0 0 0 0
1
9 8
7 6
5 4
3 2
1 0
V
k
k=4 g4=2 v4=3 F[4,V] = Max{F[3,(V – x4*2)] + x4*3}
Trang 490 13 0
12 0
10 0
9 0 7 0 6 0 4 0 3 1 1 0 0
5
3 13 4
12 2
10 3
9 1 7 2 6 0 4 1 3 0 0 0 0
4
0 12 0
10 0
9 0 8 1 6 0 5 0 4 0 0 0 0 0 0
3
0 12 2
10 1
9 0 8 1 5 1 5 0 4 0 0 0 0 0 0
2
3 12 2
8 2 8 2 8 1 4 1 4 1 4 0 0 0 0 0 0
1
9 8
7 6
5 4
3 2
1 0
V
k
k=5 g5=1 v5=1 F[5,V] = Max{F[4,(V – x5*1)] + x5*1}
Trang 50Bảng đã xây dựng xong
0 13 0
12 0
10 0
9 0 7 0 6 0 4 0 3 1 1 0 0
5
3 13 4
12 2
10 3
9 1 7 2 6 0 4 1 3 0 0 0 0
4
0 12 0
10 0
9 0 8 1 6 0 5 0 4 0 0 0 0 0 0
3
0 12 2
10 1
9 0 8 1 5 1 5 0 4 0 0 0 0 0 0
2
3 12 2
8 2 8 2 8 1 4 1 4 1 4 0 0 0 0 0 0
1
9 8
7 6
5 4
3 2
1 0
V
k
Trang 520 13 0
12 0
10 0
9 0 7 0 6 0 4 0 3 1 1 0 0 5
3 13 4
12 2
10 3
9 1 7 2 6 0 4 1 3 0 0 0 0 4
0 12 0
10 0
9 0 8 1 6 0 5 0 4 0 0 0 0 0 0 3
0 12 2
10 1
9 0 8 1 5 1 5 0 4 0 0 0 0 0 0 2
3 12 2
8 2 8 2 8 1 4 1 4 1 4 0 0 0 0 0 0 1
9 8
7 6
5 4
3 2
1 0
V
k
Ban đầu V=W=9 k=5 X[5, 9]=0 chọn 0 đồ vật 5
k=4 X[4, 9]=3 chọn 3 đồ vật 4V=V-gk*X[k, V]=9-2*3=3
Trang 530 13 0
12 0
10 0
9 0 7 0 6 0 4 0 3 1 1 0 0 5
3 13 4
12 2
10 3
9 1 7 2 6 0 4 1 3 0 0 0 0 4
0 12 0
10 0
9 0 8 1 6 0 5 0 4 0 0 0 0 0 0 3
0 12 2
10 1
9 0 8 1 5 1 5 0 4 0 0 0 0 0 0 2
3 12 2
8 2 8 2 8 1 4 1 4 1 4 0 0 0 0 0 0 1
9 8
7 6
5 4
3 2
1 0
V
k
Với V=3 k=3 X[3, 3]=0 chọn 0 đồ vật 3
k=2 X[2, 3]=0 chọn 0 đồ vật 2k=1 X[1, 3]=1 chọn 1 đồ vật 1
Trang 54Cuối cùng: chọn 3 đồ vật 4 và 1 đồ vật 1
trọng lượng tổng cộng : 3*2 + 1*3 = 9 giá trị : 3*3 + 1*4 = 13
0 13 0
12 0
10 0
9 0 7 0 6 0 4 0 3 1 1 0 0
5
3 13 4
12 2
10 3
9 1 7 2 6 0 4 1 3 0 0 0 0
4
0 12 0
10 0
9 0 8 1 6 0 5 0 4 0 0 0 0 0 0
3
0 12 2
10 1
9 0 8 1 5 1 5 0 4 0 0 0 0 0 0
2
3 12 2
8 2 8 2 8 1 4 1 4 1 4 0 0 0 0 0 0
1
9 8
7 6
5 4
3 2
1 0
V
k
Trang 56void construction (List_Objets list, int n, int W, Table& F, Table& X){
yk = v/list[k].Weight;
for (xk=1; xk <= yk; xk++)
if (F[k-1][v-xk*list[k].Weight]+ xk*list[k].Value > FMax) {
FMax=F[k-1][v-xk *list[k].Weight]+ xk*list[k].Value; XMax= xk;
} F[k][v] = FMax;
X[k][v] = XMax;
} }
}
Trang 57void search(List_Objets list, int n, int W, Table F, Table X)
list[k].Quantity = X[k][v];
cout<<list[k].Quantity << endl;
v = v - X[k][v] * list[k].Weight;
} }
main(){
List_Objets l={{"0",3,4,0}, {"1",3,4,0}, {"2",4,5,0}, {"3",5,6,0}, {"4",2,3,0}, {"5",1,1,0},};
Trang 58Kỹ thuật quay lui
backtracking
Để giải bài toán A ta cần giải
các bài toán con A1, ,An
Một số bài toán con Ai chưa giải
được ta phải đi giải các bài toán con Ai1, Ai2,…,Aik
Sau đó quay lại giải Ai
Trong quá trình giải:
– Giải tất cả các bài toán con vét cạn
– một số bài toán con không cần giải ta bỏ qua cắt tỉa
Trang 62} }
Trang 63 Eval(-)
– Eval(+)
EVAL(5)5
EVAL(*)
– EVAL(2) 2
– EVAL(3) 3
Trang 64Cây trò chơi
Cây trò chơi
– Trò chơi đối kháng
– Mỗi người đến lượt có một số nước đi
Biểu diễn các nước đi cây trò chơi
Vấn đề tìm nước đi tốt nhất
– Duyệt cây để định trị cho các nút
– Trạng thái 1 - người đi trước thắng
– Trạng thái -1 - người đi trước thua
– Trạng thái 0 – hòa
Cây trò chơi còn gọi là cây Min-Max
Trang 67Giải thuật quay lui (vét cạn) để định trị
float Search(NodeType n, ModeType mode) {
Trang 68Cắt Alpha – beta
Vp ≤ VqMIN
MAX
Vp ≥ VqMAX
MIN
Trang 70Giải thuật cắt alpha-beta
float cat_tia(NodeType Q, ModeType mode, float Vp) { NodeType C;
float Vq;
if (is_leaf(Q)) return Payoff(Q);
if (mode == MAX) Vq = - ∞ ; else Vq = ∞ ;
C= con trái nhất của Q;
While (C là con của Q) {
if (mode == MAX) {
Vq = max(Vq, Cat_tia(C, MIN, Vq));
if (Vp<=Vq) return Vq; //cắt
} else {
Vq = min(Vq, Cat_tia(C, MAX, Vq));
if (Vp >= Vq) return Vq; //cắt }
return Vq;
}
Trang 71Phân nhánh tính cận
Branch and bound
Giải bài toán tối ưu
Chia bài toán thành một
số bài toán con
Cây tìm kiếm hoặc cây quyết định
– Giải các bài toán con
Ghi nhận kết quả tối ưu tìm thấy (tạm thời)
Ước lượng lời giải của bài toán con (bound) và
so sánh nó với kết quả tối ưu tạm thời
Cắt bỏ một số bài toán con nếu nhận thấy nó không thể chứa lời giải tối ưu
Trang 72• Cận dưới = tổng độ dài tất cả các cạnh được chọn chia cho 2.
Ví dụ:
cận dưới của nút D (ab+ac+ba+be+ca+cb+de+d c+eb+ed)/2 = 41/2 = 20.5
Trang 73Lời giải tạm thời Lời giải tạm thời Lời giải tạm thời
Trang 74Bài toán cái ba lô
branch and bound
Bài toán tìm max
Xét theo thứ tự giảm của đơn giá
Nút gốc: trạng thái ban đầu của ba lô
– W = W (của nút cha) - số đồ vật được chọn * trọng lượng mỗi vật
– CT = TGT + W * Ðơn giá của vật sẽ xét
kế tiếp.
Trang 75Kĩ thuật tìm kiếm địa phương
Local search
Giải các bài toán tìm
lời giải tối ưu:
– Xuất phát từ một phương án nào đó
– biến đổi lên phương án hiện hành phương
án tốt hơn
– Lặp lại cho đến khi không còn có thể cải thiện được phương án nữa
Bài toán cây phủ tối thiểu
thông
cạnh nhỏ nhất
Phương án ban đầu là một cây phủ nào
Loại khỏi chu trình cạnh có độ dài lớn nhất
Trang 77Bài toán đường đi
của người giao
hàng
đỉnh lại với nhau sao cho vẫn tạo ra một chu trình đủ
được phương án nữa
Phương án ban đầu, giá 25
Bỏ ae và cd, nối a với d và e với c
chu trình mới ( a b c e d a) giá = 23
Bỏ ce và ab nối a với c và b với e
chu trình mới (a c b e d a) giá = 19
Trang 78Tài liệu tham khảo
Aho, A V , J E Hopcroft, J D Ullman Data Structure and Algorihtms, 1983.
R Sedgewick, Algorithms in Java, Addision-Wesley, 2004 Chapter 1.
R Sedgewick, Algorithms , 1987.
Goodrich, Tamassia, Algorithm Design, 2002.
www.codeproject.com
Trang 79Hết phần 1