You are on page 1of 36

CHƯƠNG 2.

CÁC PHƯƠNG PHÁP PHÂN TÍCH THUẬT TOÁN


2.1 PHÂN TÍCH BẰNG PHƯƠNG PHÁP THỰC NGHIỆM
- Phương pháp thực nghiệm thông qua việc cài đặt thuật toán rồi chọn các bộ dữ liệu thử
nghiệm. Thống kê các thông số nhận được khi chạy các dữ liệu này ta sẽ có một đánh giá về
thuật toán.
Tuy nhiên, phương pháp thực nghiệm gặp một số nhược điểm sau khiến cho nó khó có khả
năng áp dụng trên thực tế:
+Do phải cài đặt bằng một ngôn ngữ lập trình cụ thể nên thuật toán sẽ chịu sự hạn chế của
ngữ lập trình này.
+ Hiệu quả của thuật toán sẽ bị ảnh hưởng bởi trình độ của người cài đặt.
+ Việc chọn được các bộ dữ liệu thử đặc trưng cho tất cả tập các dữ liệu vào của thuật toán
là rất khó khăn và tốn nhiều chi phí.
+ Các số liệu thu nhận được phụ thuộc nhiều vào phần cứng mà thuật toán được thử nghiệm
trên đó. Điều này khiến cho việc so sánh các thuật toán khó khăn nếu chúng được thử
nghiệm ở những nơi khác nhau.
2.2 PHÂN TÍCH THUẬT TOÁN KHÔNG ĐỆ QUY

-
2.2 PHÂN TÍCH THUẬT TOÁN KHÔNG ĐỆ QUY
2.2 Phân tích thuật toán không đệ quy
• Ví dụ 2: Giải thuật kiểm tra xem có
phải mọi phần tử trong mảng 1 chiều là
khác biệt nhau.

12/12/2020 5
2.2 Phân tích thuật toán không đệ quy
Function Tim_phantu(A,n)
begin
for i:=0 to n-1 do
for j:= i+1 to n do
if A[i] = A[j] return false
return true
end;

12/12/2020 6
2.2 Phân tích thuật toán không đệ quy
• Ví dụ 3: Giải thuật nhân 2 ma trận A(
m x p), B(p x n) thành ma trận C kích
thước (m x n).
Viết giải thuật
Xác định phép toán cơ bản của giải thuật
và tính độ phức tạp của GT theo phép
toán cơ bản này.

12/12/2020 7
2.2 Phân tích thuật toán không đệ quy
Procedure NhanMT(A,B,C,m,p,n)
Begin
for i:=1 to m do// T(m)
for j:=1 to n do// T(n)
begin
C[i,j]:=0;
for k:=1 to p do // T(p)
C[i,j] = C[i,j] +A[i,k]*B[k,j]
end;
End;
12/12/2020 8
2.2 Phân tích thuật toán không đệ quy
• Ví dụ 4: Tìm tất cả những ký tự xuât
hiên trong cùng một văn bản

12/12/2020 9
2.2 Phân tích thuật toán không đệ quy
procedure So_khop_xau
begin
n:=[T]; m:=[P];
for s:=0 to n-m do
if P[1..m] = T[ s+1,..., s+m]
then print(' Mẫu xuất hiện ở vị trí',s);
end;

12/12/2020 10
2.2 Phân tích thuật toán không đệ quy
• Ví dụ 4: Tìm tất cả những ký tự xuât procedure so_khop_xau(T,P)
hiên trong cùng một văn bản Begin
n:=|T|; m:=|P|;
for s:=0 to n-m do
begin
thoat = false; k:=1;
while k<=m and not thoat do
if P[k] <> T[s+k] then thoat = true
else k:=k+1
if not thoat then
print( " Mẫu xuất hiện tại vị trí",s);
12/12/2020
end; 11
2.3 PHÂN TÍCH THUẬT TOÁN ĐỆ QUY
 5!
= 5*4! = 5*24 = 120
4!= 4*3!=4*6 =24
3!=3*2! =3*2 = 6
 N!= n*(n-1)! 2!= 2*1!=2*1 = 2
 0!=1 1!= 1*0! = 1*1 =1
 0!= 0*(0-1)!

13
12/12/2020
2.3 PHÂN TÍCH THUẬT TOÁN ĐỆ QUY
Int giaithua(int n)
{
if n= 0
return 1
return (n*giaithua(n-1));
}
N=5
5! = 5*4!
= 5* 4*3!
= 5*4*3*2!
= 5*4*3*2*1!
= 5*4*3*2*1*0!
= 5*4*3*2*1*1 =120
2.3 PHÂN TÍCH THUẬT TOÁN ĐỆ QUY
2.3 PHÂN TÍCH THUẬT TOÁN ĐỆ QUY

1.
2.
3.

4.

