Professional Documents
Culture Documents
1 GioiThieu
1 GioiThieu
2
Giới thiệu
p Thuật toán
3
Giới thiệu
p Thuật toán hằng ngày trong cuộc sống
n Nấu cơm
p …
n Gọi điện thoại
5
Giới thiệu
p Tính tổng quát (1)
n Thuật toán phải áp dụng cho tất cả các mẫu dữ
liệu vào chứ không chỉ là một mẫu dữ liệu vào
cụ thể
n Ví dụ
p Sắp xếp tăng dần một dãy các giá trị
p Dữ liệu vào : 2 1 4 3 5
p Kết quả : 1 2 3 4 5
6
Giới thiệu
p Tính tổng quát (2)
n Phương pháp
p So sánh hai phần tử liên tiếp nhau từ trái qua phải,
nếu không đúng thứ tự thì hoán đổi vị trí chúng
Bước 1: 2«1 4 3 5
Bước 2: 1 2 4 3 5
Bước 3: 1 2 4 «3 5
Bước 4: 1 2 3 4 5
p Dãy đã được sắp xếp
p Thuật toán có tổng quát không ?
p Không
§ Ví dụ dữ liệu vào: 2 1 5 4 3
7
Giới thiệu
p Tính hữu hạn
n Thuật toán phải dừng sau một số bước xác
định
n Ví dụ
nhập n
while (n ¹ 0)
n=n–2
endwhile
n Ví dụ
Bước 1: x = 0
Bước 2: tăng x lên 1 hoặc giảm x đi 1
Bước 3: if (x Î[-2,2]) then
goto Bước 2
n Thuật toán có nhập nhằng ?
9
Giới thiệu
p Tính hiệu quả
n Thuật toán phải sử dụng hiệu quả nguồn tài nguyên máy
tính
p Thời gian
p Bộ nhớ
n Ví dụ
gt1 (n) gt2 (n)
begin begin
p=1 if (n = 0) return (1)
for i from 1 to n do else
p = p * i; return (n*gt2(n-1))
endfor endif
end end
10
Giới thiệu
p Đặc tả thuật toán (1)
n Có nhiều cách đặc tả thuật toán
p Không hình thức
§ Ngôn ngữ tự nhiên
p Nửa hình thức
§ Kêt hợp ngôn ngữ tự nhiên và các kí hiệu toán học
§ Sơ đồ khối, ngôn ngữ giả, …
p Hình thức
§ Các kí hiệu toán học
§ Ngôn ngữ Z, ngôn ngữ B, …
11
Giới thiệu
p Đặc tả thuật toán (2)
n Chọn phương pháp đặc tả nửa hình thức
p Ngôn ngữ giả tựa C/Pascal kết hợp ngôn ngữ tự nhiên
for … from … to … do
…
endfor
12
Giới thiệu
p Ví dụ 1
n Có 15 hộp đinh có chiều dài khác nhau. Cần
đặt chúng vào trong 15 ngăn kéo. Chúng ta
cần phải thực hiện thế nào để có thể lấy được
loại đinh chúng ta cần một cách nhanh nhất?
13
Giới thiệu
p Ví dụ 1
n Giải pháp thô
p Chúng ta xếp các hộp đinh vào các ngăn kéo theo thứ tự
bất kỳ. Sau đó, mỗi khi cần lấy đinh chúng ta mở các
ngăn kéo theo thứ tự từ trái qua phải.
p Trường hợp xấu nhất: phải mở 15 ngăn kéo
p Trường hợp trung bình: giả sử xác suất lấy các loại đinh
ngang nhau, phải mở 8 ngăn kéo
1 15 1 15 *16
15
å1
i= *
15 2
=8
p Nếu những loại đinh trong các ngăn kéo cuối cùng luôn
được sử dụng, cần nhiều lần mở các ngăn kéo
14
Giới thiệu
p Ví dụ 1
n Giải pháp Las Vegas
p Chúng ta chọn ngăn kéo để mở một cách ngẫu nhiên
§ Nếu may mắn, chúng ta có loại đinh cần lấy
§ Nếu không, chúng ta loại bỏ ngăn kéo vừa mở, thực
hiện mở ngăn kéo khác một cách ngẫu nhiên
1 14 1 14 13 1 1 15
*1 + * * 2 + * * * 3 + ... = å1 i = 8
15 15 14 15 14 13 15
15
Giới thiệu
p Ví dụ 1
n Giải pháp tiền xử lý
p Chúng ta sắp xếp các hộp đinh theo thứ tự chiều dài của
chúng
p Xếp vào các ngăn kéo theo thứ tự trên
p Nếu lại mở các ngăn kéo từ trái sang phải thì sẽ không
thu được lợi ích gì
p Mở các ngăn kéo theo phương pháp tìm kiếm nhị phân
p Trường hợp xấu nhất: 4 lần mở ngăn kéo
p Trường hợp trung bình: 3.26
1 2 4 8
*1 + * 2 + * 3 + * 4 = 3.26
15 15 15 15
p Giải pháp chỉ có ý nghĩa khi chúng ta thường xuyên mở
các ngăn kéo lấy đinh
16
Giới thiệu
p Ví dụ 2
n Thuật toán nhân hai số nguyên
567
1234
2268
1701
1134
567
699678
17
Giới thiệu
p Ví dụ 2
n Thuật toán nhân Anh
567
1234
567
1134
1701
2268
699678
18
Giới thiệu
p Ví dụ 2
n Thuật toán nhân Ả-rập
5 6 7
0 0 0 1
0 5 6 7
1 1 1 2
6
0 2 4
1 1 2 3
9
5 8 1
2 2 2 4
9
0 4 8
6 7 8
n So sánh độ hiệu quả các thuật toán ?
19
Giới thiệu
p Ví dụ 2
n Đếm số phép toán nhân và cộng được thực hiện
p Thuật toán nhân Bắc Mỹ và thuận toán nhân Anh đều sử
dụng 12 phép nhân và 11 phép cộng
p Thuật toán Ả-rập sử dụng 12 phép nhân và 21 phép cộng
p Số phép toán phụ thuộc vào số chữ số của mỗi số nguyên
§ Số phép nhân bằng m*n với m và n lần lượt là số chữ số của
mỗi số nguyên
20
Giới thiệu
p Ví dụ 2
n Thuật toán nhân Nga
567 1234
283 2468
141 4936 Ưu điểm: không cần
70 9872 ghi nhớ các kết quả
nhân trung gian, chỉ
35 19744 cần thực hiện phép
17 39488 cộng và chia cho 2
8 78976
4 157952
2 315904
1 631808
699678 21
Giới thiệu
p Ví dụ 2
n Thuật toán nhân « chia để trị »
p Số chữ số của hai số nguyên phải bằng nhau và phải bằng
luỹ thừa 2
§ Nếu số chữ số của hai số nguyên khác nhau thì thêm vào các
số 0 ở bên trái
p Ý tưởng: chúng ta thay phép nhân của hai số nguyên có n
chữ số bởi 4 phép nhân của hai số nguyên có n/2 chữ số.
Tiếp tục, thay phép nhân của hai số nguyên có n/2 chữ số
bởi 4 phép nhân của hai số nguyên có n/4 chữ số, …
p Cần nhân hai số nguyên: a và b. Gọi aL và aR là hai nửa
trái và phải của số a, tương tự bL và bR là hai nửa trái và
phải của b
22
Giới thiệu
p Ví dụ 2
n Thuật toán nhân « chia để trị »
aL aR
* bL bR
aLbR aRbR
+ aLbL aRbL
Đặt: p = aL*bL
q = aR*bR
r = (aL + aR)*(bL + bR)
Khi đó:
a*b = aL*bL*10n + (aL*bR + aR*bL)*10n/2 + aR*bR
= p*10n + (r – p - q)*10n/2 + q
p Số phép nhân sử dụng bởi thuật toán này được đánh giá
là n*m0.59 với n ³ m
p Khi nhân hai số nguyên khá lớn, thuật toán này được
đánh giá nhanh hơn các thuật toán trước
24
Giới thiệu
p Ví dụ 2
n Thuật toán nhân « chia để trị »
0567 * 1234
nhân số bước dịch kết quả
05 12 4 60
05 34 2 170 05 * 34
67 12 2 804 nhân số bước dịch kết quả
67 34 0 2278 0 3 2 0
0 4 1 0
699678 5 3 1 15
5 4 0 20
170
25
Giới thiệu
p Ví dụ 3: tính xn
n Vào: một số nguyên x và một số nguyên
không âm n
n Ra: y = xn
n Thuật toán đơn giản
y=1
for i from 1 to n do
y=y*x
endfor
26
Giới thiệu
p Ví dụ 3: tính xn
n Thuật toán nhị phân
p Giảm số phép toán
p Ý tưởng: sử dụng các kết quả trung gian
p Nguyên tắc: nếu n/2 = 0 thì xn = xn/2 * xn/2 nếu không thì
xn = xn-1 * x
p Chẳng hạn
§ x35 = x34 * x
§ x34 = x17 * x17
§ x17 = x16 * x
§ x16 = x8 * x8
§ x8 = x 4 * x4
§ x4 = x 2 * x2
§ x2 = x * x
27
Giới thiệu
p Ví dụ 3: tính xn
n Thuật toán nhị phân
1. Biểu diễn n bởi dãy nhị phân
2. Thay mỗi bít nhị phân
« 1 » bởi các kí hiệu SX
« 0 » bởi các kí hiệu S
3. Xoá cặp kí hiệu SX bên trái nhất
4. Kết quả: cách tính xn trong đó
S nghĩa là bình phương
X nghĩa là nhân với x
Bắt đầu từ x
28
Giới thiệu
p Ví dụ 3: tính xn
n Thuật toán nhị phân
Biểu diễn n bởi dãy nhị phân: ek-1ek-2…e0
if ek-1 = 0 then
y = 1 // khi n = 0
else
y=x
endif
for i from k-2 to 0 do
y=y*y
if ei = 1 then
y=y*x
endif
endfor
29
Giới thiệu
p Ví dụ 3: tính xn
n Thuật toán nhị phân
p Ví dụ: n = 35 = 100011(2)
ei y số phép nhân
1 x 0
0 x2 1
0 x4 2
0 x8 3
1 x17 5
1 x35 7
30
Giới thiệu
p Ví dụ 3: tính xn
n Thuật toán nhị phân: giải thích
Biểu diễn nhị phân của n: n = åi =0 Ai 2
i p
p
p Giả sử chúng ta đang trong quá trình tính xn. Gọi j là vị trí
bít cuối cùng (trái nhất) biểu diễn n, yj là kết quả cuối
cùng có được. Ban đầu: j = p, yp = x = xAp
p Có hai khả năng của Aj-1
§ Aj-1 = 1. Thay thế Aj-1 bởi SX. Vậy yj-1 = yj2 * x
§ Aj-1 = 0. Thay thế Aj-1 bởi S. Vậy yj-1 = yj2
Cả hai trường hợp: yj-1 = yj2 * xAj-1
p Vậy: yp-1 = yp2 * xAp-1 = (xAp)2 * xAp-1 = x2Ap + Ap-1
p Bằng truy hồi:
i
åip=0 Ai 2
y1 = x = xn
31
Giới thiệu
p Ví dụ 3: tính xn
n Thuật toán nhị phân: có giải pháp tốt hơn ?
p Chẳng hạn tính x15
1. n = 15 = 1111
2. SX SX SX SX
3. SX SX SX
4. Bắt đầu bởi x, chúng ta có: x2, x3, x6, x7, x14, x15
Vậy, chúng ta sử dụng 6 phép nhân
32
Giới thiệu
p Ví dụ 3: tính xn
n Phương pháp ước số
p xn = x nếu n = 1
p xn = xn-1 * x nếu n là số nguyên tố
p xn = (xr)s nếu n = r * s với r là ước số nguyên tố nhỏ nhất
của n và s lớn hơn 1
n Ví dụ: n = 15
p 15 = 3 * 5, khi đó x15 = (x3)5. Áp dụng thuật toán để tính
x3 và c5 với c = x3.
p x3 = x2 * x, áp dụng thuật toán tính x2
p x2 = x * x
p c5 = c4 * c, áp dụng thuật toán tính c4
p c4 = (c2)2
p 2 phép nhân tính c4, 3 phép nhân tính c5, 2 phép nhân tính
x3. Vậy 5 phép nhân tính x15
33
Giới thiệu
p Phân tích và đánh giá các thuật toán
34