5.
2.3 PHÂN TÍCH THUẬT TOÁN ĐỆ QUY
2.3 PHÂN TÍCH THUẬT TOÁN ĐỆ QUY
2.3 PHÂN TÍCH THUẬT TOÁN ĐỆ QUY
2.3 PHÂN TÍCH THUẬT TOÁN ĐỆ QUY
2.3 Phân tích thuật toán đệ quy
• Bài tập 1

12/12/2020 21
2.3 Phân tích thuật toán đệ quy
• Bài tập 1 HanoiTower(n, A, B, C)
// chuyển n đĩa ở A sang B.
C(1) = 1 {
C(n) = 2c(n-1) + 1 if (n = =1)// chuyển một đĩa ở
ta có 7 bước A sang B;
Với n = 1, 2, 3 ta có else {
C(1) = 1 = 2^1-1, HanoiTower(n-1,A, C, B);
C(2) = 2c(1) + 1 = 3 = 2^2 -1, chuyển một đĩa ở A sang B;
C(3) = 2c(2) + 1 = 7 = 2^3-1 HanoiTower(n-1, C, B, A);
C(n) = 2^n-1 }
thời gian: O(2^n). }

12/12/2020 22
2.3 Phân tích thuật toán đệ quy
• Bải tập 1 HanoiTower(n, A, B, C)
- Để chuyển n đĩa từ cọc A->C , // chuyển n đĩa ở A sang B.
trước tiên ta phải chuyển n-1 đĩa {
if (n = =1)// chuyển một đĩa ở
trên cùng (các đĩa nhỏ) từ cọc A-
A sang B;
>B , sau đó chuyển đĩa thứ n từ else {
cọc A->C . Cuối cùng lại chuyển HanoiTower(n-1,A, C, B);
n-1 đĩa từ cọc B sang cọc C. Ta chuyển một đĩa ở A sang B;
có C(n) =C(n-1) +1 HanoiTower(n-1, C, B, A);
- =2*C(n-1) +1 }
-> theo quy nạp , ta có C(n+1) }
=2C n +1 = 2.2^n-1-1 =2^n-1
-> L(n) =2^n-1 đc chứng minh vs
12/12/2020 23
2.3 Phân tích thuật toán đệ quy
• Bải tập 2 int UCLN( int n, int m)
// n và m là nguyên dương và n > m
{
if ( n % m = = 0)
return m;
else {
int k = n % m ;
return UCLN(m, k);
}
}
12/12/2020 24
2.3 Phân tích thuật toán đệ quy
• Bài tập 3 Int S(n)
{
Input số nguyên dương n
If n = 1
return 1
else
return S(n-1)+n*n*n;
}

12/12/2020 25
2.3 Phân tích thuật toán đệ quy
• Bài tập 4 procedure sx_noibot;
var
i,j,t: integer;
begin
for i:=n downto 1 do
for j:=2 to i do
if a[j-1] > a[j] then doicho(a[j],a[j-1]);
end;
Procedure Doicho(a,b)
tg: integer
Begin
tg:=a; a:=b; b:=tg
}
12/12/2020 26
2.4 Các chiến lược thiết kế giải thuật

12/12/2020 27
2.4.1. Chiến lược thiết kế giải thuật “ trực
tiếp”

12/12/2020 28
2.4.1. Chiến lược thiết kế giải thuật “ trực
tiếp”

12/12/2020 29
2.4.1. Chiến lược thiết kế giải thuật “ trực
tiếp”

12/12/2020 30
2.4.1. Chiến lược thiết kế giải thuật “ trực
tiếp”

12/12/2020 31
2.4.1. Chiến lược thiết kế giải thuật “ trực
tiếp”

12/12/2020 32
2.4.2. Chiến lược thiết kế giải thuật vét cạn

12/12/2020 33
2.4.2. Chiến lược thiết kế giải thuật vét cạn
Mặt hàng Trọng Giá trị
lượng
1 7 24

2 3 12

3 4 40

4 5 25

12/12/2020 34
2.4.2. Chiến lược thiết kế giải thuật vét cạn
Tập con Tổng trọng Tổng giá trị Tập con Tổng trọng Tổng giá trị
lượng lượng
Ø 0 0 {2,3} 7 52
{1} 7 24
{2,4} 8 37
{2} 3 12
{3,4} 9 65
{3} 4 40
{1,2,3} 14 Không khả thi
{4} 5 25
{1,2,4} 15 Không khả thi
{1,2} 10 36
{1,3} 11 Không khả thi {1,3,4} 16 Không khả thi

{1,4} 12 Không khả thi {2,3,4} 12 Không khả thi

12/12/2020
{1,2,3,4} 19 Không khả thi35
2.4.2. Chiến lược thiết kế giải thuật vét cạn

12/12/2020 36

You might also like